diff --git a/.devcontainer/.bashrc b/.devcontainer/.bashrc index 967fa144..9fdb8f69 100644 --- a/.devcontainer/.bashrc +++ b/.devcontainer/.bashrc @@ -6,8 +6,3 @@ fi if [ -f "$WORKSPACE_DIR/zephyr/zephyr-env.sh" ]; then source "$WORKSPACE_DIR/zephyr/zephyr-env.sh" fi - -if [ -d "$WORKSPACE_DIR/tools/bsim" ]; then - export BSIM_OUT_PATH="$WORKSPACE_DIR/tools/bsim/" - export BSIM_COMPONENTS_PATH="$WORKSPACE_DIR/tools/bsim/components/" -fi \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 7e81e779..5b69e180 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/zmkfirmware/zmk-dev-arm:4.1-branch +FROM docker.io/zmkfirmware/zmk-dev-arm:3.2 COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f7dc8251..04a42c4d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -9,18 +9,13 @@ "mounts": [ "type=volume,source=zmk-root-user,target=/root", "type=volume,source=zmk-config,target=/workspaces/zmk-config", - "type=volume,source=zmk-modules,target=/workspaces/zmk-modules", "type=volume,source=zmk-zephyr,target=${containerWorkspaceFolder}/zephyr", "type=volume,source=zmk-zephyr-modules,target=${containerWorkspaceFolder}/modules", "type=volume,source=zmk-zephyr-tools,target=${containerWorkspaceFolder}/tools" ], - "customizations": { - "vscode": { - "extensions": ["ms-vscode.cpptools"], - "settings": { - "terminal.integrated.shell.linux": "/bin/bash" - } - } + "extensions": ["ms-vscode.cpptools"], + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" }, "forwardPorts": [3000] } diff --git a/.github/dependabot.yml b/.github/dependabot.yml index df867347..1df0848c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,50 +8,3 @@ updates: directory: "/docs" schedule: interval: "daily" - groups: - docusaurus-major: - applies-to: "version-updates" - dependency-type: "production" - patterns: - - "@docusaurus/*" - update-types: - - "major" - docusaurus-minor-patch: - applies-to: "version-updates" - dependency-type: "production" - patterns: - - "@docusaurus/*" - update-types: - - "minor" - - "patch" - tree-sitter: - applies-to: "version-updates" - dependency-type: "production" - patterns: - - "tree-sitter-devicetree" - - "web-tree-sitter" - prod-other-major: - applies-to: "version-updates" - dependency-type: "production" - exclude-patterns: - - "@docusaurus/*" - - "tree-sitter-devicetree" - - "web-tree-sitter" - update-types: - - "major" - prod-other-minor-patch: - applies-to: "version-updates" - dependency-type: "production" - exclude-patterns: - - "@docusaurus/*" - - "tree-sitter-devicetree" - - "web-tree-sitter" - update-types: - - "minor" - - "patch" - development: - applies-to: "version-updates" - dependency-type: "development" - update-types: - - "minor" - - "patch" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 147d287c..9e523a36 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,9 +1,15 @@ - + -## PR check-list +## Board/Shield Check-list -- [ ] Branch has a [clean commit history](https://zmk.dev/docs/development/contributing/pull-requests#clean-commit-history) -- [ ] Additional tests are included, if changing behaviors/core code that is testable. +- [ ] This board/shield is tested working on real hardware +- [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) +- [ ] `.zmk.yml` metadata file added - [ ] Proper Copyright + License headers added to applicable files (Generally, we stick to "The ZMK Contributors" for copyrights to help avoid churn when files get edited) -- [ ] [Pre-commit](https://zmk.dev/docs/development/local-toolchain/pre-commit) used to check formatting of files, commit messages, etc. -- [ ] Includes any necessary [documentation changes](https://zmk.dev/docs/development/contributing/documentation). +- [ ] General consistent formatting of DeviceTree files +- [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) +- [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable +- [ ] If split, no name added for the right/peripheral half +- [ ] Kconfig.defconfig file correctly wraps _all_ configuration in conditional on the shield symbol +- [ ] `.conf` file has optional extra features commented out +- [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) diff --git a/.github/workflows/ble-test.yml b/.github/workflows/ble-test.yml deleted file mode 100644 index 68cb1cb3..00000000 --- a/.github/workflows/ble-test.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: BLE Tests - -on: - push: - paths: - - ".github/workflows/ble-test.yml" - - "app/tests/ble/**" - - "app/src/**" - - "app/run-ble-test.sh" - pull_request: - paths: - - ".github/workflows/ble-test.yml" - - "app/tests/ble/**" - - "app/src/**" - - "app/run-ble-test.sh" - -jobs: - collect-tests: - outputs: - test-dirs: ${{ steps.test-dirs.outputs.test-dirs }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v7 - - name: Find test directories - id: test-dirs - run: | - cd app/tests/ble - export TESTS=$(ls -d * | grep -v central | jq -R -s -c 'split("\n")[:-1]') - echo "test-dirs=${TESTS}" > $GITHUB_OUTPUT - run-tests: - needs: collect-tests - strategy: - matrix: - test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} - runs-on: ubuntu-latest - container: - image: docker.io/zmkfirmware/zmk-build-arm:4.1 - steps: - - name: Checkout - uses: actions/checkout@v7 - - name: Cache west modules - uses: actions/cache@v5 - env: - cache-name: cache-zephyr-modules - with: - path: | - modules/ - tools/ - zephyr/ - bootloader/ - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('app/west.yml') }} - restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- - ${{ runner.os }}-build- - ${{ runner.os }}- - timeout-minutes: 2 - continue-on-error: true - - name: Initialize workspace (west init) - run: west init -l app - - name: Enable babblesim group filter - run: west config manifest.group-filter -- +babblesim - - name: Update modules (west update) - run: west update --fetch-opt=--filter=tree:0 - - name: Export Zephyr CMake package (west zephyr-export) - run: west zephyr-export - - name: Build BabbleSim components - working-directory: tools/bsim - run: make everything - - name: Test ${{ matrix.test }} - working-directory: app - run: BSIM_COMPONENTS_PATH="${GITHUB_WORKSPACE}/tools/bsim/components" BSIM_OUT_PATH="${GITHUB_WORKSPACE}/tools/bsim" ./run-ble-test.sh tests/ble/${{ matrix.test }} - - name: Archive artifacts - if: ${{ always() }} - uses: actions/upload-artifact@v7 - with: - name: "${{ matrix.test }}-log-files" - path: app/build/**/*.log diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index f6839819..c1a97b4d 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -26,32 +26,24 @@ on: jobs: matrix: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest name: Fetch Build Keyboards outputs: build_matrix: ${{ env.build_matrix }} - has_valid_build_matrix: ${{ steps.fetch.outputs.has_valid_build_matrix }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v3 + + - name: Install yaml2json + run: python3 -m pip install remarshal - name: Fetch Build Matrix - id: fetch run: | - matrix_content=$(yq -oj -I0 '${{ inputs.build_matrix_path }}') - - if [ -z "$matrix_content" ] || [ "$matrix_content" = "null" ]; then - echo "::notice file=${{inputs.build_matrix_path}},title=Empty build matrix file::To add a keyboard to the build, see https://zmk.dev/docs/user-setup#add-a-keyboard." - echo "has_valid_build_matrix=false" >> $GITHUB_OUTPUT - else - echo "build_matrix=$matrix_content" >> $GITHUB_ENV - echo "has_valid_build_matrix=true" >> $GITHUB_OUTPUT - echo "$matrix_content" - fi + echo "build_matrix=$(yaml2json '${{ inputs.build_matrix_path }}' | jq -c .)" >> $GITHUB_ENV + yaml2json "${{ inputs.build_matrix_path }}" | jq build: runs-on: ubuntu-latest - if: needs.matrix.outputs.has_valid_build_matrix == 'true' container: image: zmkfirmware/zmk-build-arm:stable needs: matrix @@ -60,65 +52,31 @@ jobs: fail-fast: false matrix: ${{ fromJson(needs.matrix.outputs.build_matrix) }} steps: - - name: Act Workaround # https://github.com/nektos/act/issues/973 - if: ${{ env.ACT }} + - name: Prepare variables + shell: sh -x {0} + env: + shield: ${{ matrix.shield }} run: | - apt-get update && apt-get install -y curl unzip - curl -fsSL https://deb.nodesource.com/setup_22.x | bash && apt install -y nodejs + echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV + echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${{ matrix.board }}" >> $GITHUB_ENV + echo "artifact_name=${shield:+$shield-}${{ matrix.board }}-zmk" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v7 - - - name: Create build directory - run: | - echo "build_dir=$(mktemp -d)" >> $GITHUB_ENV - - - name: Prepare variables - shell: bash -x {0} - env: - board: ${{ matrix.board }} - shield: ${{ matrix.shield }} - artifact_name: ${{ matrix.artifact-name }} - snippet: ${{ matrix.snippet }} - run: | - if [ -e zephyr/module.yml ]; then - export zmk_load_arg=" -DZMK_EXTRA_MODULES='${GITHUB_WORKSPACE}'" - new_tmp_dir="${TMPDIR:-/tmp}/zmk-config" - mkdir -p "${new_tmp_dir}" - echo "base_dir=${new_tmp_dir}" >> $GITHUB_ENV - else - echo "base_dir=${GITHUB_WORKSPACE}" >> $GITHUB_ENV - fi - - if [ -n "${snippet}" ]; then - extra_west_args="-S \"${snippet}\"" - fi - - echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV - echo "extra_west_args=${extra_west_args}" >> $GITHUB_ENV - echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}${zmk_load_arg}" >> $GITHUB_ENV - echo "display_name=${shield:+$shield - }${board}" >> $GITHUB_ENV - echo "artifact_name=${artifact_name:-${shield:+$shield-}${board//\//_}-zmk}" >> $GITHUB_ENV - - - name: Copy config files to isolated temporary directory - run: | - if [ "${{ env.base_dir }}" != "${GITHUB_WORKSPACE}" ]; then - mkdir "${{ env.base_dir }}/${{ inputs.config_path }}" - cp -R ${{ inputs.config_path }}/* "${{ env.base_dir }}/${{ inputs.config_path }}/" - fi + uses: actions/checkout@v3 - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v3.0.11 continue-on-error: true env: cache_name: cache-zephyr-${{ env.zephyr_version }}-modules with: path: | - ${{ env.base_dir }}/modules/ - ${{ env.base_dir }}/tools/ - ${{ env.base_dir }}/zephyr/ - ${{ env.base_dir }}/bootloader/ - ${{ env.base_dir }}/zmk/ + modules/ + tools/ + zephyr/ + bootloader/ + zmk/ key: ${{ runner.os }}-build-${{ env.cache_name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache_name }}- @@ -126,66 +84,23 @@ jobs: ${{ runner.os }}- - name: West Init - working-directory: ${{ env.base_dir }} - run: west init -l "${{ env.base_dir }}/${{ inputs.config_path }}" + run: west init -l "${{ inputs.config_path }}" - name: West Update - working-directory: ${{ env.base_dir }} - run: west update --fetch-opt=--filter=tree:0 - - - name: Check ZMK revision - working-directory: ${{ env.base_dir }} - run: | - zmk_revision=$(west list -f "{revision}" zmk) - echo "zmk_revision=${zmk_revision}" >> $GITHUB_ENV - echo "ZMK revision: ${zmk_revision}" + run: west update - name: West Zephyr export - working-directory: ${{ env.base_dir }} run: west zephyr-export - name: West Build (${{ env.display_name }}) - working-directory: ${{ env.base_dir }} shell: sh -x {0} - run: west build -s zmk/app -d "${{ env.build_dir }}" -b "${{ matrix.board }}" ${{ env.extra_west_args }} -- -DZMK_CONFIG=${{ env.base_dir }}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - - - name: Warn about building from main if build fails - if: failure() && env.zmk_revision == 'main' - run: | - echo "# Consider Pinning ZMK" >> $GITHUB_STEP_SUMMARY - echo "Your recent build failure might be the result of breaking changes made to ZMK's main branch." >> $GITHUB_STEP_SUMMARY - echo "Consider [pinning your ZMK version](https://zmk.dev/blog/2025/06/20/pinned-zmk) to a release for increased stability." >> $GITHUB_STEP_SUMMARY - echo "See also the [list of released versions](https://github.com/zmkfirmware/zmk/releases)." >> $GITHUB_STEP_SUMMARY - echo "If you wish to stay on main, check the most recent pending release PR for breaking changes. [Our blog](https://zmk.dev/blog) may have upgrade information if breaking changes are significant." >> $GITHUB_STEP_SUMMARY - - - name: Check if building a board without explicit ZMK compat - if: always() - working-directory: "${{ env.base_dir }}/${{ inputs.config_path }}" - run: | - if ! (grep "CONFIG_ZMK_BOARD_COMPAT=y" "${{ env.build_dir }}/zephyr/.config" > /dev/null) - then - original_board=$(echo "${{ matrix.board }}" | sed -e 's$/.*$$') - west_board=$(west boards --board-root ${{ env.base_dir }}/zmk/app/module --board-root ${{ env.base_dir }}/zmk/app --board "${original_board}") - if [ -z "$west_board" ]; then - echo "Not found the board listed with west boards. Skipping further checking." - exit 0 - fi - - west boards --board-root ${{ env.base_dir }}/zmk/app/module --board-root ${{ env.base_dir }}/zmk/app --board "${original_board}" --format "{qualifiers}" | grep "zmk" > /dev/null - if [ $? -ne 0 ] - then - echo "::warning file=build/zephyr/.config,title=Missing ZMK Compat::The selected board does not report explicit ZMK compat. Please verify you've selected the correct board and ZMK variant if one exists" - else - echo "::error file=build/zephyr/.config,title=Missing ZMK Compat::The selected board is not set up for ZMK and there is a ZMK variant available. See https://zmk.dev/blog/2025/12/09/zephyr-4-1#zmk-board-variant." - exit 1 - fi - fi + run: west build -s zmk/app -b "${{ matrix.board }}" -- -DZMK_CONFIG="${GITHUB_WORKSPACE}/${{ inputs.config_path }}" ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file run: | - if [ -f "${{ env.build_dir }}/zephyr/.config" ] + if [ -f build/zephyr/.config ] then - grep -v -e "^#" -e "^$" "${{ env.build_dir }}/zephyr/.config" | sort + grep -v -e "^#" -e "^$" build/zephyr/.config | sort else echo "No Kconfig output" fi @@ -193,12 +108,12 @@ jobs: - name: ${{ env.display_name }} Devicetree file run: | - if [ -f "${{ env.build_dir }}/zephyr/zephyr.dts" ] + if [ -f build/zephyr/zephyr.dts ] then - cat "${{ env.build_dir }}/zephyr/zephyr.dts" - elif [ -f "${{ env.build_dir }}/zephyr/zephyr.dts.pre" ] + cat build/zephyr/zephyr.dts + elif [ -f build/zephyr/zephyr.dts.pre ] then - cat -s "${{ env.build_dir }}/zephyr/zephyr.dts.pre" + cat -s build/zephyr/zephyr.dts.pre else echo "No Devicetree output" fi @@ -207,30 +122,17 @@ jobs: - name: Rename artifacts shell: sh -x {0} run: | - mkdir "${{ env.build_dir }}/artifacts" - if [ -f "${{ env.build_dir }}/zephyr/zmk.uf2" ] + mkdir build/artifacts + if [ -f build/zephyr/zmk.uf2 ] then - cp "${{ env.build_dir }}/zephyr/zmk.uf2" "${{ env.build_dir }}/artifacts/${{ env.artifact_name }}.uf2" - elif [ -f "${{ env.build_dir }}/zephyr/zmk.${{ inputs.fallback_binary }}" ] + cp build/zephyr/zmk.uf2 "build/artifacts/${{ env.artifact_name }}.uf2" + elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp "${{ env.build_dir }}/zephyr/zmk.${{ inputs.fallback_binary }}" "${{ env.build_dir }}/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" + cp "build/zephyr/zmk.${{ inputs.fallback_binary }}" "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" fi - name: Archive (${{ env.display_name }}) - uses: actions/upload-artifact@v7 - with: - name: artifact-${{ env.artifact_name }} - path: ${{ env.build_dir }}/artifacts - - merge: - runs-on: ubuntu-latest - if: needs.matrix.outputs.has_valid_build_matrix == 'true' - needs: build - name: Merge Output Artifacts - steps: - - name: Merge Artifacts - uses: actions/upload-artifact/merge@v7 + uses: actions/upload-artifact@v3 with: name: ${{ inputs.archive_name }} - pattern: artifact-* - delete-merged: true + path: build/artifacts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d2a5805..82b156e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,29 +12,21 @@ on: schedule: - cron: "22 4 * * *" -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'schedule' }} - cancel-in-progress: true - -permissions: {} - jobs: build: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:4.1 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 needs: compile-matrix strategy: matrix: include: ${{ fromJSON(needs.compile-matrix.outputs.include-list) }} steps: - name: Checkout - uses: actions/checkout@v7 - with: - persist-credentials: false + uses: actions/checkout@v3 - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v3.0.2 env: cache-name: cache-zephyr-modules with: @@ -53,21 +45,23 @@ jobs: - name: Initialize workspace (west init) run: west init -l app - name: Update modules (west update) - run: west update --fetch-opt=--filter=tree:0 + run: west update - name: Export Zephyr CMake package (west zephyr-export) run: west zephyr-export - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v2 with: node-version: "14.x" - name: Install @actions/artifact - run: npm install @actions/artifact@5.0.3 - - name: Build - uses: actions/github-script@v9 + run: npm install @actions/artifact + - name: Build and upload artifacts + uses: actions/github-script@v4 id: boards-list with: script: | const fs = require('fs'); + const artifact = require('@actions/artifact'); + const artifactClient = artifact.create(); const execSync = require('child_process').execSync; @@ -77,39 +71,10 @@ jobs: for (const shieldArgs of buildShieldArgs) { try { + const output = execSync(`west build -s app -p -b ${{ matrix.board }} -- ${shieldArgs.shield ? '-DSHIELD="' + shieldArgs.shield + '"' : ''} ${shieldArgs['cmake-args'] || ''}`); + console.log(`::group::${{ matrix.board}} ${shieldArgs.shield} Build`) - - const output = execSync(`west build -s app -p -b ${{ matrix.board }} ${shieldArgs.snippet ? '-S ' + shieldArgs.snippet : ''} -- ${shieldArgs.shield ? '-DSHIELD="' + shieldArgs.shield + '"' : ''} ${shieldArgs['cmake-args'] || ''}`); - console.log(output.toString()); - } catch (e) { - console.error(`::error::Failed to build ${{ matrix.board }} ${shieldArgs.shield} ${shieldArgs['cmake-args']}`); - console.error(e); - error = true; - } finally { - console.log('::endgroup::'); - } - } - - if (error) { - throw new Error('Failed to build one or more configurations'); - } - - name: Upload artifacts - uses: actions/github-script@v9 - continue-on-error: ${{ github.event_name == 'pull_request' }} - id: boards-upload - with: - script: | - const fs = require('fs'); - const {default: artifact} = require('@actions/artifact'); - - const buildShieldArgs = JSON.parse(`${{ matrix.shieldArgs }}`); - - let error = false; - - for (const shieldArgs of buildShieldArgs) { - try { - console.log(`::group::${{ matrix.board}} ${shieldArgs.shield} Upload`) const fileExtensions = ["hex", "uf2"]; @@ -123,11 +88,11 @@ jobs: } const cmakeName = shieldArgs['cmake-args'] ? '-' + (shieldArgs.nickname || shieldArgs['cmake-args'].split(' ').join('')) : ''; - const artifactName = `${{ matrix.board }}${shieldArgs.shield ? '-' + shieldArgs.shield : ''}${cmakeName}-zmk`.replaceAll('/', '_'); + const artifactName = `${{ matrix.board }}${shieldArgs.shield ? '-' + shieldArgs.shield : ''}${cmakeName}-zmk`; - await artifact.uploadArtifact(artifactName, files, rootDirectory, options); + await artifactClient.uploadArtifact(artifactName, files, rootDirectory, options); } catch (e) { - console.error(`::error::Failed to upload ${{ matrix.board }} ${shieldArgs.shield} ${shieldArgs['cmake-args']}`); + console.error(`::error::Failed to build or upload ${{ matrix.board }} ${shieldArgs.shield} ${shieldArgs['cmake-args']}`); console.error(e); error = true; } finally { @@ -139,14 +104,14 @@ jobs: throw new Error('Failed to build one or more configurations'); } compile-matrix: - if: ${{ !cancelled() }} + if: ${{ always() }} runs-on: ubuntu-latest needs: [core-coverage, board-changes, nightly] outputs: include-list: ${{ steps.compile-list.outputs.result }} steps: - name: Join build lists - uses: actions/github-script@v9 + uses: actions/github-script@v4 id: compile-list with: script: | @@ -170,7 +135,6 @@ jobs: perBoard[configuration.board].push({ shield: configuration.shield, 'cmake-args': configuration['cmake-args'], - snippet: configuration.snippet, nickname: configuration.nickname }) } @@ -187,16 +151,14 @@ jobs: core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 - with: - persist-credentials: false + uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v2 with: node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - - uses: actions/github-script@v9 + - uses: actions/github-script@v4 id: core-list with: script: | @@ -218,14 +180,14 @@ jobs: boards-include: ${{ steps.boards-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v2 with: node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - - uses: actions/github-script@v9 + - uses: actions/github-script@v4 id: boards-list with: script: | @@ -277,7 +239,6 @@ jobs: ); } else { console.error("Board without keys or interconnect"); - return []; } break; case "shield": @@ -296,14 +257,14 @@ jobs: }); }))).flat(); nightly: - if: ${{ github.event_name == 'schedule' && github.repository_owner == 'zmkfirmware' }} + if: ${{ github.event_name == 'schedule' }} runs-on: ubuntu-latest needs: get-grouped-hardware outputs: nightly-include: ${{ steps.nightly-list.outputs.result }} steps: - name: Create nightly list - uses: actions/github-script@v9 + uses: actions/github-script@v4 id: nightly-list with: script: | @@ -346,17 +307,15 @@ jobs: organized-metadata: ${{ steps.organize-metadata.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 - with: - persist-credentials: false + uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v2 with: node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - name: Aggregate Metadata - uses: actions/github-script@v9 + uses: actions/github-script@v4 id: aggregate-metadata with: script: | @@ -374,7 +333,7 @@ jobs: result-encoding: string - name: Organize Metadata - uses: actions/github-script@v9 + uses: actions/github-script@v4 id: organize-metadata with: script: | @@ -423,32 +382,27 @@ jobs: if: ${{ github.event_name != 'schedule' }} runs-on: ubuntu-latest outputs: - changed-files: ${{ steps.changed-files.outputs.all_changed_files }} + changed-files: ${{ steps.changed-files.outputs.all }} board-changes: ${{ steps.board-changes.outputs.result }} core-changes: ${{ steps.core-changes.outputs.result }} steps: - - name: Checkout - uses: actions/checkout@v7 - with: - persist-credentials: false - - uses: tj-actions/changed-files@9200e69727eb73eb060652b19946b8a2fdfb654b # pin to v45.0.8 due to https://github.com/tj-actions/changed-files/issues/2463 https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised + - uses: Ana06/get-changed-files@v2.0.0 id: changed-files with: - json: true - escape_json: false - - uses: actions/github-script@v9 + format: "json" + - uses: actions/github-script@v4 id: board-changes with: script: | - const changedFiles = JSON.parse(`${{ steps.changed-files.outputs.all_changed_files }}`); + const changedFiles = JSON.parse(`${{ steps.changed-files.outputs.all }}`); const boardChanges = changedFiles.filter(f => f.startsWith('app/boards')); return boardChanges.length ? 'true' : 'false'; result-encoding: string - - uses: actions/github-script@v9 + - uses: actions/github-script@v4 id: core-changes with: script: | - const changedFiles = JSON.parse(`${{ steps.changed-files.outputs.all_changed_files }}`); + const changedFiles = JSON.parse(`${{ steps.changed-files.outputs.all }}`); const boardChanges = changedFiles.filter(f => f.startsWith('app/boards')); const appChanges = changedFiles.filter(f => f.startsWith('app')); const ymlChanges = changedFiles.includes('.github/workflows/build.yml'); diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index a562ed39..91e65e6d 100644 --- a/.github/workflows/doc-checks.yml +++ b/.github/workflows/doc-checks.yml @@ -14,7 +14,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs @@ -24,7 +24,7 @@ jobs: typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 406a1e63..10092836 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -18,11 +18,11 @@ jobs: validate-metadata: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-dev-arm:4.1 + image: docker.io/zmkfirmware/zmk-dev-arm:3.2 steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@v3 - name: Install dependencies - run: pip install --break-system-packages -r app/scripts/requirements.txt + run: pip install -r app/scripts/requirements.txt - name: West init run: west init -l app - name: Update modules (west update) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 52b82a62..a6583d4f 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -8,8 +8,8 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7 - - uses: actions/setup-python@v6 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 with: python-version: 3.x - - uses: pre-commit/action@v3.0.1 + - uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index 5735eea7..00000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,80 +0,0 @@ -on: - push: - branches: - - main - - "v*.*-branch" - -permissions: - contents: write - pull-requests: write - -name: release-please - -jobs: - handle-commit: - name: Handle new commit - runs-on: ubuntu-latest - outputs: - release_created: ${{ steps.release.outputs.release_created }} - major: ${{ steps.release.outputs.major }} - minor: ${{ steps.release.outputs.minor }} - patch: ${{ steps.release.outputs.patch }} - steps: - - uses: googleapis/release-please-action@v5 - id: release - with: - token: ${{ secrets.ZMK_RELEASE_PLEASE_TOKEN }} - target-branch: ${{ github.ref_name }} - - release-new-version: - name: Release new version - needs: handle-commit - runs-on: ubuntu-latest - if: ${{ needs.handle-commit.outputs.release_created }} - env: - ZMK_RELEASE_PLEASE_TOKEN: ${{ secrets.ZMK_RELEASE_PLEASE_TOKEN }} - VERSION: v${{ needs.handle-commit.outputs.major }}.${{ needs.handle-commit.outputs.minor }} - steps: - - uses: actions/checkout@v7 - - - name: Create major.minor branch - if: ${{ needs.handle-commit.outputs.patch == '0' }} - run: | - git remote add gh-token-branch "https://x-access-token:$ZMK_RELEASE_PLEASE_TOKEN@github.com/${{ github.repository }}.git" - git checkout -b $VERSION-branch - git push gh-token-branch $VERSION-branch - - - name: tag major and minor versions - run: | - git config user.name github-actions[bot] - git config user.email 41898282+github-actions[bot]@users.noreply.github.com - git remote add gh-token "https://x-access-token:$ZMK_RELEASE_PLEASE_TOKEN@github.com/${{ github.repository }}.git" - git tag -d $VERSION || true - git tag -a $VERSION -m "Release $VERSION" - git push --force gh-token $VERSION - - bump-user-config-template-version: - name: Bump user config template version - needs: handle-commit - runs-on: ubuntu-latest - if: ${{ needs.handle-commit.outputs.release_created }} - env: - ZMK_RELEASE_PLEASE_TOKEN: ${{ secrets.ZMK_RELEASE_PLEASE_TOKEN }} - VERSION: v${{ needs.handle-commit.outputs.major }}.${{ needs.handle-commit.outputs.minor }} - steps: - - name: Bump user config template - run: | - if [ -z "$VERSION" ]; then - echo "VERSION is not set, exiting." - exit 1 - fi - - git clone "https://x-access-token:$ZMK_RELEASE_PLEASE_TOKEN@github.com/zmkfirmware/unified-zmk-config-template.git" - cd unified-zmk-config-template - git config user.name github-actions[bot] - git config user.email 41898282+github-actions[bot]@users.noreply.github.com - sed -i 's/^\(\s*\)revision: .*/\1revision: '"$VERSION"'/' config/west.yml - sed -i 's|uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@.*|uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@'"$VERSION"'|' .github/workflows/build.yml - git add . - git commit -m "Version bump to $VERSION" - git push origin main diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index 475a37db..00000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: "Mark and close stale PRs in the repo" -on: - schedule: - - cron: "00 14 * * *" # runs daily at 14:00 https://crontab.guru/#00_14_*_*_* - -jobs: - stale: - runs-on: ubuntu-24.04 - steps: - - uses: actions/stale@v10.3.0 - with: - days-before-pr-stale: 300 # ~10 months - stale-pr-label: "stale" - stale-pr-message: > - This PR has been automatically marked as stale because it has not - had activity in 10 months. It will be closed in 14 days if no - further activity occurs. Feel free to give a status update or - re-open when it has been rebased and is ready for review (again). - Thanks! - days-before-pr-close: 14 - close-pr-message: > - This PR was closed because it had no activity for over 10 months. - Feel free to give a status update or re-open when it has been - rebased and is ready for review (again). - days-before-issue-stale: 1000 # ~3 years - days-before-issue-close: -1 - ascending: true # Process older PRs first - operations-per-run: 30 # Default value, listed here again to make it explicit diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 20bebf3b..e8a9d220 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,17 +4,13 @@ on: push: paths: - ".github/workflows/test.yml" - - "app/run-test.sh" - "app/tests/**" - "app/src/**" - - "app/include/**" pull_request: paths: - ".github/workflows/test.yml" - - "app/run-test.sh" - "app/tests/**" - "app/src/**" - - "app/include/**" jobs: collect-tests: @@ -23,13 +19,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v3 - name: Find test directories id: test-dirs run: | cd app/tests/ - export TESTS=$(ls -d * | grep -v ble | jq -R -s -c 'split("\n")[:-1]') - echo "test-dirs=${TESTS}" >> $GITHUB_OUTPUT + export TESTS=$(ls -d * | jq -R -s -c 'split("\n")[:-1]') + echo "::set-output name=test-dirs::${TESTS}" run-tests: needs: collect-tests strategy: @@ -37,12 +33,12 @@ jobs: test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:4.1 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v3 - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v3.0.2 env: cache-name: cache-zephyr-modules with: @@ -61,15 +57,15 @@ jobs: - name: Initialize workspace (west init) run: west init -l app - name: Update modules (west update) - run: west update --fetch-opt=--filter=tree:0 + run: west update - name: Export Zephyr CMake package (west zephyr-export) run: west zephyr-export - name: Test ${{ matrix.test }} working-directory: app - run: ZMK_TESTS_VERBOSE=1 west test tests/${{ matrix.test }} + run: west test tests/${{ matrix.test }} - name: Archive artifacts if: ${{ always() }} - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@v2 with: - name: "${{ matrix.test }}-log-files" + name: "log-files" path: app/build/**/*.log diff --git a/.gitignore b/.gitignore index 50b8f687..93c801d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,9 @@ /.west /bootloader /modules -/optional /tools /zephyr /zmk-config /build - -# macOS *.DS_Store - -# Python -__pycache__ -.python-version -.venv - -# clangd -app/.cache/ +__pycache__ \ No newline at end of file diff --git a/.gitlint b/.gitlint deleted file mode 100644 index f5ed1479..00000000 --- a/.gitlint +++ /dev/null @@ -1,138 +0,0 @@ -# Edit this file as you like. -# -# All these sections are optional. Each section with the exception of [general] represents -# one rule and each key in it is an option for that specific rule. -# -# Rules and sections can be referenced by their full name or by id. For example -# section "[body-max-line-length]" could also be written as "[B1]". Full section names are -# used in here for clarity. -# -[general] -# Ignore certain rules, this example uses both full name and id -# ignore=title-trailing-punctuation, T3 - -# verbosity should be a value between 1 and 3, the commandline -v flags take precedence over this -# verbosity = 2 - -# By default gitlint will ignore merge, revert, fixup, fixup=amend, and squash commits. -# ignore-merge-commits=true -# ignore-revert-commits=true -# ignore-fixup-commits=true -# ignore-fixup-amend-commits=true -# ignore-squash-commits=true - -# Ignore any data sent to gitlint via stdin -# ignore-stdin=true - -# Fetch additional meta-data from the local repository when manually passing a -# commit message to gitlint via stdin or --commit-msg. Disabled by default. -# staged=true - -# Hard fail when the target commit range is empty. Note that gitlint will -# already fail by default on invalid commit ranges. This option is specifically -# to tell gitlint to fail on *valid but empty* commit ranges. -# Disabled by default. -# fail-without-commits=true - -# Whether to use Python `search` instead of `match` semantics in rules that use -# regexes. Context: https://github.com/jorisroovers/gitlint/issues/254 -# Disabled by default, but will be enabled by default in the future. -# regex-style-search=true - -# Enable debug mode (prints more output). Disabled by default. -# debug=true - -# Enable community contributed rules -# See http://jorisroovers.github.io/gitlint/contrib_rules for details -contrib=contrib-title-conventional-commits,CT1,contrib-disallow-cleanup-commits,CC2 - -# Set the extra-path where gitlint will search for user defined rules -# See http://jorisroovers.github.io/gitlint/user_defined_rules for details -# extra-path=examples/ - -[title-max-length] -line-length=80 - -# Conversely, you can also enforce minimal length of a title with the -# "title-min-length" rule: -# [title-min-length] -# min-length=5 - -# [title-must-not-contain-word] -# Comma-separated list of words that should not occur in the title. Matching is case -# insensitive. It's fine if the keyword occurs as part of a larger word (so "WIPING" -# will not cause a violation, but "WIP: my title" will. -# words=wip - -# [title-match-regex] -# python-style regex that the commit-msg title must match -# Note that the regex can contradict with other rules if not used correctly -# (e.g. title-must-not-contain-word). -# regex=^US[0-9]* - -# [body-max-line-length] -# line-length=72 - -# [body-min-length] -# min-length=5 - -# [body-is-missing] -# Whether to ignore this rule on merge commits (which typically only have a title) -# default = True -# ignore-merge-commits=false - -# [body-changed-file-mention] -# List of files that need to be explicitly mentioned in the body when they are changed -# This is useful for when developers often erroneously edit certain files or git submodules. -# By specifying this rule, developers can only change the file when they explicitly reference -# it in the commit message. -# files=gitlint-core/gitlint/rules.py,README.md - -# [body-match-regex] -# python-style regex that the commit-msg body must match. -# E.g. body must end in My-Commit-Tag: foo -# regex=My-Commit-Tag: foo$ - -# [author-valid-email] -# python-style regex that the commit author email address must match. -# For example, use the following regex if you only want to allow email addresses from foo.com -# regex=[^@]+@foo.com - -# [ignore-by-title] -# Ignore certain rules for commits of which the title matches a regex -# E.g. Match commit titles that start with "Release" -# regex=^Release(.*) - -# Ignore certain rules, you can reference them by their id or by their full name -# Use 'all' to ignore all rules -# ignore=T1,body-min-length - -# [ignore-by-body] -# Ignore certain rules for commits of which the body has a line that matches a regex -# E.g. Match bodies that have a line that that contain "release" -# regex=(.*)release(.*) -# -# Ignore certain rules, you can reference them by their id or by their full name -# Use 'all' to ignore all rules -# ignore=T1,body-min-length - -# [ignore-body-lines] -# Ignore certain lines in a commit body that match a regex. -# E.g. Ignore all lines that start with 'Co-Authored-By' -# regex=^Co-Authored-By - -# [ignore-by-author-name] -# Ignore certain rules for commits of which the author name matches a regex -# E.g. Match commits made by dependabot -# regex=(.*)dependabot(.*) -# -# Ignore certain rules, you can reference them by their id or by their full name -# Use 'all' to ignore all rules -# ignore=T1,body-min-length - -# This is a contrib rule - a community contributed rule. These are disabled by default. -# You need to explicitly enable them one-by-one by adding them to the "contrib" option -# under [general] section above. -# [contrib-title-conventional-commits] -# Specify allowed commit types. For details see: https://www.conventionalcommits.org/ -# types = bugfix,user-story,epic diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f5a93ba8..e0666ea8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,28 +4,20 @@ repos: rev: v1.5.1 hooks: - id: remove-tabs - exclude: "vendor-prefixes\\.txt$|.git/COMMIT_EDITMSG" - - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v18.1.8 + exclude: "vendor-prefixes\\.txt$" + - repo: https://github.com/pocc/pre-commit-hooks + rev: v1.3.5 hooks: - id: clang-format - types_or: [c++, c] args: - -i - - repo: https://github.com/rbubley/mirrors-prettier - rev: 787fb9f542b140ba0b2aced38e6a3e68021647a3 + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.7.1 hooks: - id: prettier - exclude: | - (?x)^( - .git/COMMIT_EDITMSG| - CHANGELOG.md| - .release-please-manifest.json - )$ - - repo: https://github.com/jorisroovers/gitlint - rev: v0.19.1 - hooks: - - id: gitlint + # Workaround for https://github.com/pre-commit/mirrors-prettier/issues/29 + additional_dependencies: + - prettier@2.8.7 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: diff --git a/.release-please-manifest.json b/.release-please-manifest.json deleted file mode 100644 index 1c861e15..00000000 --- a/.release-please-manifest.json +++ /dev/null @@ -1 +0,0 @@ -{".":"0.3.0"} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8f93d216..0819f71e 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,11 +1,9 @@ { "recommendations": [ "esbenp.prettier-vscode", - "ms-python.black-formatter", "ms-python.python", "ms-vscode.cpptools", "plorefice.devicetree", - "twxs.cmake", - "unifiedjs.vscode-mdx" + "twxs.cmake" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 83fb7ae3..924d83b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,7 @@ "*.overlay": "dts", "*.keymap": "dts" }, - "python.analysis.include": ["app/scripts", "zephyr/scripts"], + "python.formatting.provider": "black", "[c]": { "editor.formatOnSave": true }, @@ -13,7 +13,7 @@ }, "[python]": { "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-python.black-formatter" + "editor.defaultFormatter": "ms-python.python" }, "[css][json][jsonc][html][markdown][yaml]": { "editor.formatOnSave": true, diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 9e6c9ade..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,116 +0,0 @@ -# Changelog - -## [0.3.0](https://github.com/zmkfirmware/zmk/compare/v0.2.1...v0.3.0) (2025-08-01) - - -### Features - -* **ble:** Add function to get profile address by index ([#2992](https://github.com/zmkfirmware/zmk/issues/2992)) ([9e905d6](https://github.com/zmkfirmware/zmk/commit/9e905d65936348824588dc3f424755353ac61186)) -* **ci:** Add stale GitHub Action to automatically close stale PRs ([#2924](https://github.com/zmkfirmware/zmk/issues/2924)) ([6d7bbc8](https://github.com/zmkfirmware/zmk/commit/6d7bbc8670d175fd63e8c834feb41f80e7b52e74)) -* **display:** nice!view individual profile status ([#2265](https://github.com/zmkfirmware/zmk/issues/2265)) ([d09087f](https://github.com/zmkfirmware/zmk/commit/d09087f4dc280b8fdb1d32d63b03cc10162b89ce)) -* Full-Duplex Wired Split ([#2766](https://github.com/zmkfirmware/zmk/issues/2766)) ([147c340](https://github.com/zmkfirmware/zmk/commit/147c340c6e8d377304acfdd64dc86cf83ebdfef2)) -* **metadata:** Add metadata to the mouse_key_press behavior ([#2950](https://github.com/zmkfirmware/zmk/issues/2950)) ([239baa4](https://github.com/zmkfirmware/zmk/commit/239baa487509ace108d36f0e5c627d61a3d95f53)) -* **pointing:** Allow peripheral input processing to stop propagation ([#2844](https://github.com/zmkfirmware/zmk/issues/2844)) ([462d48b](https://github.com/zmkfirmware/zmk/commit/462d48b78edac8bedb75666699ea4fa446d2152c)) -* **shield:** Add underglow for reviung5 ([#2191](https://github.com/zmkfirmware/zmk/issues/2191)) ([ad6a181](https://github.com/zmkfirmware/zmk/commit/ad6a181d7ec34fb6e31134f6bb991a9b2d0b8f78)) -* **shields:** Add a physical layout for a_dux ([#3000](https://github.com/zmkfirmware/zmk/issues/3000)) ([7292df0](https://github.com/zmkfirmware/zmk/commit/7292df02d4b05d783f432f8658de22d940909fe4)) -* **shields:** Add physical layouts for tester_xiao and tester_pro_micro ([#2852](https://github.com/zmkfirmware/zmk/issues/2852)) ([eb170c9](https://github.com/zmkfirmware/zmk/commit/eb170c930f56e3fb3df0b813d987abfd1dc31b9a)) -* **shields:** Add tester_pro_micro layouts ([eb170c9](https://github.com/zmkfirmware/zmk/commit/eb170c930f56e3fb3df0b813d987abfd1dc31b9a)) -* **shields:** Add tester_xiao layouts ([eb170c9](https://github.com/zmkfirmware/zmk/commit/eb170c930f56e3fb3df0b813d987abfd1dc31b9a)) -* **split:** Add full-duplex wired split support ([147c340](https://github.com/zmkfirmware/zmk/commit/147c340c6e8d377304acfdd64dc86cf83ebdfef2)) -* **split:** Runtime selection of split transport ([6b44d33](https://github.com/zmkfirmware/zmk/commit/6b44d33db2f4bad7d98e475e6f7968493b05af73)) -* **split:** Runtime selection of split transport ([#2886](https://github.com/zmkfirmware/zmk/issues/2886)) ([6b44d33](https://github.com/zmkfirmware/zmk/commit/6b44d33db2f4bad7d98e475e6f7968493b05af73)) -* **split:** Suspend/resume wired UART devices. ([6b44d33](https://github.com/zmkfirmware/zmk/commit/6b44d33db2f4bad7d98e475e6f7968493b05af73)) - - -### Bug Fixes - -* **behaviors:** Correct macro release state for parametrized ([1bac680](https://github.com/zmkfirmware/zmk/commit/1bac680c4fb4f07e43c01754b6f1e72dab455e50)) -* **behaviors:** Correct macro release state for parametrized macros ([#2942](https://github.com/zmkfirmware/zmk/issues/2942)) ([1bac680](https://github.com/zmkfirmware/zmk/commit/1bac680c4fb4f07e43c01754b6f1e72dab455e50)) -* **ble,hid:** Fix smooth scrolling over BLE ([#2998](https://github.com/zmkfirmware/zmk/issues/2998)) ([342d838](https://github.com/zmkfirmware/zmk/commit/342d83891301b1be53233a12c7723bb99cbe5ff6)), closes [#2957](https://github.com/zmkfirmware/zmk/issues/2957) -* **boards:** Disable high voltage DC-DC by default ([#2995](https://github.com/zmkfirmware/zmk/issues/2995)) ([8059e67](https://github.com/zmkfirmware/zmk/commit/8059e671b24a261939401afb5a65c4fa756adc2d)), closes [#2990](https://github.com/zmkfirmware/zmk/issues/2990) -* changed shebang to make scripts more platform independent ([#2893](https://github.com/zmkfirmware/zmk/issues/2893)) ([84772eb](https://github.com/zmkfirmware/zmk/commit/84772ebf14e5a7c67ba573a61f0a50048802c799)) -* **ci:** pin tj-actions/changed-files due to compromise ([#2874](https://github.com/zmkfirmware/zmk/issues/2874)) ([4da89bd](https://github.com/zmkfirmware/zmk/commit/4da89bd99716bf6c1d7d788f3cdaec4cee7403e9)) -* **combos:** Properly clean up all old candidates. ([#2928](https://github.com/zmkfirmware/zmk/issues/2928)) ([e3030bf](https://github.com/zmkfirmware/zmk/commit/e3030bfcc87b7f511b0ebe993fb1f1f06215982e)) -* **combos:** Restore prompts for two deprecated Kconfigs ([#2926](https://github.com/zmkfirmware/zmk/issues/2926)) ([00ff486](https://github.com/zmkfirmware/zmk/commit/00ff48693113ed74a3345aa1ac81fdea302b3a09)) -* **core:** Correctly sync BAS battery level ([#2977](https://github.com/zmkfirmware/zmk/issues/2977)) ([af96766](https://github.com/zmkfirmware/zmk/commit/af967667b0e139a963178e63028c7be341cade9e)) -* **display:** Make stock battery widget depend on the right symbol ([#2953](https://github.com/zmkfirmware/zmk/issues/2953)) ([9da5d3b](https://github.com/zmkfirmware/zmk/commit/9da5d3ba82b38b74ad798a82a838d84c52220bbe)) -* **docs:** Fix soft off waker configuration example ([#2960](https://github.com/zmkfirmware/zmk/issues/2960)) ([eb99b4e](https://github.com/zmkfirmware/zmk/commit/eb99b4ede06bc01674ce16217ebbad40bc11ec50)) -* **docs:** remove title as alt text ([#2922](https://github.com/zmkfirmware/zmk/issues/2922)) ([d9576c5](https://github.com/zmkfirmware/zmk/commit/d9576c55346acfc8eed36709aaae28f91e0d06ad)) -* Fix build with Studio and USB but not UART ([#2996](https://github.com/zmkfirmware/zmk/issues/2996)) ([cef7af4](https://github.com/zmkfirmware/zmk/commit/cef7af4408cc44c20fab93a0b2e20b3429d0a98e)) -* **hid:** Fix scroll value truncation ([#2865](https://github.com/zmkfirmware/zmk/issues/2865)) ([2c0e7da](https://github.com/zmkfirmware/zmk/commit/2c0e7daced1421c34a9d417b7d3e9bccbf0ebd7f)), closes [#2864](https://github.com/zmkfirmware/zmk/issues/2864) -* **pointing:** Avoids mutex leak for default layer toggle event ([#2934](https://github.com/zmkfirmware/zmk/issues/2934)) ([461f5c8](https://github.com/zmkfirmware/zmk/commit/461f5c832fb8854d87dca54d113d306323697219)) -* Properly override stack size on RP2040 ([147c340](https://github.com/zmkfirmware/zmk/commit/147c340c6e8d377304acfdd64dc86cf83ebdfef2)) -* **split:** add source to battery event ([#2901](https://github.com/zmkfirmware/zmk/issues/2901)) ([6f85f48](https://github.com/zmkfirmware/zmk/commit/6f85f48b19afae04f98e9abacb36ce1425b61f78)) -* **split:** Compile and run properly in wired polling mode. ([#3012](https://github.com/zmkfirmware/zmk/issues/3012)) ([2ae5185](https://github.com/zmkfirmware/zmk/commit/2ae51854192aed92af95536f79547e2928cd1bf5)) -* **split:** Conditionally build all split code ([#2884](https://github.com/zmkfirmware/zmk/issues/2884)) ([5bb39ec](https://github.com/zmkfirmware/zmk/commit/5bb39ec3eae23055593350cb3689a8240028181e)) -* **split:** Enable wired split by default if DTS is set ([#3010](https://github.com/zmkfirmware/zmk/issues/3010)) ([1530ae3](https://github.com/zmkfirmware/zmk/commit/1530ae36c22e3e2285e895737c74de5d960a5ae4)) -* **split:** Minor wired split fixes. ([6b44d33](https://github.com/zmkfirmware/zmk/commit/6b44d33db2f4bad7d98e475e6f7968493b05af73)) -* Unconditionally define HID payloads to avoid error. ([6b44d33](https://github.com/zmkfirmware/zmk/commit/6b44d33db2f4bad7d98e475e6f7968493b05af73)) - -## [0.2.1](https://github.com/zmkfirmware/zmk/compare/v0.2.0...v0.2.1) (2025-03-02) - - -### Bug Fixes - -* **behaviors:** Proper comma separated device list ([#2850](https://github.com/zmkfirmware/zmk/issues/2850)) ([f20e6ea](https://github.com/zmkfirmware/zmk/commit/f20e6ea7594b49eef1e3acc017529073a0409962)) - -## [0.2.0](https://github.com/zmkfirmware/zmk/compare/v0.1.0...v0.2.0) (2025-03-01) - - -### Features - -* Added `toggle-mode`, allowing toggle-on and toggle-off ([#2555](https://github.com/zmkfirmware/zmk/issues/2555)) ([4ef231f](https://github.com/zmkfirmware/zmk/commit/4ef231f4bba87151acfbd1cf3babd83b69813e45)) -* added toggle mode to key and layer toggles ([4ef231f](https://github.com/zmkfirmware/zmk/commit/4ef231f4bba87151acfbd1cf3babd83b69813e45)) -* **boards:** Update for mikoto board definition ([#1946](https://github.com/zmkfirmware/zmk/issues/1946)) ([b26058b](https://github.com/zmkfirmware/zmk/commit/b26058b6c7c83f8d1f095d2f9c6c3998b391a61b)) -* **core:** Make physical layout key rotation optional ([#2770](https://github.com/zmkfirmware/zmk/issues/2770)) ([c367d8f](https://github.com/zmkfirmware/zmk/commit/c367d8f636f0842b414c2b58df6101761cdd676d)) -* **display:** Add ability to set display on/off pin. ([#2814](https://github.com/zmkfirmware/zmk/issues/2814)) ([627e6db](https://github.com/zmkfirmware/zmk/commit/627e6dbec99211b3d7cce55904fb1c824ed87bf3)) -* **display:** Add config for display update period ([#2819](https://github.com/zmkfirmware/zmk/issues/2819)) ([aa3e5dd](https://github.com/zmkfirmware/zmk/commit/aa3e5dd70fdd1b364fa9ad26f14425be613d180c)) -* input processor behavior invocation ([#2714](https://github.com/zmkfirmware/zmk/issues/2714)) ([cb867f9](https://github.com/zmkfirmware/zmk/commit/cb867f92dbe4e32675c2137fc6aa914a44ecc8dc)) -* **Kconfig:** Allow overriding ZMK Kconfig defaults ([#2537](https://github.com/zmkfirmware/zmk/issues/2537)) ([40925d4](https://github.com/zmkfirmware/zmk/commit/40925d48e67b3eeaeb3e848a2287ed628de9f674)) -* **mouse:** Add mouse move and scroll support ([#2477](https://github.com/zmkfirmware/zmk/issues/2477)) ([6b40bfd](https://github.com/zmkfirmware/zmk/commit/6b40bfda53571f7a960ccc448aa87f29da7496ac)) -* **pointing:** Add behavior input processor ([cb867f9](https://github.com/zmkfirmware/zmk/commit/cb867f92dbe4e32675c2137fc6aa914a44ecc8dc)) -* **pointing:** Add pre-defined scroll scaler ([0f7c112](https://github.com/zmkfirmware/zmk/commit/0f7c11248a1ddb7c6559064c2a1e7a3c446d5d55)) -* **pointing:** Add pre-defined scroll scaler and mouse scroll tests ([#2759](https://github.com/zmkfirmware/zmk/issues/2759)) ([0f7c112](https://github.com/zmkfirmware/zmk/commit/0f7c11248a1ddb7c6559064c2a1e7a3c446d5d55)) -* **shields:** Add physical layout for Lotus58 ([#2753](https://github.com/zmkfirmware/zmk/issues/2753)) ([424e532](https://github.com/zmkfirmware/zmk/commit/424e53210ea16c2287abaf770ebf45be432d841a)) -* **studio:** Add ortho_4x10 grid layout ([#2651](https://github.com/zmkfirmware/zmk/issues/2651)) ([7e8c542](https://github.com/zmkfirmware/zmk/commit/7e8c542c94908ac011ec7272a5f8ab10d2102632)) - - -### Bug Fixes - -* allow kscan-composite to wake up device. ([#2682](https://github.com/zmkfirmware/zmk/issues/2682)) ([a8f5ab6](https://github.com/zmkfirmware/zmk/commit/a8f5ab67b5d449a2624e2de7ddfb264da778ea6c)) -* **behaviors:** Make multiple sticky keys work on same key position ([7186528](https://github.com/zmkfirmware/zmk/commit/7186528f77bf077173927c1c8506b4d434e5c371)) -* **behaviors:** Make multiple sticky keys work on same key position ([#2758](https://github.com/zmkfirmware/zmk/issues/2758)) ([7186528](https://github.com/zmkfirmware/zmk/commit/7186528f77bf077173927c1c8506b4d434e5c371)) -* **ble:** enforce maximum length for dynamic device name ([#2784](https://github.com/zmkfirmware/zmk/issues/2784)) ([ea267b0](https://github.com/zmkfirmware/zmk/commit/ea267b0f35f862b882ac568dde6365c3a0c85099)) -* **combos:** Properly report combos len with emply block ([#2739](https://github.com/zmkfirmware/zmk/issues/2739)) ([f0a77b8](https://github.com/zmkfirmware/zmk/commit/f0a77b888ac482a863386ced08e04660ddacb026)) -* **display:** Only default mono theme when 1bpp ([#2804](https://github.com/zmkfirmware/zmk/issues/2804)) ([425256b](https://github.com/zmkfirmware/zmk/commit/425256bc0de7ed08802533b170abba78ee90f546)) -* **display:** POSIX lvgl fixes ([#2812](https://github.com/zmkfirmware/zmk/issues/2812)) ([4b4a8a3](https://github.com/zmkfirmware/zmk/commit/4b4a8a35f3f90f1af75cdf5d9c26b47d4b8dcabb)) -* **drivers:** Proper static/const for data/config ([#2769](https://github.com/zmkfirmware/zmk/issues/2769)) ([6941abc](https://github.com/zmkfirmware/zmk/commit/6941abc2afab16502cff9c5149d8dc0fcd5112c9)) -* Fix warnings in nanopb encoding code ([#2643](https://github.com/zmkfirmware/zmk/issues/2643)) ([7013158](https://github.com/zmkfirmware/zmk/commit/7013158a6715d94b34e8c471ce25bb5005f3bb49)) -* Kconfig refactor now works correctly with external modules ([#2711](https://github.com/zmkfirmware/zmk/issues/2711)) ([bb48661](https://github.com/zmkfirmware/zmk/commit/bb486619a183f6df7fbb4620c80164555a22da0b)) -* **Kconfig:** Added a name to EC11's trigger mode choice ([40925d4](https://github.com/zmkfirmware/zmk/commit/40925d48e67b3eeaeb3e848a2287ed628de9f674)) -* **kscan:** Remove warning when keyboard is built without CONFIG_PM_DEVICE ([#2808](https://github.com/zmkfirmware/zmk/issues/2808)) ([8e065d5](https://github.com/zmkfirmware/zmk/commit/8e065d55b916481ef06ce37cddedb84cf1d15d99)) -* **pointing:** Complete header rename missed in refactor ([#2702](https://github.com/zmkfirmware/zmk/issues/2702)) ([84baf92](https://github.com/zmkfirmware/zmk/commit/84baf929c9bb95f255d4bafd0e57f2ec47455fca)) -* **pointing:** Temp layer threading protection. ([#2729](https://github.com/zmkfirmware/zmk/issues/2729)) ([1e3e62c](https://github.com/zmkfirmware/zmk/commit/1e3e62c13d0666d98831ee302ae2fb17e68196c9)) -* **studio:** Allow adding layers after a layer move ([#2748](https://github.com/zmkfirmware/zmk/issues/2748)) ([36508c2](https://github.com/zmkfirmware/zmk/commit/36508c27fddfb84d912e0122e313ad3904ceb946)) -* **studio:** Properly return complete keymap from RPC ([#2696](https://github.com/zmkfirmware/zmk/issues/2696)) ([0820991](https://github.com/zmkfirmware/zmk/commit/0820991901a95ab7a0eb1f1cc608a631d514e26c)) - -## 0.1.0 (2024-11-29) - - -### Features - -* **boards:** Add glove80 nexus node for extension GPIO. ([#2594](https://github.com/zmkfirmware/zmk/issues/2594)) ([fb359f5](https://github.com/zmkfirmware/zmk/commit/fb359f576619940164ca2e770b49b7b34f13428e)) -* **boards:** add nrf52833-nosd snippet ([63af296](https://github.com/zmkfirmware/zmk/commit/63af296b6efd8d677d584f372c9da9a4fedaa496)) -* **boards:** add nrf52840-nosd snippet ([4438b7b](https://github.com/zmkfirmware/zmk/commit/4438b7b835bfd1d4e89cdd955a4ab0fd2e2ae3bf)) -* **ci:** Add release-please automation with VERSION ([#2622](https://github.com/zmkfirmware/zmk/issues/2622)) ([ffa485c](https://github.com/zmkfirmware/zmk/commit/ffa485c11b48444acf3adf1e3c1cb3eed16fad94)) -* **drivers:** Support init high/low in 595 driver ([888c0d9](https://github.com/zmkfirmware/zmk/commit/888c0d966cd52f3ab5145992f61b14d6262c1951)) - - -### Bug Fixes - -* **boards:** Disable uart serial node in Xiao BLE by default ([#2672](https://github.com/zmkfirmware/zmk/issues/2672)) ([230b860](https://github.com/zmkfirmware/zmk/commit/230b860f31063774c3bcc19afb6f92479462de24)) -* **boards:** Fix typo in BT75 metadata ([c9553c3](https://github.com/zmkfirmware/zmk/commit/c9553c31e3a3f39964391b006492995b5bb09c39)) -* Disable display feature for settings_reset ([b0f5789](https://github.com/zmkfirmware/zmk/commit/b0f5789b128f0f5599341398898fdb0e0407b2d3)) -* Fix inconsistent column offset property ([c7473fc](https://github.com/zmkfirmware/zmk/commit/c7473fc32557d2d384ab78d3acf51a05488f0214)) -* include a header file for RC macros ([#2649](https://github.com/zmkfirmware/zmk/issues/2649)) ([f8eff2f](https://github.com/zmkfirmware/zmk/commit/f8eff2fe34609c91211c25113f9d7db09f7d1689)) -* **studio:** Improved error message when keyboard is missing a physical layout. ([fed66a9](https://github.com/zmkfirmware/zmk/commit/fed66a92d000f4c8e0019d9ccdd167271324e8e9)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bcc2aef1..fe7292a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -86,12 +86,6 @@ documentation to areas not currently covered are greatly appreciated. ZMK uses `prettier` to format documentation files. You can run prettier with `npm run prettier:format`. You can setup git to run prettier automatically when you commit by installing the pre-commit hooks: `pip3 install pre-commit`, `pre-commit install`. -### Linting - -This repository utilizes ESLint for code linting to ensure consistent code style and identify potential errors or bugs early in the development process. - -You can run ESLint with `npm run lint` to verify your changes. - ## Code Contributions ### Development Setup diff --git a/app/.prettierrc.js b/app/.prettierrc.js index 2a60b0bd..2a1f0b48 100644 --- a/app/.prettierrc.js +++ b/app/.prettierrc.js @@ -1,4 +1,3 @@ module.exports = { endOfLine: "auto", - trailingComma: "es5", }; diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index c41153cb..793f386d 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -2,40 +2,32 @@ cmake_minimum_required(VERSION 3.13.1) set(CONFIG_APPLICATION_DEFINED_SYSCALL true) -set(ZEPHYR_BOARD_ALIASES "boards/aliases.cmake") -set(ZEPHYR_EXTRA_MODULES "${ZMK_EXTRA_MODULES};${CMAKE_CURRENT_SOURCE_DIR}/module;${CMAKE_CURRENT_SOURCE_DIR}/keymap-module") +# Add our custom Zephyr module for drivers w/ syscalls, etc. +list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR}/drivers/zephyr) + +set(ZephyrBuildConfiguration_ROOT ${CMAKE_SOURCE_DIR}/cmake) + +list(APPEND ZEPHYR_EXTRA_MODULES + ${CMAKE_CURRENT_SOURCE_DIR}/module +) # Find Zephyr. This also loads Zephyr's build system. find_package(Zephyr REQUIRED HINTS ../zephyr) project(zmk) -zephyr_linker_sources(SECTIONS include/linker/zmk-behaviors.ld) zephyr_linker_sources(RODATA include/linker/zmk-events.ld) -if(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS) - zephyr_linker_sources(DATA_SECTIONS include/linker/zmk-behavior-local-id-map.ld) -endif() - -zephyr_syscall_header(${APPLICATION_SOURCE_DIR}/include/drivers/behavior.h) -zephyr_syscall_header(${APPLICATION_SOURCE_DIR}/include/drivers/input_processor.h) -zephyr_syscall_header(${APPLICATION_SOURCE_DIR}/include/drivers/ext_power.h) - # Add your source file to the "app" target. This must come after # find_package(Zephyr) which defines the target. target_include_directories(app PRIVATE include) -add_subdirectory(src/boot) target_sources(app PRIVATE src/stdlib.c) target_sources(app PRIVATE src/activity.c) -target_sources(app PRIVATE src/behavior.c) -target_sources_ifdef(CONFIG_ZMK_KSCAN_SIDEBAND_BEHAVIORS app PRIVATE src/kscan_sideband_behaviors.c) +target_sources(app PRIVATE src/kscan.c) target_sources(app PRIVATE src/matrix_transform.c) -target_sources(app PRIVATE src/physical_layouts.c) target_sources(app PRIVATE src/sensors.c) target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/wpm.c) target_sources(app PRIVATE src/event_manager.c) -target_sources_ifdef(CONFIG_ZMK_PM app PRIVATE src/pm.c) target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/ext_power_generic.c) -target_sources_ifdef(CONFIG_ZMK_GPIO_KEY_WAKEUP_TRIGGER app PRIVATE src/gpio_key_wakeup_trigger.c) target_sources(app PRIVATE src/events/activity_state_changed.c) target_sources(app PRIVATE src/events/position_state_changed.c) target_sources(app PRIVATE src/events/sensor_event.c) @@ -43,14 +35,12 @@ target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/events/wpm_state_changed.c) target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/events/usb_conn_state_changed.c) target_sources(app PRIVATE src/behaviors/behavior_reset.c) target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/behaviors/behavior_ext_power.c) -target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SOFT_OFF app PRIVATE src/behaviors/behavior_soft_off.c) -add_subdirectory_ifdef(CONFIG_ZMK_POINTING src/pointing/) if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/hid.c) target_sources(app PRIVATE src/behaviors/behavior_key_press.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_TOGGLE app PRIVATE src/behaviors/behavior_key_toggle.c) - target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_HOLD_TAP app PRIVATE src/behaviors/behavior_hold_tap.c) - target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_STICKY_KEY app PRIVATE src/behaviors/behavior_sticky_key.c) + target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c) + target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c) @@ -64,11 +54,8 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c) - target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOUSE_KEY_PRESS app PRIVATE src/behaviors/behavior_mouse_key_press.c) - target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_STUDIO_UNLOCK app PRIVATE src/behaviors/behavior_studio_unlock.c) - target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_INPUT_TWO_AXIS app PRIVATE src/behaviors/behavior_input_two_axis.c) target_sources(app PRIVATE src/combo.c) - target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TAP_DANCE app PRIVATE src/behaviors/behavior_tap_dance.c) + target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) target_sources(app PRIVATE src/conditional_layer.c) target_sources(app PRIVATE src/endpoints.c) @@ -78,7 +65,6 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/events/layer_state_changed.c) target_sources(app PRIVATE src/events/modifiers_state_changed.c) target_sources(app PRIVATE src/events/keycode_state_changed.c) - target_sources_ifdef(CONFIG_ZMK_HID_INDICATORS app PRIVATE src/hid_indicators.c) if (CONFIG_ZMK_BLE) target_sources(app PRIVATE src/events/ble_active_profile_changed.c) @@ -94,43 +80,16 @@ target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/behaviors/behavior_bac target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/events/battery_state_changed.c) target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/battery.c) -target_sources_ifdef(CONFIG_ZMK_HID_INDICATORS app PRIVATE src/events/hid_indicators_changed.c) -add_subdirectory_ifdef(CONFIG_ZMK_HID_INDICATORS src/indicators) - target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_status_changed.c) -add_subdirectory_ifdef(CONFIG_ZMK_SPLIT src/split) +add_subdirectory(src/split) target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c) target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c) target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c) -target_sources_ifdef(CONFIG_ZMK_LOW_PRIORITY_WORK_QUEUE app PRIVATE src/workqueue.c) +target_sources(app PRIVATE src/workqueue.c) target_sources(app PRIVATE src/main.c) add_subdirectory(src/display/) -add_subdirectory_ifdef(CONFIG_SETTINGS src/settings/) - -if (CONFIG_ZMK_STUDIO_RPC) - # For some reason this is failing if run from a different sub-file. - list(APPEND CMAKE_MODULE_PATH ${ZEPHYR_BASE}/modules/nanopb) - - include(nanopb) - - # Turn off the default nanopb behavior - set(NANOPB_GENERATE_CPP_STANDALONE OFF) - - nanopb_generate_cpp(proto_srcs proto_hdrs RELPATH ${ZEPHYR_ZMK_STUDIO_MESSAGES_MODULE_DIR} - ${ZEPHYR_ZMK_STUDIO_MESSAGES_MODULE_DIR}/proto/zmk/studio.proto - ${ZEPHYR_ZMK_STUDIO_MESSAGES_MODULE_DIR}/proto/zmk/meta.proto - ${ZEPHYR_ZMK_STUDIO_MESSAGES_MODULE_DIR}/proto/zmk/core.proto - ${ZEPHYR_ZMK_STUDIO_MESSAGES_MODULE_DIR}/proto/zmk/behaviors.proto - ${ZEPHYR_ZMK_STUDIO_MESSAGES_MODULE_DIR}/proto/zmk/keymap.proto - ) - - target_include_directories(app PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) - target_sources(app PRIVATE ${proto_srcs} ${proto_hdrs}) - - add_subdirectory(src/studio) -endif() zephyr_cc_option(-Wfatal-errors) diff --git a/app/Kconfig b/app/Kconfig index 8c0675e0..282339e3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -5,17 +5,6 @@ mainmenu "ZMK Firmware" menu "ZMK" -config ZMK_BOARD_COMPAT - bool - help - Hidden symbol used to hint that a board has been specifically - set up with various ZMK requirements in mind, e.g. settings - storage, bootloader integration, etc. - - Failure to set this will warn users they may want to verify they - used a ZMK variant of an upstream board, or are using a board - properly migrated to a newer ZMK version. - menu "Basic Keyboard Setup" config ZMK_KEYBOARD_NAME @@ -42,23 +31,12 @@ config BT_DIS_PNP_VID config BT_DIS_PNP_PID default 0x615E -config BT_DIS_MODEL_NUMBER_STR +config BT_DIS_MODEL default ZMK_KEYBOARD_NAME -config BT_DIS_MANUF_NAME_STR +config BT_DIS_MANUF default "ZMK Project" -# Hardware specific overrides - -if SOC_SERIES_NRF52X - -# Default on for our usage until boards implement retained bootmode. -config NRF_STORE_REBOOT_TYPE_GPREGRET - bool - default y - -endif # SOC_SERIES_NRF52X - menu "HID" choice ZMK_HID_REPORT_TYPE @@ -75,28 +53,22 @@ config ZMK_HID_REPORT_TYPE_NKRO help Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard from working with some BIOS/UEFI versions that only support "boot keyboard" support. - This option also prevents using some infrequently used higher range HID usages (notably F13-F24 and INTL1-9) - These usages can be re enabled with ZMK_HID_KEYBOARD_NKRO_EXTENDED_REPORT. + This option also prevents using some infrequently used higher range HID usages. endchoice -config ZMK_HID_KEYBOARD_NKRO_EXTENDED_REPORT - bool "Enable extended NKRO reporting" - depends on ZMK_HID_REPORT_TYPE_NKRO - help - Enables higher usage range for NKRO (F13-F24 and INTL1-9). - Please note this is not compatible with Android currently and you will get no input - - if ZMK_HID_REPORT_TYPE_HKRO config ZMK_HID_KEYBOARD_REPORT_SIZE int "# Keyboard Keys Reportable" + default 6 -endif # ZMK_HID_REPORT_TYPE_HKRO +endif config ZMK_HID_CONSUMER_REPORT_SIZE int "# Consumer Keys Reportable" + default 6 + choice ZMK_HID_CONSUMER_REPORT_USAGES prompt "HID Report Type" @@ -115,20 +87,6 @@ config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC endchoice -config ZMK_HID_INDICATORS - bool "HID Indicators" - help - Enable HID indicators, used for detecting state of Caps/Scroll/Num Lock, - Kata, and Compose. - -rsource "src/indicators/Kconfig" - -config ZMK_HID_SEPARATE_MOD_RELEASE_REPORT - bool "Release Modifiers Separately" - help - Send a separate release event for the modifiers, to make sure the release - of the modifier doesn't get recognized before the actual key's release event. - menu "Output Types" config ZMK_USB @@ -140,11 +98,10 @@ config ZMK_USB config ZMK_USB_BOOT bool "USB Boot Protocol Support" + default y depends on ZMK_USB select USB_HID_BOOT_PROTOCOL - -config USB_DEVICE_INITIALIZE_AT_BOOT - default n + select USB_DEVICE_SOF if ZMK_USB @@ -154,7 +111,8 @@ config USB_NUMOF_EP_WRITE_RETRIES config USB_HID_POLL_INTERVAL_MS default 1 -endif # ZMK_USB +#ZMK_USB +endif menuconfig ZMK_BLE bool "BLE (HID over GATT)" @@ -164,41 +122,24 @@ menuconfig ZMK_BLE select BT_SMP_APP_PAIRING_ACCEPT select BT_PERIPHERAL select BT_DIS - imply BT_DEVICE_NAME_DYNAMIC - imply BT_SETTINGS if !ARCH_POSIX - imply SETTINGS if !ARCH_POSIX - imply ZMK_BATTERY_REPORTING if !ARCH_POSIX + select BT_SETTINGS + select SETTINGS + imply ZMK_BATTERY_REPORTING if ZMK_BLE -config ZMK_BLE_EXPERIMENTAL_CONN - bool "Experimental BLE connection changes" - help - Enables settings that are planned to be default in future versions of ZMK - to improve connection stability. +# BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY when using HCI +config BT_TINYCRYPT_ECC + default y if BT_HCI && !BT_CTLR -config ZMK_BLE_EXPERIMENTAL_SEC - bool "Experimental BLE security changes" - imply BT_SMP_ALLOW_UNAUTH_OVERWRITE - help - Enables security settings that are planned to be officially supported in the future. +choice BT_LL_SW_LLCP_IMPL + default BT_LL_SW_LLCP_LEGACY -config ZMK_BLE_EXPERIMENTAL_FEATURES - bool "Experimental BLE connection and security settings/features" - select ZMK_BLE_EXPERIMENTAL_CONN - select ZMK_BLE_EXPERIMENTAL_SEC - help - Enables experimental connection changes and security features. +endchoice -config ZMK_BLE_PASSKEY_ENTRY - bool "Require passkey entry on the keyboard to complete pairing" - select RING_BUFFER - -config BT_SMP_ALLOW_UNAUTH_OVERWRITE - imply ZMK_BLE_PASSKEY_ENTRY - -config BT_CTLR_PHY_2M - default n if ZMK_BLE_EXPERIMENTAL_CONN +config SYSTEM_WORKQUEUE_STACK_SIZE + default 4096 if SOC_RP2040 + default 2048 config ZMK_BLE_THREAD_STACK_SIZE int "BLE notify thread stack size" @@ -216,19 +157,24 @@ config ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE int "Max number of consumer HID reports to queue for sending over BLE" default 5 -config ZMK_BLE_MOUSE_REPORT_QUEUE_SIZE - int "Max number of mouse HID reports to queue for sending over BLE" - default 20 - config ZMK_BLE_CLEAR_BONDS_ON_START bool "Configuration that clears all bond information from the keyboard on startup." + default n # HID GATT notifications sent this way are *not* picked up by Linux, and possibly others. config BT_GATT_NOTIFY_MULTIPLE default n config BT_GATT_AUTO_SEC_REQ - default (ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL) + default n + +config BT_DEVICE_APPEARANCE + default 961 + +config ZMK_BLE_PASSKEY_ENTRY + bool "Require passkey entry on the keyboard to complete pairing" + default n + select RING_BUFFER config BT_PERIPHERAL_PREF_MIN_INT default 6 @@ -242,99 +188,91 @@ config BT_PERIPHERAL_PREF_LATENCY config BT_PERIPHERAL_PREF_TIMEOUT default 400 -# The device name should be 16 characters or less so it fits within the -# advertising data. -config BT_DEVICE_NAME_MAX - default 16 +#ZMK_BLE +endif -endif # ZMK_BLE +#Output Types +endmenu -endmenu # Output Types - -endmenu # HID +# HID +endmenu rsource "src/split/Kconfig" -endmenu # Basic Keyboard Setup - -menu "Keymaps" - -config ZMK_KEYMAP_LAYER_REORDERING - bool "Layer Reordering Support" - -config ZMK_KEYMAP_SETTINGS_STORAGE - bool "Settings Save/Load" - depends on SETTINGS - depends on ZMK_BEHAVIOR_LOCAL_IDS - -if ZMK_KEYMAP_SETTINGS_STORAGE - -config ZMK_KEYMAP_LAYER_NAME_MAX_LEN - int "Max Layer Name Length" - default 20 - -endif # ZMK_KEYMAP_SETTINGS_STORAGE - -endmenu # Keymaps - -rsource "src/studio/Kconfig" +#Basic Keyboard Setup +endmenu menu "Display/LED Options" rsource "src/display/Kconfig" menuconfig ZMK_RGB_UNDERGLOW - bool "RGB Addressable LED Underglow" + bool "RGB Adressable LED Underglow" select LED_STRIP - select ZMK_LOW_PRIORITY_WORK_QUEUE if ZMK_RGB_UNDERGLOW +# This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this +config SPI + default y + config ZMK_RGB_UNDERGLOW_EXT_POWER bool "RGB underglow toggling also controls external power" + default y config ZMK_RGB_UNDERGLOW_BRT_MIN int "RGB underglow minimum brightness in percent" range 0 100 + default 0 config ZMK_RGB_UNDERGLOW_BRT_MAX int "RGB underglow maximum brightness in percent" range ZMK_RGB_UNDERGLOW_BRT_MIN 100 + default 100 config ZMK_RGB_UNDERGLOW_HUE_STEP int "RGB underglow hue step in degrees" range 0 359 + default 10 config ZMK_RGB_UNDERGLOW_SAT_STEP int "RGB underglow saturation step in percent" range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_BRT_STEP int "RGB underglow brightness step in percent" range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_HUE_START int "RGB underglow start hue value in degrees" range 0 359 + default 0 config ZMK_RGB_UNDERGLOW_SAT_START int "RGB underglow start saturations value in percent" range 0 100 + default 100 config ZMK_RGB_UNDERGLOW_BRT_START int "RGB underglow start brightness value in percent" range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX + default ZMK_RGB_UNDERGLOW_BRT_MAX config ZMK_RGB_UNDERGLOW_SPD_START int "RGB underglow start animation speed value" range 1 5 + default 3 config ZMK_RGB_UNDERGLOW_EFF_START int "RGB underglow start effect int value related to the effect enum list" range 0 3 + default 0 config ZMK_RGB_UNDERGLOW_ON_START bool "RGB underglow starts on by default" + default y config ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE bool "Turn off RGB underglow when keyboard goes into idle state" @@ -343,7 +281,8 @@ config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB bool "Turn off RGB underglow when USB is disconnected" depends on USB_DEVICE_STACK -endif # ZMK_RGB_UNDERGLOW +#ZMK_RGB_UNDERGLOW +endif menuconfig ZMK_BACKLIGHT bool "LED backlight" @@ -354,13 +293,16 @@ if ZMK_BACKLIGHT config ZMK_BACKLIGHT_BRT_STEP int "Brightness step in percent" range 1 100 + default 20 config ZMK_BACKLIGHT_BRT_START int "Default brightness in percent" range 1 100 + default 40 config ZMK_BACKLIGHT_ON_START bool "Default backlight state" + default y config ZMK_BACKLIGHT_AUTO_OFF_IDLE bool "Turn off backlight when keyboard goes into idle state" @@ -368,34 +310,19 @@ config ZMK_BACKLIGHT_AUTO_OFF_IDLE config ZMK_BACKLIGHT_AUTO_OFF_USB bool "Turn off backlight when USB is disconnected" -endif # ZMK_BACKLIGHT +#ZMK_BACKLIGHT +endif -endmenu # Display/LED Options - -rsource "src/pointing/Kconfig" +#Display/LED Options +endmenu menu "Power Management" config ZMK_BATTERY_REPORTING bool "Battery level detection/reporting" + default n select SENSOR - select ZMK_LOW_PRIORITY_WORK_QUEUE - imply BT_BAS if ZMK_BLE - -if ZMK_BATTERY_REPORTING - -choice ZMK_BATTERY_REPORTING_FETCH_MODE - prompt "Battery Reporting Fetch Mode" - -config ZMK_BATTERY_REPORTING_FETCH_MODE_STATE_OF_CHARGE - bool "State of charge" - -config ZMK_BATTERY_REPORTING_FETCH_MODE_LITHIUM_VOLTAGE - bool "Lithium Voltage" - -endchoice - -endif # ZMK_BATTERY_REPORTING + select BT_BAS if ZMK_BLE config ZMK_IDLE_TIMEOUT int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" @@ -403,9 +330,6 @@ config ZMK_IDLE_TIMEOUT config ZMK_SLEEP bool "Enable deep sleep support" - depends on HAS_POWEROFF - select POWEROFF - select ZMK_PM_DEVICE_SUSPEND_RESUME imply USB if ZMK_SLEEP @@ -417,32 +341,14 @@ config ZMK_IDLE_SLEEP_TIMEOUT int "Milliseconds of inactivity before entering deep sleep" default 900000 -endif # ZMK_SLEEP +#ZMK_SLEEP +endif config ZMK_EXT_POWER bool "Enable support to control external power output" - -config ZMK_PM - bool - -config ZMK_PM_DEVICE_SUSPEND_RESUME - bool - select ZMK_PM - -config ZMK_PM_SOFT_OFF - bool "Soft-off support" - depends on HAS_POWEROFF - select ZMK_PM - select PM_DEVICE - select ZMK_PM_DEVICE_SUSPEND_RESUME - select POWEROFF - -config ZMK_GPIO_KEY_WAKEUP_TRIGGER - bool "Hardware supported wakeup (GPIO)" default y - depends on DT_HAS_ZMK_GPIO_KEY_WAKEUP_TRIGGER_ENABLED && ZMK_PM_SOFT_OFF -# Power Management +#Power Management endmenu menu "Combo options" @@ -452,18 +358,14 @@ config ZMK_COMBO_MAX_PRESSED_COMBOS default 4 config ZMK_COMBO_MAX_COMBOS_PER_KEY - int "Deprecated: Max combos per key" - default 0 - help - Deprecated: Storage for combos is now determined automatically + int "Maximum number of combos per key" + default 5 config ZMK_COMBO_MAX_KEYS_PER_COMBO - int "Deprecated: Max keys per combo" - default 0 - help - Deprecated: This is now auto-calculated based on `key-positions` in devicetree + int "Maximum number of keys per combo" + default 4 -# Combo options +#Combo options endmenu menu "Behavior Options" @@ -486,21 +388,16 @@ endmenu menu "Advanced" -rsource "src/boot/Kconfig" - menu "Initialization Priorities" if USB_DEVICE_STACK config ZMK_USB_INIT_PRIORITY int "USB Init Priority" - default 96 + default 50 -config ZMK_USB_HID_INIT_PRIORITY - int "USB HID Init Priority" - default 95 - -endif # USB +#USB +endif if ZMK_BLE || ZMK_SPLIT_BLE @@ -508,13 +405,11 @@ config ZMK_BLE_INIT_PRIORITY int "BLE Init Priority" default 50 -endif # ZMK_BLE || ZMK_SPLIT_BLE +#ZMK_BLE || ZMK_SPLIT_BLE +endif -endmenu # Initialization Priorities - -config ZMK_PHYSICAL_LAYOUT_KEY_ROTATION - bool "Support rotation of keys in physical layouts" - default y +#Initialization Priorities +endmenu menuconfig ZMK_KSCAN bool "ZMK KScan Integration" @@ -529,21 +424,6 @@ config ZMK_KSCAN_EVENT_QUEUE_SIZE endif # ZMK_KSCAN -config ZMK_KSCAN_SIDEBAND_BEHAVIORS - bool - default y - depends on DT_HAS_ZMK_KSCAN_SIDEBAND_BEHAVIORS_ENABLED - select KSCAN - -if ZMK_KSCAN_SIDEBAND_BEHAVIORS - -config ZMK_KSCAN_SIDEBAND_BEHAVIORS_INIT_PRIORITY - int "Keyboard scan sideband behaviors driver init priority" - # The default kscan init priority is 90, so be sure we are initialized later. - default 95 - -endif # ZMK_KSCAN_SIDEBAND_BEHAVIORS - menu "Logging" config ZMK_LOGGING_MINIMAL @@ -588,7 +468,8 @@ config USB_CDC_ACM_RINGBUF_SIZE config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 -endif # ZMK_USB_LOGGING +#ZMK_USB_LOGGING +endif config ZMK_RTT_LOGGING bool "Enable RTT logging to help debug" @@ -604,7 +485,8 @@ if ZMK_RTT_LOGGING config SEGGER_RTT_BUFFER_SIZE_UP default 8192 -endif # ZMK_RTT_LOGGING +#ZMK_RTT_LOGGING +endif if ZMK_USB_LOGGING || ZMK_RTT_LOGGING @@ -614,40 +496,25 @@ config LOG_BUFFER_SIZE config LOG_PROCESS_THREAD_SLEEP_MS default 100 -endif # ZMK_USB_LOGGING || ZMK_RTT_LOGGING +#ZMK_USB_LOGGING || ZMK_RTT_LOGGING +endif -endmenu # Logging +#Logging +endmenu if SETTINGS -config ZMK_SETTINGS_RESET_ON_START - bool "Delete all persistent settings when the keyboard boots" - -if ZMK_SETTINGS_RESET_ON_START - -config ZMK_SETTINGS_RESET_ON_START_INIT_PRIORITY - int "Settings Reset ON Start Initialization Priority" - default 60 - help - Initialization priority for the settings reset on start. Must be lower priority/ - higher value than FLASH_INIT_PRIORITY if using the NVS/Flash settings backend. - -endif # ZMK_SETTINGS_RESET_ON_START - config ZMK_SETTINGS_SAVE_DEBOUNCE int "Milliseconds to debounce settings saves" default 60000 -endif # SETTINGS +#SETTINGS +endif config ZMK_BATTERY_REPORT_INTERVAL depends on ZMK_BATTERY_REPORTING int "Battery level report interval in seconds" - -config ZMK_LOW_PRIORITY_WORK_QUEUE - bool "Work queue for low priority items" - -if ZMK_LOW_PRIORITY_WORK_QUEUE + default 60 config ZMK_LOW_PRIORITY_THREAD_STACK_SIZE int "Low priority thread stack size" @@ -657,18 +524,14 @@ config ZMK_LOW_PRIORITY_THREAD_PRIORITY int "Low priority thread priority" default 10 -endif # ZMK_LOW_PRIORITY_WORK_QUEUE +#Advanced +endmenu -endmenu # Advanced +#ZMK +endmenu -endmenu # ZMK - -if SOC_FAMILY_NORDIC_NRF - -config NRF_SOC_VALIDATE_HEADERS_DISABLED - default y - -endif +config HEAP_MEM_POOL_SIZE + default 8192 config KERNEL_BIN_NAME default "zmk" @@ -679,11 +542,9 @@ config REBOOT config USB_DEVICE_STACK default y if HAS_HW_NRF_USBD -config FPU - default CPU_HAS_FPU - config ZMK_WPM bool "Calculate WPM" + default n config ZMK_KEYMAP_SENSORS bool "Enable Keymap Sensors support" @@ -704,24 +565,21 @@ config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION endif # ZMK_KEYMAP_SENSORS +choice CBPRINTF_IMPLEMENTATION + default CBPRINTF_NANO + +endchoice + module = ZMK module-str = zmk source "subsys/logging/Kconfig.template.log_config" -# This loads ZMK's internal board and shield Kconfigs rsource "boards/Kconfig" rsource "boards/shields/*/Kconfig.defconfig" rsource "boards/shields/*/Kconfig.shield" -# This loads custom shields defconfigs (from BOARD_ROOT) -# Duplicated from Kconfig.zephyr -osource "$(KCONFIG_BINARY_DIR)/Kconfig.shield.defconfig" - -# This loads board and shield Kconfigs found under zmk-config/config/ osource "$(ZMK_CONFIG)/boards/shields/*/Kconfig.defconfig" osource "$(ZMK_CONFIG)/boards/shields/*/Kconfig.shield" -# This loads ZMK's sensible defaults -rsource "Kconfig.defaults" source "Kconfig.zephyr" diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors index da9bcc41..9e4a82b0 100644 --- a/app/Kconfig.behaviors +++ b/app/Kconfig.behaviors @@ -1,117 +1,15 @@ # Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT -config ZMK_BEHAVIOR_METADATA - bool "Metadata" - help - Enabling this option adds APIs for documenting and fetching - metadata describing a behaviors name, and supported parameters. - -config ZMK_BEHAVIOR_LOCAL_IDS - bool "Local IDs" - -if ZMK_BEHAVIOR_LOCAL_IDS - -config ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS - bool "Track in behavior bindings" - -choice ZMK_BEHAVIOR_LOCAL_ID_TYPE - prompt "Local ID Type" - -config ZMK_BEHAVIOR_LOCAL_ID_TYPE_SETTINGS_TABLE - bool "Settings Table" - depends on SETTINGS - select ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS - help - Use persistent entries in the settings subsystem to identify - behaviors by local ID, which uses the device name to generate - a new settings entry tying a presistant local ID to that name. - This guarantees stable, colllision-free local IDs at the expense - of settings storage used. - -config ZMK_BEHAVIOR_LOCAL_ID_TYPE_CRC16 - bool "CRC16 Hash" - select CRC - help - Use the CRC16-ANSI hash of behavior device names to generate - stable behavior local IDs. This saves on settings storage at - the expense of (highly unlikely) risk of collisions. - -endchoice - -endif - - -config ZMK_BEHAVIOR_HOLD_TAP - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_HOLD_TAP_ENABLED - -if ZMK_BEHAVIOR_HOLD_TAP - -config ZMK_BEHAVIOR_HOLD_TAP_MAX_HELD - int "Hold Tap Max Held" - help - Max number of simultaneously held hold-taps - -config ZMK_BEHAVIOR_HOLD_TAP_MAX_CAPTURED_EVENTS - int "Hold Tap Max Captured Events" - help - Max number of captured system events while waiting to resolve hold taps - -endif - config ZMK_BEHAVIOR_KEY_TOGGLE bool default y depends on DT_HAS_ZMK_BEHAVIOR_KEY_TOGGLE_ENABLED -config ZMK_BEHAVIOR_MOUSE_KEY_PRESS - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_MOUSE_KEY_PRESS_ENABLED && ZMK_POINTING - -config ZMK_BEHAVIOR_STICKY_KEY - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_STICKY_KEY_ENABLED - -if ZMK_BEHAVIOR_STICKY_KEY - -config ZMK_BEHAVIOR_STICKY_KEY_MAX_HELD - int "Sticky Key Max Held" - help - Max number of simultaneously held sticky keys - -endif - -config ZMK_BEHAVIOR_SOFT_OFF - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_SOFT_OFF_ENABLED && ZMK_PM_SOFT_OFF - - -config ZMK_BEHAVIOR_TAP_DANCE - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_TAP_DANCE_ENABLED - -if ZMK_BEHAVIOR_TAP_DANCE - -config ZMK_BEHAVIOR_TAP_DANCE_MAX_HELD - int "Tap-Dance Max Held" - help - Max number of simultaneously held taps-dances - -endif - -config ZMK_BEHAVIOR_INPUT_TWO_AXIS - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_INPUT_TWO_AXIS_ENABLED && ZMK_POINTING config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON bool + default n config ZMK_BEHAVIOR_SENSOR_ROTATE bool @@ -125,12 +23,7 @@ config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON -config ZMK_BEHAVIOR_STUDIO_UNLOCK - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR_STUDIO_UNLOCK_ENABLED && ZMK_STUDIO - config ZMK_BEHAVIOR_MACRO bool default y - depends on DT_HAS_ZMK_BEHAVIOR_MACRO_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_ONE_PARAM_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_TWO_PARAM_ENABLED + depends on DT_HAS_ZMK_BEHAVIOR_MACRO_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_ONE_PARAM_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_TWO_PARAM_ENABLED \ No newline at end of file diff --git a/app/Kconfig.defaults b/app/Kconfig.defaults deleted file mode 100644 index 8800b454..00000000 --- a/app/Kconfig.defaults +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config SYSTEM_WORKQUEUE_STACK_SIZE - default 3072 if ZMK_DISPLAY - default 2048 - -# Basic -config BT_DEVICE_APPEARANCE - default 961 - -# HID -if ZMK_HID_REPORT_TYPE_HKRO - -config ZMK_HID_KEYBOARD_REPORT_SIZE - default 6 - -endif - -config ZMK_HID_CONSUMER_REPORT_SIZE - default 6 - -# Behaviors - -if ZMK_BEHAVIOR_HOLD_TAP - -config ZMK_BEHAVIOR_HOLD_TAP_MAX_HELD - default 10 - -config ZMK_BEHAVIOR_HOLD_TAP_MAX_CAPTURED_EVENTS - default 40 - -endif - -if ZMK_BEHAVIOR_STICKY_KEY - -config ZMK_BEHAVIOR_STICKY_KEY_MAX_HELD - default 10 - -endif - -if ZMK_BEHAVIOR_TAP_DANCE - -config ZMK_BEHAVIOR_TAP_DANCE_MAX_HELD - default 10 - -endif - -# Underglow -if ZMK_RGB_UNDERGLOW - -# This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this -config SPI - default y - -config ZMK_RGB_UNDERGLOW_EXT_POWER - default y - -config ZMK_RGB_UNDERGLOW_BRT_MIN - default 0 - -config ZMK_RGB_UNDERGLOW_BRT_MAX - default 100 - -config ZMK_RGB_UNDERGLOW_HUE_STEP - default 10 - -config ZMK_RGB_UNDERGLOW_SAT_STEP - default 10 - -config ZMK_RGB_UNDERGLOW_BRT_STEP - default 10 - -config ZMK_RGB_UNDERGLOW_HUE_START - default 0 - -config ZMK_RGB_UNDERGLOW_SAT_START - default 100 - -config ZMK_RGB_UNDERGLOW_BRT_START - default ZMK_RGB_UNDERGLOW_BRT_MAX - -config ZMK_RGB_UNDERGLOW_SPD_START - default 3 - -config ZMK_RGB_UNDERGLOW_EFF_START - default 0 - -config ZMK_RGB_UNDERGLOW_ON_START - default y - -endif # ZMK_RGB_UNDERGLOW - -# Backlight -if ZMK_BACKLIGHT - -config ZMK_BACKLIGHT_BRT_STEP - default 20 - -config ZMK_BACKLIGHT_BRT_START - default 40 - -config ZMK_BACKLIGHT_ON_START - default y - -endif # ZMK_BACKLIGHT - -# Ext_power -config ZMK_EXT_POWER - default y - -# Battery -config ZMK_BATTERY_REPORT_INTERVAL - default 60 - -# Imports -rsource "src/boot/Kconfig.defaults" -rsource "src/split/Kconfig.defaults" diff --git a/app/VERSION b/app/VERSION deleted file mode 100644 index 07a7f21f..00000000 --- a/app/VERSION +++ /dev/null @@ -1,13 +0,0 @@ -# x-release-please-start-major -VERSION_MAJOR = 0 -# x-release-please-end - -# x-release-please-start-minor -VERSION_MINOR = 3 -# x-release-please-end - -# x-release-please-start-patch -PATCHLEVEL = 0 -# x-release-please-end - -VERSION_TWEAK = 0 \ No newline at end of file diff --git a/app/boards/01space_rp2040_042lcd.conf b/app/boards/01space_rp2040_042lcd.conf new file mode 100644 index 00000000..c520a3b7 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.conf @@ -0,0 +1,6 @@ +CONFIG_ZMK_DISPLAY=y +CONFIG_LV_FONT_UNSCII_8=n +CONFIG_ZMK_USB=y +CONFIG_I2C=y +CONFIG_I2C_DW=y +CONFIG_LV_Z_VDB_SIZE=50 diff --git a/app/module/boards/zhiayang/mikoto/mikoto_6_1_0.overlay b/app/boards/01space_rp2040_042lcd.overlay similarity index 54% rename from app/module/boards/zhiayang/mikoto/mikoto_6_1_0.overlay rename to app/boards/01space_rp2040_042lcd.overlay index 80466fd2..d89e53f4 100644 --- a/app/module/boards/zhiayang/mikoto/mikoto_6_1_0.overlay +++ b/app/boards/01space_rp2040_042lcd.overlay @@ -4,5 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include "mikoto-pinctrl.dtsi" -#include "arduino_pro_micro_pins_v6.dtsi" +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/adafruit/kb2040/Kconfig.adafruit_kb2040 b/app/boards/adafruit/kb2040/Kconfig.adafruit_kb2040 deleted file mode 100644 index 528385da..00000000 --- a/app/boards/adafruit/kb2040/Kconfig.adafruit_kb2040 +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_ADAFRUIT_KB2040 - select ZMK_BOARD_COMPAT if BOARD_ADAFRUIT_KB2040_RP2040_ZMK - imply RETAINED_MEM if BOARD_ADAFRUIT_KB2040_RP2040_ZMK - imply RETENTION if BOARD_ADAFRUIT_KB2040_RP2040_ZMK - imply RETENTION_BOOT_MODE if BOARD_ADAFRUIT_KB2040_RP2040_ZMK - diff --git a/app/boards/adafruit/kb2040/adafruit_kb2040_zmk_defconfig b/app/boards/adafruit/kb2040/adafruit_kb2040_zmk_defconfig deleted file mode 100644 index b7b0308b..00000000 --- a/app/boards/adafruit/kb2040/adafruit_kb2040_zmk_defconfig +++ /dev/null @@ -1,23 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 - -# Enable reset by default -CONFIG_RESET=y - -# Enable clock control by default -CONFIG_CLOCK_CONTROL=y - -# Code partition needed to target the correct flash range -CONFIG_USE_DT_CODE_PARTITION=y - -# Output UF2 by default, native bootloader supports it. -CONFIG_BUILD_OUTPUT_UF2=y - -# USB HID -CONFIG_ZMK_USB=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/adafruit/kb2040/board.yml b/app/boards/adafruit/kb2040/board.yml deleted file mode 100644 index 7ef758e0..00000000 --- a/app/boards/adafruit/kb2040/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: adafruit_kb2040 - variants: - - name: zmk - qualifier: rp2040 diff --git a/app/boards/adafruit/qt_py_rp2040/Kconfig.adafruit_qt_py_rp2040 b/app/boards/adafruit/qt_py_rp2040/Kconfig.adafruit_qt_py_rp2040 deleted file mode 100644 index 266d39a1..00000000 --- a/app/boards/adafruit/qt_py_rp2040/Kconfig.adafruit_qt_py_rp2040 +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_ADAFRUIT_QT_PY_RP2040 - select ZMK_BOARD_COMPAT if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK - imply RETAINED_MEM if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK - imply RETENTION if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK - imply RETENTION_BOOT_MODE if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK - diff --git a/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040_zmk.dts b/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040_zmk.dts deleted file mode 100644 index 2a64ff75..00000000 --- a/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040_zmk.dts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040.dts> -#include - -&xiao_serial { status = "disabled"; }; diff --git a/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040_zmk_defconfig b/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040_zmk_defconfig deleted file mode 100644 index b7b0308b..00000000 --- a/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040_zmk_defconfig +++ /dev/null @@ -1,23 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 - -# Enable reset by default -CONFIG_RESET=y - -# Enable clock control by default -CONFIG_CLOCK_CONTROL=y - -# Code partition needed to target the correct flash range -CONFIG_USE_DT_CODE_PARTITION=y - -# Output UF2 by default, native bootloader supports it. -CONFIG_BUILD_OUTPUT_UF2=y - -# USB HID -CONFIG_ZMK_USB=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/adafruit/qt_py_rp2040/board.yml b/app/boards/adafruit/qt_py_rp2040/board.yml deleted file mode 100644 index cda7173e..00000000 --- a/app/boards/adafruit/qt_py_rp2040/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: adafruit_qt_py_rp2040 - variants: - - name: zmk - qualifier: rp2040 diff --git a/app/boards/adafruit_kb2040.conf b/app/boards/adafruit_kb2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_kb2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/module/boards/zhiayang/mikoto/mikoto_5_20_0.overlay b/app/boards/adafruit_kb2040.overlay similarity index 54% rename from app/module/boards/zhiayang/mikoto/mikoto_5_20_0.overlay rename to app/boards/adafruit_kb2040.overlay index f9e744ea..b14e0d04 100644 --- a/app/module/boards/zhiayang/mikoto/mikoto_5_20_0.overlay +++ b/app/boards/adafruit_kb2040.overlay @@ -4,5 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include "mikoto-pinctrl.dtsi" -#include "arduino_pro_micro_pins_v5.dtsi" +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_qt_py_rp2040.conf b/app/boards/adafruit_qt_py_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/include/linker/zmk-behaviors.ld b/app/boards/adafruit_qt_py_rp2040.overlay similarity index 51% rename from app/include/linker/zmk-behaviors.ld rename to app/boards/adafruit_qt_py_rp2040.overlay index 14ecee63..d89e53f4 100644 --- a/app/include/linker/zmk-behaviors.ld +++ b/app/boards/adafruit_qt_py_rp2040.overlay @@ -4,6 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include +#include "usb_console.dtsi" -ITERABLE_SECTION_ROM(zmk_behavior_ref, 4) +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/aliases.cmake b/app/boards/aliases.cmake deleted file mode 100644 index d0a4d81d..00000000 --- a/app/boards/aliases.cmake +++ /dev/null @@ -1,2 +0,0 @@ -# defines board aliases for shorter names (or for renaming boards) -set(mikoto_520_BOARD_ALIAS "mikoto") diff --git a/app/boards/adafruit/kb2040/adafruit_kb2040.zmk.yml b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml similarity index 85% rename from app/boards/adafruit/kb2040/adafruit_kb2040.zmk.yml rename to app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml index f3a79315..c8973f5c 100644 --- a/app/boards/adafruit/kb2040/adafruit_kb2040.zmk.yml +++ b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: adafruit_kb2040//zmk +id: adafruit_kb2040 name: Adafruit KB2040 type: board arch: arm diff --git a/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml similarity index 82% rename from app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml rename to app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml index ebda8559..9b9c1450 100644 --- a/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml +++ b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: adafruit_qt_py_rp2040//zmk +id: adafruit_qt_py_rp2040 name: Adafruit QT Py RP2040 type: board arch: arm diff --git a/app/boards/arm/bdn9/Kconfig.board b/app/boards/arm/bdn9/Kconfig.board new file mode 100644 index 00000000..76a204cc --- /dev/null +++ b/app/boards/arm/bdn9/Kconfig.board @@ -0,0 +1,8 @@ +# keeb.io BDN9 board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BDN9 + bool "BDN9 rev2" + depends on SOC_STM32F072XB diff --git a/app/boards/keebio/bdn9/Kconfig.defconfig b/app/boards/arm/bdn9/Kconfig.defconfig similarity index 78% rename from app/boards/keebio/bdn9/Kconfig.defconfig rename to app/boards/arm/bdn9/Kconfig.defconfig index 3b6c0652..96b7fe55 100644 --- a/app/boards/keebio/bdn9/Kconfig.defconfig +++ b/app/boards/arm/bdn9/Kconfig.defconfig @@ -11,4 +11,8 @@ config BOARD config ZMK_KEYBOARD_NAME default "BDN9 Rev2" +config ZMK_RGB_UNDERGLOW + select SPI + select WS2812_STRIP + endif # BOARD_BDN9 diff --git a/app/boards/keebio/bdn9/README.md b/app/boards/arm/bdn9/README.md similarity index 100% rename from app/boards/keebio/bdn9/README.md rename to app/boards/arm/bdn9/README.md diff --git a/app/boards/keebio/bdn9/bdn9.conf b/app/boards/arm/bdn9/bdn9_rev2.conf similarity index 100% rename from app/boards/keebio/bdn9/bdn9.conf rename to app/boards/arm/bdn9/bdn9_rev2.conf diff --git a/app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk.dts b/app/boards/arm/bdn9/bdn9_rev2.dts similarity index 84% rename from app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk.dts rename to app/boards/arm/bdn9/bdn9_rev2.dts index 542c5341..1b85067c 100644 --- a/app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -9,14 +9,6 @@ #include #include -#include - -#include "bdn9-layouts.dtsi" - -&physical_layout0 { - transform = <&matrix_transform0>; -}; - / { model = "Keeb.io BDN9 rev2"; compatible = "keebio,bdn9", "st,stm32f072"; @@ -24,24 +16,14 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; zmk,underglow = &led_strip; - zmk,physical-layout = &physical_layout0; - zmk,kscan = &kscan0; }; - matrix_transform0: matrix_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <3>; - rows = <3>; - map = < - RC(0,0) RC(0,1) RC(0,2) - RC(0,3) RC(0,4) RC(0,5) - RC(0,6) RC(0,7) RC(0,8) - >; - }; - - kscan0: kscan_0 { + kscan: kscan { compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; input-gpios = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -58,6 +40,7 @@ left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -65,6 +48,7 @@ }; mid_encoder: encoder_mid { compatible = "alps,ec11"; + label = "MID_ENCODER"; a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -72,6 +56,7 @@ }; right_encoder: encoder_right { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -93,6 +78,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ @@ -125,13 +111,14 @@ apb1-prescaler = <1>; }; -zephyr_udc0: &usb { +&usb { status = "okay"; pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; pinctrl-names = "default"; - - // Overridden to lower RAM usage. - num-bidir-endpoints = <4>; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { @@ -150,6 +137,7 @@ zephyr_udc0: &usb { /* Set 6Kb of storage at the end of the 128Kb of flash */ storage_partition: partition@1e800 { + label = "storage"; reg = <0x0001e800 0x00001800>; }; }; diff --git a/app/boards/keebio/bdn9/bdn9.keymap b/app/boards/arm/bdn9/bdn9_rev2.keymap similarity index 96% rename from app/boards/keebio/bdn9/bdn9.keymap rename to app/boards/arm/bdn9/bdn9_rev2.keymap index 0f522492..1e2c192d 100644 --- a/app/boards/keebio/bdn9/bdn9.keymap +++ b/app/boards/arm/bdn9/bdn9_rev2.keymap @@ -4,8 +4,6 @@ * SPDX-License-Identifier: MIT */ -#undef ZMK_BEHAVIORS_KEEP_ALL - #include #include diff --git a/app/boards/keebio/bdn9/bdn9.yaml b/app/boards/arm/bdn9/bdn9_rev2.yaml similarity index 100% rename from app/boards/keebio/bdn9/bdn9.yaml rename to app/boards/arm/bdn9/bdn9_rev2.yaml diff --git a/app/boards/arm/bdn9/bdn9_rev2.yml b/app/boards/arm/bdn9/bdn9_rev2.yml new file mode 100644 index 00000000..01ebd3e0 --- /dev/null +++ b/app/boards/arm/bdn9/bdn9_rev2.yml @@ -0,0 +1,11 @@ +file_format: "1" +id: bdn9_rev2 +name: BDN9 Rev2 +type: board +arch: arm +features: + - keys + - encoder +outputs: + - usb +url: https://keeb.io/products/bdn9-rev-2-3x3-9-key-macropad-rotary-encoder-and-rgb diff --git a/app/boards/keebio/bdn9/bdn9.zmk.yml b/app/boards/arm/bdn9/bdn9_rev2.zmk.yml similarity index 70% rename from app/boards/keebio/bdn9/bdn9.zmk.yml rename to app/boards/arm/bdn9/bdn9_rev2.zmk.yml index a6c764ad..4680746f 100644 --- a/app/boards/keebio/bdn9/bdn9.zmk.yml +++ b/app/boards/arm/bdn9/bdn9_rev2.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: bdn9//zmk -name: BDN9 (Rev2) +id: bdn9_rev2 +name: BDN9 Rev2 type: board arch: arm outputs: @@ -9,6 +9,3 @@ features: - keys - encoder url: https://keeb.io/collections/bdn9-collection/products/bdn9-rev-2-3x3-9-key-macropad-rotary-encoder-and-rgb -revisions: - - "2.0.0" -default_revision: "2.0.0" diff --git a/app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk_defconfig b/app/boards/arm/bdn9/bdn9_rev2_defconfig similarity index 59% rename from app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk_defconfig rename to app/boards/arm/bdn9/bdn9_rev2_defconfig index ce598bd2..05087eeb 100644 --- a/app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk_defconfig +++ b/app/boards/arm/bdn9/bdn9_rev2_defconfig @@ -1,8 +1,13 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_STM32F0X=y +CONFIG_SOC_STM32F072XB=y # 72MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 +# Floating Point Options +CONFIG_FPU=y + # enable GPIO CONFIG_GPIO=y @@ -12,10 +17,10 @@ CONFIG_PINCTRL=y # Poll to avoid interrupt overlap issues CONFIG_ZMK_KSCAN_DIRECT_POLLING=y -CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=1536 -CONFIG_ISR_STACK_SIZE=1024 +# Needed to reduce this to size that will fit on F072 +CONFIG_HEAP_MEM_POOL_SIZE=1024 # clock configuration CONFIG_CLOCK_CONTROL=y -CONFIG_ZMK_USB=y +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/keebio/bdn9/board.cmake b/app/boards/arm/bdn9/board.cmake similarity index 100% rename from app/boards/keebio/bdn9/board.cmake rename to app/boards/arm/bdn9/board.cmake diff --git a/app/boards/weact/blackpill_f401ce/blackpill_f401ce.zmk.yml b/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml similarity index 86% rename from app/boards/weact/blackpill_f401ce/blackpill_f401ce.zmk.yml rename to app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml index 26115680..251d2c27 100644 --- a/app/boards/weact/blackpill_f401ce/blackpill_f401ce.zmk.yml +++ b/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: blackpill_f401ce//zmk +id: blackpill_f401ce name: BlackPill F401CE type: board arch: arm diff --git a/app/boards/weact/blackpill_f411ce/blackpill_f411ce.zmk.yml b/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml similarity index 86% rename from app/boards/weact/blackpill_f411ce/blackpill_f411ce.zmk.yml rename to app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml index 2684da2d..eaa714d6 100644 --- a/app/boards/weact/blackpill_f411ce/blackpill_f411ce.zmk.yml +++ b/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: blackpill_f411ce//zmk +id: blackpill_f411ce name: BlackPill F411CE type: board arch: arm diff --git a/app/module/boards/jpconstantineau/bluemicro840/Kconfig b/app/boards/arm/bluemicro840/Kconfig similarity index 77% rename from app/module/boards/jpconstantineau/bluemicro840/Kconfig rename to app/boards/arm/bluemicro840/Kconfig index 470b5559..ca060885 100644 --- a/app/module/boards/jpconstantineau/bluemicro840/Kconfig +++ b/app/boards/arm/bluemicro840/Kconfig @@ -4,5 +4,5 @@ config BOARD_ENABLE_DCDC bool "Enable DCDC mode" select SOC_DCDC_NRF52X default y - depends on BOARD_BLUEMICRO840 + depends on BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/Kconfig.board b/app/boards/arm/bluemicro840/Kconfig.board new file mode 100644 index 00000000..e2794015 --- /dev/null +++ b/app/boards/arm/bluemicro840/Kconfig.board @@ -0,0 +1,8 @@ +# BlueMicro840 board configuration + +# Copyright (c) 2020 Pete Johanson, Derek Schmell +# SPDX-License-Identifier: MIT + +config BOARD_BLUEMICRO840_V1 + bool "BlueMicro840_V1" + depends on SOC_NRF52840_QIAA diff --git a/app/module/boards/jpconstantineau/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig similarity index 69% rename from app/module/boards/jpconstantineau/bluemicro840/Kconfig.defconfig rename to app/boards/arm/bluemicro840/Kconfig.defconfig index 81573146..ff61ec92 100644 --- a/app/module/boards/jpconstantineau/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -3,7 +3,10 @@ # Copyright (c) 2020 Pete Johanson, Derek Schmell # SPDX-License-Identifier: MIT -if BOARD_BLUEMICRO840 +if BOARD_BLUEMICRO840_V1 + +config BOARD + default "bluemicro840_v1" if USB_DEVICE_STACK @@ -15,4 +18,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -endif # BOARD_BLUEMICRO840 +endif # BOARD_BLUEMICRO840_V1 diff --git a/app/module/boards/jpconstantineau/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi similarity index 98% rename from app/module/boards/jpconstantineau/bluemicro840/arduino_pro_micro_pins.dtsi rename to app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index b2026b6f..cdb8fcdd 100644 --- a/app/module/boards/jpconstantineau/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -53,5 +53,5 @@ pro_micro_d: &pro_micro {}; pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi1 {}; +pro_micro_spi: &spi0 {}; pro_micro_serial: &uart0 {}; diff --git a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi similarity index 66% rename from app/module/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi rename to app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 046c0346..868d3c27 100644 --- a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -36,21 +36,4 @@ low-power-enable; }; }; - - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; }; diff --git a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts similarity index 70% rename from app/module/boards/jpconstantineau/bluemicro840/bluemicro840.dts rename to app/boards/arm/bluemicro840/bluemicro840_v1.dts index fe32d952..05849001 100644 --- a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -6,9 +6,8 @@ /dts-v1/; #include - #include "arduino_pro_micro_pins.dtsi" -#include "bluemicro840-pinctrl.dtsi" +#include "bluemicro840_v1-pinctrl.dtsi" / { model = "BlueMicro840_V1"; @@ -18,14 +17,33 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + init-delay-ms = <20>; + control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; + }; &adc { @@ -51,13 +69,6 @@ pinctrl-names = "default", "sleep"; }; -&spi1 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - &uart0 { compatible = "nordic,nrf-uarte"; current-speed = <115200>; @@ -66,8 +77,12 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -82,9 +97,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -98,10 +115,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/boards/jpconstantineau/bluemicro840/bluemicro840.yaml b/app/boards/arm/bluemicro840/bluemicro840_v1.yaml similarity index 85% rename from app/boards/jpconstantineau/bluemicro840/bluemicro840.yaml rename to app/boards/arm/bluemicro840/bluemicro840_v1.yaml index c36eee0c..9e1dd54c 100644 --- a/app/boards/jpconstantineau/bluemicro840/bluemicro840.yaml +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.yaml @@ -1,4 +1,4 @@ -identifier: bluemicro840 +identifier: bluemicro840_v1 name: BlueMicro840_V1 type: mcu arch: arm diff --git a/app/boards/jpconstantineau/bluemicro840/bluemicro840.zmk.yml b/app/boards/arm/bluemicro840/bluemicro840_v1.zmk.yml similarity index 88% rename from app/boards/jpconstantineau/bluemicro840/bluemicro840.zmk.yml rename to app/boards/arm/bluemicro840/bluemicro840_v1.zmk.yml index 7b1d8452..c1d3c6b9 100644 --- a/app/boards/jpconstantineau/bluemicro840/bluemicro840.zmk.yml +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bluemicro840//zmk +id: bluemicro840_v1 name: BlueMicro840 v1 type: board arch: arm diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk_1_3_0_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig similarity index 79% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk_1_3_0_defconfig rename to app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index 709f33d8..3e13e77d 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk_1_3_0_defconfig +++ b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BLUEMICRO840_V1=y + # Enable MPU CONFIG_ARM_MPU=y @@ -17,8 +21,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y -CONFIG_CLOCK_CONTROL_NRF=y -CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y diff --git a/app/module/boards/makerdiary/nrf52840_m2/board.cmake b/app/boards/arm/bluemicro840/board.cmake similarity index 83% rename from app/module/boards/makerdiary/nrf52840_m2/board.cmake rename to app/boards/arm/bluemicro840/board.cmake index 0acfeb73..fa847d50 100644 --- a/app/module/boards/makerdiary/nrf52840_m2/board.cmake +++ b/app/boards/arm/bluemicro840/board.cmake @@ -1,7 +1,5 @@ -# Copyright (c) 2026 The ZMK Contributors # SPDX-License-Identifier: MIT board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") - -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml new file mode 100644 index 00000000..a6e91afd --- /dev/null +++ b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: boardsource_blok +name: BoardSource blok +type: board +arch: arm +outputs: + - usb +url: https://peg.software/docs/blok +exposes: [pro_micro] diff --git a/app/boards/arm/bt60/Kconfig b/app/boards/arm/bt60/Kconfig new file mode 100644 index 00000000..d57a6b7e --- /dev/null +++ b/app/boards/arm/bt60/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) diff --git a/app/boards/arm/bt60/Kconfig.board b/app/boards/arm/bt60/Kconfig.board new file mode 100644 index 00000000..24c0a8b5 --- /dev/null +++ b/app/boards/arm/bt60/Kconfig.board @@ -0,0 +1,12 @@ +# BT60 board configuration + +# Copyright (c) 2021 Polarity Works +# SPDX-License-Identifier: MIT + +config BOARD_BT60_V1 + bool "bt60" + depends on SOC_NRF52840_QIAA + +config BOARD_BT60_V1_HS + bool "bt60 hotswap" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/polarityworks/bt65/Kconfig.defconfig b/app/boards/arm/bt60/Kconfig.defconfig similarity index 55% rename from app/boards/polarityworks/bt65/Kconfig.defconfig rename to app/boards/arm/bt60/Kconfig.defconfig index ac6b221e..c44901bd 100644 --- a/app/boards/polarityworks/bt65/Kconfig.defconfig +++ b/app/boards/arm/bt60/Kconfig.defconfig @@ -1,10 +1,10 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2021 Polarity Works # SPDX-License-Identifier: MIT -config ZMK_KEYBOARD_NAME - default "BT65" if BOARD_BT65 +if BOARD_BT60_V1_HS || BOARD_BT60_V1 -if BOARD_BT65 +config BOARD + default "bt60" if USB @@ -19,4 +19,7 @@ endif # USB config BT_CTLR default BT -endif # BOARD_BT65 +config ZMK_KEYBOARD_NAME + default "BT60" + +endif # BOARD_BT60 diff --git a/app/boards/nicekeyboards/nice_nano/board.cmake b/app/boards/arm/bt60/board.cmake similarity index 70% rename from app/boards/nicekeyboards/nice_nano/board.cmake rename to app/boards/arm/bt60/board.cmake index 73fa64a9..fa847d50 100644 --- a/app/boards/nicekeyboards/nice_nano/board.cmake +++ b/app/boards/arm/bt60/board.cmake @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi new file mode 100644 index 00000000..8a270250 --- /dev/null +++ b/app/boards/arm/bt60/bt60.dtsi @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2021 Polarity Works +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include +#include + +/ { + model = "BT60"; + compatible = "polarityworks,bt60"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + sensors: sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + triggers-per-rotation = <20>; + }; + + + + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + status = "okay"; + }; + + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0.overlay b/app/boards/arm/bt60/bt60_v1.dts similarity index 82% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0.overlay rename to app/boards/arm/bt60/bt60_v1.dts index c132266d..0cfe184a 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0.overlay +++ b/app/boards/arm/bt60/bt60_v1.dts @@ -4,17 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include "bt60_1_0_0.dtsi" -#include -#include -#include -#include +/dts-v1/; +#include "bt60.dtsi" / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &layout_60_ansi; + zmk,matrix_transform = &ansi_transform; }; ansi_transform: keymap_transform_0 { @@ -69,10 +66,22 @@ >; }; + split_transform: keymap_transform_4 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; + kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -102,19 +111,3 @@ ; }; }; - -&layout_60_ansi { - transform = <&ansi_transform>; -}; - -&layout_60_iso { - transform = <&iso_transform>; -}; - -&layout_60_all1u { - transform = <&all_1u_transform>; -}; - -&layout_60_hhkb { - transform = <&hhkb_transform>; -}; diff --git a/app/boards/polarityworks/bt60/bt60_1_0_0.keymap b/app/boards/arm/bt60/bt60_v1.keymap similarity index 79% rename from app/boards/polarityworks/bt60/bt60_1_0_0.keymap rename to app/boards/arm/bt60/bt60_v1.keymap index 93957695..25ae269d 100644 --- a/app/boards/polarityworks/bt60/bt60_1_0_0.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -2,25 +2,26 @@ #include #include -#define ANSI -//#define HHKB -//#define ISO -//#define ALL_1U +#define ANSI true +//#define HHKB true +//#define ISO true +//#define ALL_1U true +//#define SPLIT_BKSP_RSHFT true / { chosen { #ifdef ANSI - zmk,physical-layout = &layout_60_ansi; - #elif defined(ISO) - zmk,physical-layout = &layout_60_iso; - #elif defined(ALL_1U) - zmk,physical-layout = &layout_60_all1u; + zmk,matrix_transform = &ansi_transform; #elif defined(HHKB) - zmk,physical-layout = &layout_60_hhkb; + zmk,matrix_transform = &hhkb_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; #else - #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.keymap" + zmk,matrix_transform = &split_transform; #endif }; @@ -30,7 +31,7 @@ #ifdef ANSI default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | @@ -93,7 +94,7 @@ #elif defined(ISO) default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | @@ -121,7 +122,7 @@ #elif defined(ALL_1U) default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | @@ -147,7 +148,33 @@ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; #else - #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.keymap" + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; #endif }; }; diff --git a/app/boards/arm/bt60/bt60_v1.yaml b/app/boards/arm/bt60/bt60_v1.yaml new file mode 100644 index 00000000..41fd7e40 --- /dev/null +++ b/app/boards/arm/bt60/bt60_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt60_v1 +name: BT60 V1 Soldered +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/bt60/bt60_v1.zmk.yml b/app/boards/arm/bt60/bt60_v1.zmk.yml new file mode 100644 index 00000000..9909f191 --- /dev/null +++ b/app/boards/arm/bt60/bt60_v1.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: bt60_v1 +name: BT60 V1 Soldered +type: board +arch: arm +features: + - keys + - encoder +outputs: + - usb + - ble +url: https://polarityworks.com diff --git a/app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk_defconfig b/app/boards/arm/bt60/bt60_v1_defconfig similarity index 79% rename from app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk_defconfig rename to app/boards/arm/bt60/bt60_v1_defconfig index 6925f175..04adb8a3 100644 --- a/app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk_defconfig +++ b/app/boards/arm/bt60/bt60_v1_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT60_V1=y + # Enable MPU CONFIG_ARM_MPU=y @@ -21,4 +25,4 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk.dts b/app/boards/arm/bt60/bt60_v1_hs.dts similarity index 89% rename from app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk.dts rename to app/boards/arm/bt60/bt60_v1_hs.dts index 55f90525..b24dee1e 100644 --- a/app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk.dts +++ b/app/boards/arm/bt60/bt60_v1_hs.dts @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include "bt60_nrf52840_zmk.dts" -#include "bt60_1_0_0.dtsi" -#include +/dts-v1/; +#include "bt60.dtsi" + / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &layout_60_ansi; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -30,8 +30,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -60,7 +59,3 @@ ; }; }; - -&layout_60_ansi { - transform = <&default_transform>; -}; diff --git a/app/boards/polarityworks/bt60/bt60_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap similarity index 93% rename from app/boards/polarityworks/bt60/bt60_hs.keymap rename to app/boards/arm/bt60/bt60_v1_hs.keymap index a36246e5..6c26756e 100644 --- a/app/boards/polarityworks/bt60/bt60_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -8,14 +8,14 @@ default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | // ------------------------------------------------------------------------------------------ bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT @@ -25,7 +25,7 @@ }; raise { bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT diff --git a/app/boards/arm/bt60/bt60_v1_hs.yaml b/app/boards/arm/bt60/bt60_v1_hs.yaml new file mode 100644 index 00000000..5a73753b --- /dev/null +++ b/app/boards/arm/bt60/bt60_v1_hs.yaml @@ -0,0 +1,15 @@ +identifier: bt60_v1_hs +name: BT60 V1 Hotswap +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/polarityworks/bt60/bt60_hs.zmk.yml b/app/boards/arm/bt60/bt60_v1_hs.zmk.yml similarity index 84% rename from app/boards/polarityworks/bt60/bt60_hs.zmk.yml rename to app/boards/arm/bt60/bt60_v1_hs.zmk.yml index cc9d8ed7..bc9acea4 100644 --- a/app/boards/polarityworks/bt60/bt60_hs.zmk.yml +++ b/app/boards/arm/bt60/bt60_v1_hs.zmk.yml @@ -1,12 +1,11 @@ file_format: "1" -id: bt60_hs//zmk +id: bt60_v1_hs name: BT60 V1 Hotswap type: board arch: arm features: - keys - encoder - - studio outputs: - usb - ble diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0_defconfig b/app/boards/arm/bt60/bt60_v1_hs_defconfig similarity index 78% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0_defconfig rename to app/boards/arm/bt60/bt60_v1_hs_defconfig index 6925f175..f16d82ac 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0_defconfig +++ b/app/boards/arm/bt60/bt60_v1_hs_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT60_V1_HS=y + # Enable MPU CONFIG_ARM_MPU=y @@ -21,4 +25,4 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/ckp/Kconfig b/app/boards/arm/ckp/Kconfig new file mode 100644 index 00000000..7baf1486 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/Kconfig.board b/app/boards/arm/ckp/Kconfig.board new file mode 100644 index 00000000..a98a3167 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.board @@ -0,0 +1,16 @@ +# CKP boards configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT60_V2 + bool "bt60_v2" + depends on SOC_NRF52840_QIAA + +config BOARD_BT65_V1 + bool "bt65_v1" + depends on SOC_NRF52840_QIAA + +config BOARD_BT75_V1 + bool "bt75_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/ckp/Kconfig.defconfig b/app/boards/arm/ckp/Kconfig.defconfig new file mode 100644 index 00000000..376d4619 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.defconfig @@ -0,0 +1,28 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD + default "bt60_v2" if BOARD_BT60_V2 + default "bt65_v1" if BOARD_BT65_V1 + default "bt75_v1" if BOARD_BT75_V1 +config ZMK_KEYBOARD_NAME + default "BT60 V2" if BOARD_BT60_V2 + default "BT65" if BOARD_BT65_V1 + default "BT75" if BOARD_BT75_V1 + +if BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +config BT_CTLR + default BT + +endif # BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/polarityworks/bt60/board.cmake b/app/boards/arm/ckp/board.cmake similarity index 74% rename from app/boards/polarityworks/bt60/board.cmake rename to app/boards/arm/ckp/board.cmake index 73fa64a9..b7feee2e 100644 --- a/app/boards/polarityworks/bt60/board.cmake +++ b/app/boards/arm/ckp/board.cmake @@ -1,5 +1,4 @@ # SPDX-License-Identifier: MIT board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0.overlay b/app/boards/arm/ckp/bt60_v2.dts similarity index 86% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0.overlay rename to app/boards/arm/ckp/bt60_v2.dts index c9aac427..19f92287 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0.overlay +++ b/app/boards/arm/ckp/bt60_v2.dts @@ -4,19 +4,16 @@ * SPDX-License-Identifier: MIT */ -#include "../common/ckp.dtsi" -#include -#include -#include -#include +/dts-v1/; +#include "ckp.dtsi" / { model = "BT60_V2"; - compatible = "polarityworks,bt60"; + compatible = "polarityworks,bt60_v2"; chosen { - zmk,physical-layout = &layout_60_ansi; + zmk,matrix_transform = &ansi_transform; }; @@ -72,19 +69,3 @@ >; }; }; - -&layout_60_ansi { - transform = <&ansi_transform>; -}; - -&layout_60_iso { - transform = <&iso_transform>; -}; - -&layout_60_all1u { - transform = <&all_1u_transform>; -}; - -&layout_60_hhkb { - transform = <&hhkb_transform>; -}; diff --git a/app/boards/polarityworks/bt60/bt60_2_0_0.keymap b/app/boards/arm/ckp/bt60_v2.keymap similarity index 96% rename from app/boards/polarityworks/bt60/bt60_2_0_0.keymap rename to app/boards/arm/ckp/bt60_v2.keymap index c9829589..eeb5c96e 100644 --- a/app/boards/polarityworks/bt60/bt60_2_0_0.keymap +++ b/app/boards/arm/ckp/bt60_v2.keymap @@ -12,15 +12,15 @@ / { chosen { #ifdef ANSI - zmk,physical-layout = &layout_60_ansi; + zmk,matrix_transform = &ansi_transform; #elif defined(ISO) - zmk,physical-layout = &layout_60_iso; + zmk,matrix_transform = &iso_transform; #elif defined(ALL_1U) - zmk,physical-layout = &layout_60_all1u; + zmk,matrix_transform = &all_1u_transform; #elif defined(HHKB) - zmk,physical-layout = &layout_60_hhkb; + zmk,matrix_transform = &hhkb_transform; #else - #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" #endif }; @@ -29,7 +29,7 @@ #ifdef ANSI default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | @@ -65,7 +65,7 @@ #elif defined(ISO) default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | // | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | @@ -101,7 +101,7 @@ #elif defined(ALL_1U) default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC | DEL | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | @@ -118,7 +118,7 @@ }; raise { // ------------------------------------------------------------------------------------------ - // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BSPC | DEL | + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BKSP | DEL | // | TAB | Q | W | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG | // | CAPS | A | S | D | BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | // | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 | @@ -136,7 +136,7 @@ #elif defined(HHKB) default_layer { // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | @@ -170,7 +170,7 @@ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; #else - #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" #endif }; diff --git a/app/boards/polarityworks/bt60/bt60.yaml b/app/boards/arm/ckp/bt60_v2.yaml similarity index 88% rename from app/boards/polarityworks/bt60/bt60.yaml rename to app/boards/arm/ckp/bt60_v2.yaml index c2dc3736..2a3f3b47 100644 --- a/app/boards/polarityworks/bt60/bt60.yaml +++ b/app/boards/arm/ckp/bt60_v2.yaml @@ -1,4 +1,4 @@ -identifier: bt60 +identifier: bt60_v2 name: BT60 V2 type: mcu arch: arm diff --git a/app/boards/polarityworks/bt75/bt75.zmk.yml b/app/boards/arm/ckp/bt60_v2.zmk.yml similarity index 80% rename from app/boards/polarityworks/bt75/bt75.zmk.yml rename to app/boards/arm/ckp/bt60_v2.zmk.yml index fb909c52..faf64205 100644 --- a/app/boards/polarityworks/bt75/bt75.zmk.yml +++ b/app/boards/arm/ckp/bt60_v2.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: bt75//zmk -name: BT75 V1 +id: bt60_v2 +name: BT60 V2 type: board arch: arm features: @@ -8,7 +8,6 @@ features: - encoder - underglow - backlight - - studio outputs: - usb - ble diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0_defconfig b/app/boards/arm/ckp/bt60_v2_defconfig similarity index 84% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0_defconfig rename to app/boards/arm/ckp/bt60_v2_defconfig index 27b0681e..fd1ae985 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0_defconfig +++ b/app/boards/arm/ckp/bt60_v2_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT60_V2=y + # Enable MPU CONFIG_ARM_MPU=y @@ -28,6 +32,8 @@ CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/polarityworks/bt65/bt65_nrf52840_zmk.dts b/app/boards/arm/ckp/bt65_v1.dts similarity index 84% rename from app/boards/polarityworks/bt65/bt65_nrf52840_zmk.dts rename to app/boards/arm/ckp/bt65_v1.dts index d7de5143..97d80da2 100644 --- a/app/boards/polarityworks/bt65/bt65_nrf52840_zmk.dts +++ b/app/boards/arm/ckp/bt65_v1.dts @@ -5,23 +5,15 @@ */ /dts-v1/; -#include -#include - -#include "../common/ckp-base.dtsi" -#include "../common/ckp.dtsi" -#include -#include -#include -#include +#include "ckp.dtsi" / { model = "BT65_V1"; - compatible = "polarityworks,bt65"; + compatible = "polarityworks,bt65_v1"; chosen { - zmk,physical-layout = &layout_65_ansi; + zmk,matrix_transform = &ansi_transform; }; @@ -77,19 +69,3 @@ >; }; }; - -&layout_65_ansi { - transform = <&ansi_transform>; -}; - -&layout_65_iso { - transform = <&iso_transform>; -}; - -&layout_65_all1u { - transform = <&all_1u_transform>; -}; - -&layout_65_hhkb { - transform = <&hhkb_transform>; -}; diff --git a/app/boards/polarityworks/bt65/bt65.keymap b/app/boards/arm/ckp/bt65_v1.keymap similarity index 95% rename from app/boards/polarityworks/bt65/bt65.keymap rename to app/boards/arm/ckp/bt65_v1.keymap index b3b34b21..27411a71 100644 --- a/app/boards/polarityworks/bt65/bt65.keymap +++ b/app/boards/arm/ckp/bt65_v1.keymap @@ -12,15 +12,15 @@ / { chosen { #ifdef ANSI - zmk,physical-layout = &layout_65_ansi; + zmk,matrix_transform = &ansi_transform; #elif defined(ISO) - zmk,physical-layout = &layout_65_iso; + zmk,matrix_transform = &iso_transform; #elif defined(ALL_1U) - zmk,physical-layout = &layout_65_all1u; + zmk,matrix_transform = &all_1u_transform; #elif defined(HHKB) - zmk,physical-layout = &layout_65_hhkb; + zmk,matrix_transform = &hhkb_transform; #else - #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" #endif }; @@ -29,7 +29,7 @@ #ifdef ANSI default_layer { // ------------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| @@ -37,7 +37,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN @@ -65,7 +65,7 @@ #elif defined(ISO) default_layer { // ------------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| @@ -73,7 +73,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN @@ -101,7 +101,7 @@ #elif defined(ALL_1U) default_layer { // ------------------------------------------------------------------------------------------------- - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC | DEL | HOME| + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| @@ -136,7 +136,7 @@ #elif defined(HHKB) default_layer { // ------------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL | + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | HOME| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | END | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | PGUP| @@ -144,7 +144,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp END &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp PG_UP @@ -170,7 +170,7 @@ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; #else - #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" #endif }; diff --git a/app/boards/polarityworks/bt65/bt65.yaml b/app/boards/arm/ckp/bt65_v1.yaml similarity index 88% rename from app/boards/polarityworks/bt65/bt65.yaml rename to app/boards/arm/ckp/bt65_v1.yaml index 52bc38ae..61edacce 100644 --- a/app/boards/polarityworks/bt65/bt65.yaml +++ b/app/boards/arm/ckp/bt65_v1.yaml @@ -1,4 +1,4 @@ -identifier: bt65 +identifier: bt65_v1 name: BT65_V1 type: mcu arch: arm diff --git a/app/boards/polarityworks/bt65/bt65.zmk.yml b/app/boards/arm/ckp/bt65_v1.zmk.yml similarity index 87% rename from app/boards/polarityworks/bt65/bt65.zmk.yml rename to app/boards/arm/ckp/bt65_v1.zmk.yml index aaeb1835..f82253b0 100644 --- a/app/boards/polarityworks/bt65/bt65.zmk.yml +++ b/app/boards/arm/ckp/bt65_v1.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt65//zmk +id: bt65_v1 name: BT65 type: board arch: arm @@ -8,7 +8,6 @@ features: - encoder - underglow - backlight - - studio outputs: - usb - ble diff --git a/app/boards/polarityworks/bt75/bt75_nrf52840_zmk_defconfig b/app/boards/arm/ckp/bt65_v1_defconfig similarity index 82% rename from app/boards/polarityworks/bt75/bt75_nrf52840_zmk_defconfig rename to app/boards/arm/ckp/bt65_v1_defconfig index 27b0681e..be5f17eb 100644 --- a/app/boards/polarityworks/bt75/bt75_nrf52840_zmk_defconfig +++ b/app/boards/arm/ckp/bt65_v1_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT65_V1=y + # Enable MPU CONFIG_ARM_MPU=y @@ -28,8 +32,10 @@ CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y CONFIG_BT_CTLR_TX_PWR_PLUS_8=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/polarityworks/bt75/bt75_nrf52840_zmk.dts b/app/boards/arm/ckp/bt75_v1.dts similarity index 85% rename from app/boards/polarityworks/bt75/bt75_nrf52840_zmk.dts rename to app/boards/arm/ckp/bt75_v1.dts index bfbef0a2..42aaf351 100644 --- a/app/boards/polarityworks/bt75/bt75_nrf52840_zmk.dts +++ b/app/boards/arm/ckp/bt75_v1.dts @@ -5,22 +5,15 @@ */ /dts-v1/; -#include -#include - -#include "../common/ckp-base.dtsi" -#include "../common/ckp.dtsi" -#include -#include -#include +#include "ckp.dtsi" / { model = "BT75_V1"; - compatible = "polarityworks,bt75"; + compatible = "polarityworks,bt75_v1"; chosen { - zmk,physical-layout = &layout_75_ansi; + zmk,matrix_transform = &ansi_transform; }; @@ -66,15 +59,3 @@ >; }; }; - -&layout_75_ansi { - transform = <&ansi_transform>; -}; - -&layout_75_iso { - transform = <&iso_transform>; -}; - -&layout_75_all1u { - transform = <&all_1u_transform>; -}; diff --git a/app/boards/polarityworks/bt75/bt75.keymap b/app/boards/arm/ckp/bt75_v1.keymap similarity index 96% rename from app/boards/polarityworks/bt75/bt75.keymap rename to app/boards/arm/ckp/bt75_v1.keymap index 42833cb0..5c95387a 100644 --- a/app/boards/polarityworks/bt75/bt75.keymap +++ b/app/boards/arm/ckp/bt75_v1.keymap @@ -11,13 +11,13 @@ / { chosen { #ifdef ANSI - zmk,physical-layout = &layout_75_ansi; + zmk,matrix_transform = &ansi_transform; #elif defined(ISO) - zmk,physical-layout = &layout_75_iso; + zmk,matrix_transform = &iso_transform; #elif defined(ALL_1U) - zmk,physical-layout = &layout_75_all1u; + zmk,matrix_transform = &all_1u_transform; #else - #error "Layout not defined, please define a layout using by uncommenting the appropriate line in bt75.keymap" + #error "Layout not defined, please define a layout using by uncommenting the appropriate line in bt75_v1.keymap" #endif }; @@ -27,7 +27,7 @@ default_layer { // ------------------------------------------------------------------------------------------------ // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | - // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| @@ -35,7 +35,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN @@ -66,7 +66,7 @@ default_layer { // ------------------------------------------------------------------------------------------------ // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | - // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| @@ -74,7 +74,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN @@ -105,7 +105,7 @@ default_layer { // ------------------------------------------------------------------------------------------------- // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | - // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC | DEL | HOME| + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| diff --git a/app/boards/polarityworks/bt75/bt75.yaml b/app/boards/arm/ckp/bt75_v1.yaml similarity index 88% rename from app/boards/polarityworks/bt75/bt75.yaml rename to app/boards/arm/ckp/bt75_v1.yaml index b628d81c..e4faa09f 100644 --- a/app/boards/polarityworks/bt75/bt75.yaml +++ b/app/boards/arm/ckp/bt75_v1.yaml @@ -1,4 +1,4 @@ -identifier: bt75 +identifier: bt75_v1 name: BT75_V1 type: mcu arch: arm diff --git a/app/boards/polarityworks/bt60/bt60.zmk.yml b/app/boards/arm/ckp/bt75_v1.zmk.yml similarity index 69% rename from app/boards/polarityworks/bt60/bt60.zmk.yml rename to app/boards/arm/ckp/bt75_v1.zmk.yml index 98bb85fc..76e30047 100644 --- a/app/boards/polarityworks/bt60/bt60.zmk.yml +++ b/app/boards/arm/ckp/bt75_v1.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: bt60//zmk -name: BT60 V2 +id: bt75_v1 +name: BT75_V1 type: board arch: arm features: @@ -8,11 +8,7 @@ features: - encoder - underglow - backlight - - studio outputs: - usb - ble -revisions: - - 2.0.0 - - 1.0.0 url: https://polarityworks.com/btckp diff --git a/app/boards/polarityworks/bt65/bt65_nrf52840_zmk_defconfig b/app/boards/arm/ckp/bt75_v1_defconfig similarity index 82% rename from app/boards/polarityworks/bt65/bt65_nrf52840_zmk_defconfig rename to app/boards/arm/ckp/bt75_v1_defconfig index 27b0681e..b4d85338 100644 --- a/app/boards/polarityworks/bt65/bt65_nrf52840_zmk_defconfig +++ b/app/boards/arm/ckp/bt75_v1_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT75_V1=y + # Enable MPU CONFIG_ARM_MPU=y @@ -28,8 +32,10 @@ CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y CONFIG_BT_CTLR_TX_PWR_PLUS_8=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/polarityworks/common/ckp-pinctrl.dtsi b/app/boards/arm/ckp/ckp-pinctrl.dtsi similarity index 100% rename from app/boards/polarityworks/common/ckp-pinctrl.dtsi rename to app/boards/arm/ckp/ckp-pinctrl.dtsi diff --git a/app/boards/polarityworks/common/ckp.dtsi b/app/boards/arm/ckp/ckp.dtsi similarity index 72% rename from app/boards/polarityworks/common/ckp.dtsi rename to app/boards/arm/ckp/ckp.dtsi index ba337468..ec2bd6a8 100644 --- a/app/boards/polarityworks/common/ckp.dtsi +++ b/app/boards/arm/ckp/ckp.dtsi @@ -4,6 +4,9 @@ * SPDX-License-Identifier: MIT */ +/dts-v1/; +#include + #include #include @@ -31,8 +34,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -64,14 +66,15 @@ ; }; - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { + ext-power { compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; }; encoder_1: encoder_1 { compatible = "alps,ec11"; + label = "ENCODER_ONE"; a-gpios = <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -80,6 +83,7 @@ encoder_2: encoder_2 { compatible = "alps,ec11"; + label = "ENCODER_TWO"; a-gpios = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -88,6 +92,7 @@ encoder_3: encoder_3 { compatible = "alps,ec11"; + label = "encoder_3"; a-gpios = <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -96,6 +101,7 @@ backlight: pwmleds { compatible = "pwm-leds"; + label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 0 10000 PWM_POLARITY_NORMAL>; }; @@ -105,20 +111,21 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "VBATT"; io-channels = <&adc 2>; output-ohms = <100000>; full-ohms = <(100000 + 100000)>; }; }; -&vbatt { - output-ohms = <100000>; - full-ohms = <(100000 + 100000)>; +&adc { + status = "okay"; }; &pwm0 { @@ -128,6 +135,63 @@ pinctrl-names = "default", "sleep"; }; +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; + &spi3 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -137,6 +201,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; diff --git a/app/boards/lowprokb/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt similarity index 100% rename from app/boards/lowprokb/corneish_zen/CMakeLists.txt rename to app/boards/arm/corneish_zen/CMakeLists.txt diff --git a/app/boards/arm/corneish_zen/Kconfig b/app/boards/arm/corneish_zen/Kconfig new file mode 100644 index 00000000..33d92609 --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig @@ -0,0 +1,10 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_LEFT + bool + +config BOARD_CORNEISH_ZEN_RIGHT + bool diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board new file mode 100644 index 00000000..ffb3ab1f --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -0,0 +1,24 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_V1_LEFT + bool "corneish zen left v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT + +config BOARD_CORNEISH_ZEN_V1_RIGHT + bool "corneish zen right v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT + +config BOARD_CORNEISH_ZEN_V2_LEFT + bool "corneish zen left v2" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT + +config BOARD_CORNEISH_ZEN_V2_RIGHT + bool "corneish zen right v2" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT diff --git a/app/boards/lowprokb/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig similarity index 86% rename from app/boards/lowprokb/corneish_zen/Kconfig.defconfig rename to app/boards/arm/corneish_zen/Kconfig.defconfig index e4ff579a..f3cc959e 100644 --- a/app/boards/lowprokb/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -40,7 +40,7 @@ config ZMK_DISPLAY select LV_FONT_MONTSERRAT_26 select LV_FONT_MONTSERRAT_16 select LV_USE_LABEL - select LV_USE_IMAGE + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM @@ -57,13 +57,6 @@ config IL0323 config ZMK_DISPLAY_BLANK_ON_IDLE default n -# Needed for the IL0323 driver which allocs memory to clear the display -config HEAP_MEM_POOL_SIZE - default 1024 - - config LV_Z_MEM_POOL_SIZE - default 4096 - endif # ZMK_DISPLAY menuconfig CUSTOM_WIDGET_BATTERY_STATUS @@ -79,3 +72,10 @@ menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS bool "custom peripheral status widget" endif # BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT + +if BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT + +config BQ274XX + default y + +endif # BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT diff --git a/app/boards/jpconstantineau/bluemicro840/board.cmake b/app/boards/arm/corneish_zen/board.cmake similarity index 70% rename from app/boards/jpconstantineau/bluemicro840/board.cmake rename to app/boards/arm/corneish_zen/board.cmake index 73fa64a9..fa847d50 100644 --- a/app/boards/jpconstantineau/bluemicro840/board.cmake +++ b/app/boards/arm/corneish_zen/board.cmake @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen.conf b/app/boards/arm/corneish_zen/corneish_zen.conf similarity index 100% rename from app/boards/lowprokb/corneish_zen/corneish_zen.conf rename to app/boards/arm/corneish_zen/corneish_zen.conf diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi similarity index 90% rename from app/boards/lowprokb/corneish_zen/corneish_zen.dtsi rename to app/boards/arm/corneish_zen/corneish_zen.dtsi index 583f7ed3..289c5e73 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -7,21 +7,9 @@ /dts-v1/; #include -#include #include -#include -#include - -&foostan_corne_6col_layout { - transform = <&default_transform>; -}; - -&foostan_corne_5col_layout { - transform = <&five_column_transform>; -}; - / { model = "Corne-ish Zen"; compatible = "corneish_zen"; @@ -32,7 +20,8 @@ zephyr,flash = &flash0; zmk,kscan = &kscan0; zmk,display = &epd; - zmk,physical-layout = &foostan_corne_6col_layout; + zephyr,console = &cdc_acm_uart; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -87,8 +76,12 @@ status = "okay"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { @@ -102,9 +95,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -118,10 +113,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap similarity index 86% rename from app/boards/lowprokb/corneish_zen/corneish_zen.keymap rename to app/boards/arm/corneish_zen/corneish_zen.keymap index d53045eb..24c925e8 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -11,8 +11,8 @@ / { chosen { - zmk,physical-layout = &foostan_corne_6col_layout; - // zmk,physical-layout = &foostan_corne_5col_layout; + zmk,matrix_transform = &default_transform; + // zmk,matrix_transform = &five_column_transform; }; }; @@ -21,9 +21,9 @@ compatible = "zmk,keymap"; default_layer { - display-name = "QWERTY"; + label = "QWERTY"; // -------------------------------------------------------------------------------- -// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | GUI | LWR | SPC | | ENT | RSE | ALT | @@ -36,9 +36,9 @@ }; lower_layer { - display-name = "NUMBER"; + label = "NUMBER"; // ----------------------------------------------------------------------------------------- -// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC | +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | SHFT | | | | | | | | | | | | | // | GUI | | SPC | | ENT | | ALT | @@ -51,16 +51,16 @@ }; raise_layer { - display-name = "SYMBOL"; + label = "SYMBOL"; // ----------------------------------------------------------------------------------------- -// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC | +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | GUI | | SPC | | ENT | | ALT | bindings = < -&kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp BSPC -&kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE -&kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE +&kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC +&kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE +&kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen.yaml b/app/boards/arm/corneish_zen/corneish_zen.yaml similarity index 90% rename from app/boards/lowprokb/corneish_zen/corneish_zen.yaml rename to app/boards/arm/corneish_zen/corneish_zen.yaml index f4092f4f..7975b262 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen.yaml +++ b/app/boards/arm/corneish_zen/corneish_zen.yaml @@ -1,4 +1,4 @@ -identifier: corne-ish_zen +identifier: corne-ish_zen_v2 name: Corne-ish Zen v2 url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen type: mcu diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml similarity index 56% rename from app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml rename to app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml index 574664a2..1f6be20d 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml +++ b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml @@ -1,19 +1,15 @@ file_format: "1" -id: corneish_zen -name: Corneish Zen +id: corneish_zen_v1 +name: Corneish Zen v1 url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen type: board arch: arm features: - keys - display - - studio outputs: - usb - ble -revisions: - - 2.0.0 - - 1.0.0 siblings: - - corneish_zen_left//zmk - - corneish_zen_right//zmk + - corneish_zen_v1_left + - corneish_zen_v1_right diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_1_0_0.overlay b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts similarity index 93% rename from app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_1_0_0.overlay rename to app/boards/arm/corneish_zen/corneish_zen_v1_left.dts index 9b6617b1..399a564f 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_1_0_0.overlay +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts @@ -5,6 +5,7 @@ * */ +#include "corneish_zen.dtsi" /{ chosen { @@ -14,7 +15,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -38,6 +39,7 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; }; @@ -86,8 +88,9 @@ fuelgauge: bq274xx@55 { compatible = "ti,bq274xx"; + label = "BATTERY"; reg = <0x55>; - design-voltage = <3700>; //Battery Design Voltage in mV + design-voltage = <3700>; //Battery Design Volatge in mV design-capacity = <180>; //Battery Design Capacity in mAh taper-current = <2>; //Battery Taper current in mAh terminate-voltage = <2750>; //Battery Terminate Voltage in mV @@ -106,6 +109,7 @@ epd: il0323@0 { compatible = "gooddisplay,il0323"; reg = <0>; + label = "DISPLAY"; width = <80>; height = <128>; spi-max-frequency = <4000000>; diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_1_0_0_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig similarity index 89% rename from app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_1_0_0_defconfig rename to app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig index cba717e3..d7382556 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_1_0_0_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig @@ -3,6 +3,9 @@ # SPDX-License-Identifier: MIT # +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_LEFT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -41,13 +44,13 @@ CONFIG_ZMK_BLE=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y -CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=4096 +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 CONFIG_LV_Z_VDB_SIZE=100 CONFIG_LV_USE_THEME_MONO=y -# CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y CONFIG_LV_FONT_MONTSERRAT_26=y CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_1_0_0.overlay b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts similarity index 93% rename from app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_1_0_0.overlay rename to app/boards/arm/corneish_zen/corneish_zen_v1_right.dts index 20594856..d5f6e588 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_1_0_0.overlay +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts @@ -5,6 +5,8 @@ * */ +#include "corneish_zen.dtsi" + /{ chosen { zephyr,display = &epd; @@ -13,7 +15,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -37,6 +39,7 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; }; @@ -93,8 +96,9 @@ fuelgauge: bq274xx@55 { compatible = "ti,bq274xx"; + label = "BATTERY"; reg = <0x55>; - design-voltage = <3700>; //Battery Design Voltage in mV + design-voltage = <3700>; //Battery Design Volatge in mV design-capacity = <180>; //Battery Design Capacity in mAh taper-current = <2>; //Battery Taper current in mAh 2.1 terminate-voltage = <2750>; //Battery Terminate Voltage in mV @@ -113,6 +117,7 @@ epd: il0323@0 { compatible = "gooddisplay,il0323"; reg = <0>; + label = "DISPLAY"; width = <80>; height = <128>; spi-max-frequency = <4000000>; diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_1_0_0_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig similarity index 88% rename from app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_1_0_0_defconfig rename to app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig index e44e010a..5284159d 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_1_0_0_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig @@ -3,6 +3,9 @@ # SPDX-License-Identifier: MIT # +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_RIGHT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -36,18 +39,18 @@ CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y -CONFIG_ZMK_USB=n +CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y -CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=4096 +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 CONFIG_LV_Z_VDB_SIZE=100 CONFIG_LV_USE_THEME_MONO=y -# CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y CONFIG_LV_FONT_MONTSERRAT_26=y CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y diff --git a/app/boards/moergo/glove80/glove80.yaml b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml similarity index 51% rename from app/boards/moergo/glove80/glove80.yaml rename to app/boards/arm/corneish_zen/corneish_zen_v2.yaml index 90a5e133..46a213d9 100644 --- a/app/boards/moergo/glove80/glove80.yaml +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml @@ -1,19 +1,20 @@ -identifier: glove80 -name: Glove80 -url: https://www.moergo.com/ -type: mcu +identifier: corneish_zen_v2 +name: Corne-ish Zen v2 +type: keyboard arch: arm toolchain: - zephyr - gnuarmemb - xtools supported: - - adc - - usb_device - - ble - - ieee802154 - - pwm - - watchdog - gpio - i2c + - counter - spi + - usb_device + - lsm303dlhc + - nvs + - can + - kscan + - ble + - adc diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml new file mode 100644 index 00000000..37c1cef4 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: corneish_zen_v2 +name: Corneish Zen v2 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: board +arch: arm +features: + - keys + - display +outputs: + - usb + - ble +siblings: + - corneish_zen_v2_left + - corneish_zen_v2_right diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_2_0_0.overlay b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts similarity index 94% rename from app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_2_0_0.overlay rename to app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index a72c9be2..14d82e87 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_2_0_0.overlay +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -5,6 +5,8 @@ * */ +#include "corneish_zen.dtsi" + /{ chosen { zephyr,display = &epd; @@ -13,7 +15,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -37,11 +39,13 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; io-channels = <&adc 0>; output-ohms = <1960000>; full-ohms = <(1960000 + 810000)>; @@ -79,6 +83,7 @@ epd: il0323@0 { compatible = "gooddisplay,il0323"; reg = <0>; + label = "DISPLAY"; width = <80>; height = <128>; spi-max-frequency = <4000000>; diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_2_0_0_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig similarity index 89% rename from app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_2_0_0_defconfig rename to app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index a549c29c..29a5f878 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk_2_0_0_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -3,6 +3,9 @@ # SPDX-License-Identifier: MIT # +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V2_LEFT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -37,13 +40,13 @@ CONFIG_ZMK_BLE=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y -CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=4096 +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 CONFIG_LV_Z_VDB_SIZE=100 CONFIG_LV_USE_THEME_MONO=y -# CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y CONFIG_LV_FONT_MONTSERRAT_26=y CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_2_0_0.overlay b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts similarity index 94% rename from app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_2_0_0.overlay rename to app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index dc8ef626..4d444cae 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_2_0_0.overlay +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -5,6 +5,8 @@ * */ +#include "corneish_zen.dtsi" + /{ chosen { zephyr,display = &epd; @@ -13,7 +15,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -37,11 +39,13 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; io-channels = <&adc 0>; output-ohms = <1960000>; full-ohms = <(1960000 + 810000)>; @@ -86,6 +90,7 @@ epd: il0323@0 { compatible = "gooddisplay,il0323"; reg = <0>; + label = "DISPLAY"; width = <80>; height = <128>; spi-max-frequency = <4000000>; diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_2_0_0_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig similarity index 88% rename from app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_2_0_0_defconfig rename to app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 63b098e1..506aa67e 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk_2_0_0_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -3,6 +3,9 @@ # SPDX-License-Identifier: MIT # +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -32,18 +35,18 @@ CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y -CONFIG_ZMK_USB=n +CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y -CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=4096 +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 CONFIG_LV_Z_VDB_SIZE=100 CONFIG_LV_USE_THEME_MONO=y -# CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y CONFIG_LV_FONT_MONTSERRAT_26=y CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y diff --git a/app/boards/lowprokb/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c similarity index 92% rename from app/boards/lowprokb/corneish_zen/custom_status_screen.c rename to app/boards/arm/corneish_zen/custom_status_screen.c index 86c1a226..492239c8 100644 --- a/app/boards/lowprokb/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -56,9 +56,9 @@ lv_obj_t *zmk_display_status_screen() { #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) lv_obj_t *LayersHeading; - LayersHeading = lv_image_create(screen); + LayersHeading = lv_img_create(screen); lv_obj_align(LayersHeading, LV_ALIGN_BOTTOM_MID, 0, -30); - lv_image_set_src(LayersHeading, &layers2); + lv_img_set_src(LayersHeading, &layers2); zmk_widget_layer_status_init(&layer_status_widget, screen); lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), @@ -68,8 +68,8 @@ lv_obj_t *zmk_display_status_screen() { #if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) lv_obj_t *zenlogo_icon; - zenlogo_icon = lv_image_create(screen); - lv_image_set_src(zenlogo_icon, &zenlogo); + zenlogo_icon = lv_img_create(screen); + lv_img_set_src(zenlogo_icon, &zenlogo); lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 0, -5); #endif diff --git a/app/boards/lowprokb/corneish_zen/custom_status_screen.h b/app/boards/arm/corneish_zen/custom_status_screen.h similarity index 100% rename from app/boards/lowprokb/corneish_zen/custom_status_screen.h rename to app/boards/arm/corneish_zen/custom_status_screen.h diff --git a/app/boards/lowprokb/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c similarity index 76% rename from app/boards/lowprokb/corneish_zen/widgets/battery_status.c rename to app/boards/arm/corneish_zen/widgets/battery_status.c index 044d3cee..9a2189d1 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/battery_status.c +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -6,12 +6,12 @@ */ #include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include -#include #include "battery_status.h" #include #include @@ -45,17 +45,17 @@ static void set_battery_symbol(lv_obj_t *icon, struct battery_status_state state #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) if (level > 95) { - lv_image_set_src(icon, state.usb_present ? &batt_100_chg : &batt_100); + lv_img_set_src(icon, state.usb_present ? &batt_100_chg : &batt_100); } else if (level > 74) { - lv_image_set_src(icon, state.usb_present ? &batt_75_chg : &batt_75); + lv_img_set_src(icon, state.usb_present ? &batt_75_chg : &batt_75); } else if (level > 49) { - lv_image_set_src(icon, state.usb_present ? &batt_50_chg : &batt_50); + lv_img_set_src(icon, state.usb_present ? &batt_50_chg : &batt_50); } else if (level > 24) { - lv_image_set_src(icon, state.usb_present ? &batt_25_chg : &batt_25); + lv_img_set_src(icon, state.usb_present ? &batt_25_chg : &batt_25); } else if (level > 5) { - lv_image_set_src(icon, state.usb_present ? &batt_5_chg : &batt_5); + lv_img_set_src(icon, state.usb_present ? &batt_5_chg : &batt_5); } else { - lv_image_set_src(icon, state.usb_present ? &batt_0_chg : &batt_0); + lv_img_set_src(icon, state.usb_present ? &batt_0_chg : &batt_0); } #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ } @@ -66,10 +66,8 @@ void battery_status_update_cb(struct battery_status_state state) { } static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { - const struct zmk_battery_state_changed *ev = as_zmk_battery_state_changed(eh); - - return (struct battery_status_state){ - .level = (ev != NULL) ? ev->state_of_charge : zmk_battery_state_of_charge(), + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) .usb_present = zmk_usb_is_powered(), #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ @@ -85,7 +83,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_image_create(parent); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); diff --git a/app/boards/lowprokb/corneish_zen/widgets/battery_status.h b/app/boards/arm/corneish_zen/widgets/battery_status.h similarity index 100% rename from app/boards/lowprokb/corneish_zen/widgets/battery_status.h rename to app/boards/arm/corneish_zen/widgets/battery_status.h diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/CMakeLists.txt b/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt similarity index 100% rename from app/boards/lowprokb/corneish_zen/widgets/icons/CMakeLists.txt rename to app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/USB_connected.c b/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c similarity index 84% rename from app/boards/lowprokb/corneish_zen/widgets/icons/USB_connected.c rename to app/boards/arm/corneish_zen/widgets/icons/USB_connected.c index 266eaead..b3b60422 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/USB_connected.c +++ b/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c @@ -31,15 +31,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_USB_CONNECTED uint8_t USB_connecte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t USB_connected = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(USB_connected_map), +const lv_img_dsc_t USB_connected = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 164, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = USB_connected_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0.c b/app/boards/arm/corneish_zen/widgets/icons/batt_0.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_0.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_0.c index 4df34e65..a6066b95 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_0.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0 ui 0x00, 0x00, 0x7c, 0x00, 0x00, }; -const lv_image_dsc_t batt_0 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_0_map), +const lv_img_dsc_t batt_0 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_0_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_0_chg.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c index 95fd4eae..368ba288 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0_chg.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0_CH 0x00, 0x10, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_0_chg = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_0_chg_map), +const lv_img_dsc_t batt_0_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_0_chg_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100.c b/app/boards/arm/corneish_zen/widgets/icons/batt_100.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_100.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_100.c index 975508c2..e6aa27ba 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_100.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_100 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_100_map), +const lv_img_dsc_t batt_100 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_100_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_100_chg.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c index 7c8b739a..9b2c18d4 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100_chg.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100_ 0x00, 0x10, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_100_chg = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_100_chg_map), +const lv_img_dsc_t batt_100_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_100_chg_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25.c b/app/boards/arm/corneish_zen/widgets/icons/batt_25.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_25.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_25.c index aae7338f..2445ef39 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_25.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25 u 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_25 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_25_map), +const lv_img_dsc_t batt_25 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_25_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_25_chg.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c index 0e1852ee..37c30812 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25_chg.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25_C 0x00, 0x10, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_25_chg = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_25_chg_map), +const lv_img_dsc_t batt_25_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_25_chg_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5.c b/app/boards/arm/corneish_zen/widgets/icons/batt_5.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_5.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_5.c index e9427a8e..e9824572 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_5.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5 ui 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_5 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_5_map), +const lv_img_dsc_t batt_5 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_5_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50.c b/app/boards/arm/corneish_zen/widgets/icons/batt_50.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_50.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_50.c index 1e606bfc..bbb0af48 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_50.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50 u 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_50 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_50_map), +const lv_img_dsc_t batt_50 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_50_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_50_chg.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c index 9e31d934..c2ced92e 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50_chg.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50_C 0x00, 0x10, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_50_chg = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_50_chg_map), +const lv_img_dsc_t batt_50_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_50_chg_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_5_chg.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c index 5ed20b10..6a6d9d44 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5_chg.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5_CH 0x00, 0x10, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_5_chg = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_5_chg_map), +const lv_img_dsc_t batt_5_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_5_chg_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75.c b/app/boards/arm/corneish_zen/widgets/icons/batt_75.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_75.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_75.c index eaa78c75..9918386d 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_75.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75 u 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_75 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_75_map), +const lv_img_dsc_t batt_75 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_75_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c similarity index 85% rename from app/boards/lowprokb/corneish_zen/widgets/icons/batt_75_chg.c rename to app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c index 5b2d796d..422aaabc 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75_chg.c +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c @@ -33,15 +33,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75_C 0x00, 0x10, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t batt_75_chg = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 40, - .h = 31, - .stride = 5, - }, - .data_size = sizeof(batt_75_chg_map), +const lv_img_dsc_t batt_75_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = batt_75_chg_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c similarity index 83% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c index b57b59c8..daeee223 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c @@ -32,15 +32,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_advertising = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 29, - .h = 35, - .stride = 4, - }, - .data_size = sizeof(bluetooth_advertising_map), +const lv_img_dsc_t bluetooth_advertising = { + .header.always_zero = 0, + .header.w = 29, + .header.h = 35, + .data_size = 148, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_advertising_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_1.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_1.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c index 28a65ac2..cf5b8197 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_1.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_advertising_1 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_advertising_1_map), +const lv_img_dsc_t bluetooth_advertising_1 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_advertising_1_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_2.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_2.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c index 4c7447cc..184a5ce8 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_2.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_advertising_2 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_advertising_2_map), +const lv_img_dsc_t bluetooth_advertising_2 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_advertising_2_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_3.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_3.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c index e2072eec..e9665ff9 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_3.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_advertising_3 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_advertising_3_map), +const lv_img_dsc_t bluetooth_advertising_3 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_advertising_3_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_4.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_4.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c index a9231077..d591f17f 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_4.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_advertising_4 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_advertising_4_map), +const lv_img_dsc_t bluetooth_advertising_4 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_advertising_4_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_5.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_5.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c index 53cb3789..88213158 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_5.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_advertising_5 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_advertising_5_map), +const lv_img_dsc_t bluetooth_advertising_5 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_advertising_5_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_1.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_1.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c index 179b7f6f..a3cb5a2c 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_1.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_connected_1 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_connected_1_map), +const lv_img_dsc_t bluetooth_connected_1 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_connected_1_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_2.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_2.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c index 29122930..2ce5b939 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_2.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_connected_2 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_connected_2_map), +const lv_img_dsc_t bluetooth_connected_2 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_connected_2_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_3.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_3.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c index c25c163b..edac091f 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_3.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_connected_3 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_connected_3_map), +const lv_img_dsc_t bluetooth_connected_3 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_connected_3_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_4.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_4.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c index 83ae53c2..e79d6cb6 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_4.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_connected_4 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_connected_4_map), +const lv_img_dsc_t bluetooth_connected_4 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_connected_4_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_5.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_5.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c index 9dbbcea9..b567aa2d 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_5.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c @@ -37,15 +37,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_connected_5 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_connected_5_map), +const lv_img_dsc_t bluetooth_connected_5 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_connected_5_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_right.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_right.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c index 6e14c17b..2a28a903 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_right.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c @@ -39,15 +39,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_connected_right = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_connected_right_map), +const lv_img_dsc_t bluetooth_connected_right = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 253, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_connected_right_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_disconnected_right.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c similarity index 88% rename from app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_disconnected_right.c rename to app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c index 71c67957..37974d69 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_disconnected_right.c +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c @@ -39,15 +39,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t bluetooth_disconnected_right = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 54, - .h = 35, - .stride = 7, - }, - .data_size = sizeof(bluetooth_disconnected_right_map), +const lv_img_dsc_t bluetooth_disconnected_right = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 253, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = bluetooth_disconnected_right_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/layers.c b/app/boards/arm/corneish_zen/widgets/icons/layers.c similarity index 86% rename from app/boards/lowprokb/corneish_zen/widgets/icons/layers.c rename to app/boards/arm/corneish_zen/widgets/icons/layers.c index d6f4baab..86bc8dfc 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/layers.c +++ b/app/boards/arm/corneish_zen/widgets/icons/layers.c @@ -34,15 +34,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LAYERS ui 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t layers = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 35, - .h = 35, - .stride = 5, - }, - .data_size = sizeof(layers_map), +const lv_img_dsc_t layers = { + .header.always_zero = 0, + .header.w = 35, + .header.h = 35, + .data_size = 183, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = layers_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/layers2.c b/app/boards/arm/corneish_zen/widgets/icons/layers2.c similarity index 83% rename from app/boards/lowprokb/corneish_zen/widgets/icons/layers2.c rename to app/boards/arm/corneish_zen/widgets/icons/layers2.c index 53f6a445..068b0757 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/layers2.c +++ b/app/boards/arm/corneish_zen/widgets/icons/layers2.c @@ -30,15 +30,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LAYERS2 u 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t layers2 = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 78, - .h = 12, - .stride = 10, - }, - .data_size = sizeof(layers2_map), +const lv_img_dsc_t layers2 = { + .header.always_zero = 0, + .header.w = 78, + .header.h = 12, + .data_size = 128, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = layers2_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/icons/zenlogo.c b/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c similarity index 92% rename from app/boards/lowprokb/corneish_zen/widgets/icons/zenlogo.c rename to app/boards/arm/corneish_zen/widgets/icons/zenlogo.c index 677df489..cc424041 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/icons/zenlogo.c +++ b/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c @@ -48,15 +48,11 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ZENLOGO u 0x00, 0x00, 0x00, 0x00, 0x00, }; -const lv_image_dsc_t zenlogo = { - .header = - { - .magic = LV_IMAGE_HEADER_MAGIC, - .cf = LV_COLOR_FORMAT_I1, - .w = 80, - .h = 38, - .stride = 10, - }, - .data_size = sizeof(zenlogo_map), +const lv_img_dsc_t zenlogo = { + .header.always_zero = 0, + .header.w = 80, + .header.h = 38, + .data_size = 388, + .header.cf = LV_IMG_CF_INDEXED_1BIT, .data = zenlogo_map, }; diff --git a/app/boards/lowprokb/corneish_zen/widgets/layer_status.c b/app/boards/arm/corneish_zen/widgets/layer_status.c similarity index 81% rename from app/boards/lowprokb/corneish_zen/widgets/layer_status.c rename to app/boards/arm/corneish_zen/widgets/layer_status.c index 002ce46b..3dc33613 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/layer_status.c +++ b/app/boards/arm/corneish_zen/widgets/layer_status.c @@ -19,15 +19,15 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct layer_status_state { - zmk_keymap_layer_index_t index; + uint8_t index; const char *label; }; static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { const char *layer_label = state.label; - zmk_keymap_layer_index_t active_layer_index = state.index; + uint8_t active_layer_index = state.index; - if (layer_label == NULL || strlen(layer_label) == 0) { + if (layer_label == NULL) { char text[6] = {}; sprintf(text, " %i", active_layer_index); @@ -44,9 +44,8 @@ static void layer_status_update_cb(struct layer_status_state state) { } static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { - zmk_keymap_layer_index_t index = zmk_keymap_highest_layer_active(); - return (struct layer_status_state){ - .index = index, .label = zmk_keymap_layer_name(zmk_keymap_layer_index_to_id(index))}; + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; } ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, diff --git a/app/boards/lowprokb/corneish_zen/widgets/layer_status.h b/app/boards/arm/corneish_zen/widgets/layer_status.h similarity index 100% rename from app/boards/lowprokb/corneish_zen/widgets/layer_status.h rename to app/boards/arm/corneish_zen/widgets/layer_status.h diff --git a/app/boards/lowprokb/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c similarity index 80% rename from app/boards/lowprokb/corneish_zen/widgets/output_status.c rename to app/boards/arm/corneish_zen/widgets/output_status.c index 50bd4fad..8e9457eb 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/output_status.c +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -45,7 +45,7 @@ struct output_status_state { static struct output_status_state get_state(const zmk_event_t *_eh) { return (struct output_status_state){ - .selected_endpoint = zmk_endpoint_get_selected(), + .selected_endpoint = zmk_endpoints_selected(), .active_profile_connected = zmk_ble_active_profile_is_connected(), .active_profile_bonded = !zmk_ble_active_profile_is_open(), }; @@ -54,7 +54,7 @@ static struct output_status_state get_state(const zmk_event_t *_eh) { static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) { switch (state.selected_endpoint.transport) { case ZMK_TRANSPORT_USB: - lv_image_set_src(icon, &USB_connected); + lv_img_set_src(icon, &USB_connected); break; case ZMK_TRANSPORT_BLE: if (state.active_profile_bonded) { @@ -62,40 +62,40 @@ static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) // sprintf(text, LV_SYMBOL_BLUETOOTH "%i " LV_SYMBOL_OK, active_profile_index); switch (state.selected_endpoint.ble.profile_index) { case 0: - lv_image_set_src(icon, &bluetooth_connected_1); + lv_img_set_src(icon, &bluetooth_connected_1); break; case 1: - lv_image_set_src(icon, &bluetooth_connected_2); + lv_img_set_src(icon, &bluetooth_connected_2); break; case 2: - lv_image_set_src(icon, &bluetooth_connected_3); + lv_img_set_src(icon, &bluetooth_connected_3); break; case 3: - lv_image_set_src(icon, &bluetooth_connected_4); + lv_img_set_src(icon, &bluetooth_connected_4); break; case 4: - lv_image_set_src(icon, &bluetooth_connected_5); + lv_img_set_src(icon, &bluetooth_connected_5); break; } } else { - lv_image_set_src(icon, &bluetooth_disconnected_right); + lv_img_set_src(icon, &bluetooth_disconnected_right); } } else { switch (state.selected_endpoint.ble.profile_index) { case 0: - lv_image_set_src(icon, &bluetooth_advertising_1); + lv_img_set_src(icon, &bluetooth_advertising_1); break; case 1: - lv_image_set_src(icon, &bluetooth_advertising_2); + lv_img_set_src(icon, &bluetooth_advertising_2); break; case 2: - lv_image_set_src(icon, &bluetooth_advertising_3); + lv_img_set_src(icon, &bluetooth_advertising_3); break; case 3: - lv_image_set_src(icon, &bluetooth_advertising_4); + lv_img_set_src(icon, &bluetooth_advertising_4); break; case 4: - lv_image_set_src(icon, &bluetooth_advertising_5); + lv_img_set_src(icon, &bluetooth_advertising_5); break; } } @@ -118,7 +118,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_image_create(parent); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/lowprokb/corneish_zen/widgets/output_status.h b/app/boards/arm/corneish_zen/widgets/output_status.h similarity index 100% rename from app/boards/lowprokb/corneish_zen/widgets/output_status.h rename to app/boards/arm/corneish_zen/widgets/output_status.h diff --git a/app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c b/app/boards/arm/corneish_zen/widgets/peripheral_status.c similarity index 89% rename from app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c rename to app/boards/arm/corneish_zen/widgets/peripheral_status.c index 0f7c7c6d..39b62fde 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -6,6 +6,7 @@ */ #include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -32,8 +33,8 @@ static struct peripheral_status_state get_state(const zmk_event_t *_eh) { static void set_status_symbol(lv_obj_t *icon, struct peripheral_status_state state) { LOG_DBG("halves connected? %s", state.connected ? "true" : "false"); - lv_image_set_src(icon, - state.connected ? &bluetooth_connected_right : &bluetooth_disconnected_right); + lv_img_set_src(icon, + state.connected ? &bluetooth_connected_right : &bluetooth_disconnected_right); } static void output_status_update_cb(struct peripheral_status_state state) { @@ -47,7 +48,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_image_create(parent); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/lowprokb/corneish_zen/widgets/peripheral_status.h b/app/boards/arm/corneish_zen/widgets/peripheral_status.h similarity index 100% rename from app/boards/lowprokb/corneish_zen/widgets/peripheral_status.h rename to app/boards/arm/corneish_zen/widgets/peripheral_status.h diff --git a/app/boards/arm/dz60rgb/Kconfig.board b/app/boards/arm/dz60rgb/Kconfig.board new file mode 100644 index 00000000..ba09e2dd --- /dev/null +++ b/app/boards/arm/dz60rgb/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_DZ60RGB_REV1 + bool "DZ60RGB Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/dz60rgb/Kconfig.defconfig b/app/boards/arm/dz60rgb/Kconfig.defconfig new file mode 100644 index 00000000..6e059256 --- /dev/null +++ b/app/boards/arm/dz60rgb/Kconfig.defconfig @@ -0,0 +1,11 @@ +# DZ60RGB keyboard configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_DZ60RGB_REV1 + +config ZMK_KEYBOARD_NAME + default "DZ60RGB Rev 1" + +endif # BOARD_DZ60RGB_REV1 diff --git a/app/boards/qmk/proton_c/board.cmake b/app/boards/arm/dz60rgb/board.cmake similarity index 100% rename from app/boards/qmk/proton_c/board.cmake rename to app/boards/arm/dz60rgb/board.cmake diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts new file mode 100644 index 00000000..14be837d --- /dev/null +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include + +#include + +/ { + model = "DZ60RGB, Rev 1"; + compatible = "dz60rgb,rev1", "st,stm32f303"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) +RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,13) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpioa 6 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + , <&gpiob 13 GPIO_ACTIVE_HIGH> + , <&gpiob 15 GPIO_ACTIVE_HIGH> + , <&gpioa 8 GPIO_ACTIVE_HIGH> + , <&gpioa 15 GPIO_ACTIVE_HIGH> + , <&gpiob 3 GPIO_ACTIVE_HIGH> + , <&gpiob 4 GPIO_ACTIVE_HIGH> + , <&gpiob 5 GPIO_ACTIVE_HIGH> + , <&gpiob 8 GPIO_ACTIVE_HIGH> + , <&gpiob 9 GPIO_ACTIVE_HIGH> + , <&gpioc 13 GPIO_ACTIVE_HIGH> + , <&gpioc 14 GPIO_ACTIVE_HIGH> + ; + }; + +}; + +&usb { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; +}; diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap new file mode 100644 index 00000000..e8cc6a7a --- /dev/null +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap @@ -0,0 +1,25 @@ +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | +// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | +// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | +// | SHIFT | Z | X | C | V | B | N | M | , | . | SHIFT(/) | ^ | DEL | +// | CTL | WIN | ALT | SPACE | ALT | MO(1) | <- | v | -> | +// ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT + >; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/kinesis/adv360pro/adv360pro.yaml b/app/boards/arm/dz60rgb/dz60rgb_rev1.yaml similarity index 70% rename from app/boards/kinesis/adv360pro/adv360pro.yaml rename to app/boards/arm/dz60rgb/dz60rgb_rev1.yaml index 2d555d4e..d2836218 100644 --- a/app/boards/kinesis/adv360pro/adv360pro.yaml +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.yaml @@ -1,19 +1,19 @@ -identifier: adv360pro -name: Advantage 360 Pro +identifier: DZ60RGB_rev1 +name: DZ60RGBREV1 type: keyboard arch: arm toolchain: - zephyr - gnuarmemb - xtools +ram: 40 supported: - gpio - i2c - counter - spi - usb_device + - lsm303dlhc - nvs - can - kscan - - ble - - pwm diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig b/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig new file mode 100644 index 00000000..53bc0e11 --- /dev/null +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_STM32F3X=y +CONFIG_SOC_STM32F303XC=y +# 72MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 + +# enable pinmux +CONFIG_PINMUX=y + +# enable GPIO +CONFIG_GPIO=y + +# clock configuration +CONFIG_CLOCK_CONTROL=y + +# Clock configuration for Cube Clock control driver +CONFIG_CLOCK_STM32_HSE_CLOCK=8000000 +CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y +# use HSE as PLL input +CONFIG_CLOCK_STM32_PLL_SRC_HSE=y +# produce 72MHz clock at PLL output +CONFIG_CLOCK_STM32_PLL_PREDIV=1 +CONFIG_CLOCK_STM32_PLL_MULTIPLIER=9 +CONFIG_CLOCK_STM32_AHB_PRESCALER=1 +CONFIG_CLOCK_STM32_APB1_PRESCALER=2 +CONFIG_CLOCK_STM32_APB2_PRESCALER=1 + +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/ferris/Kconfig.board b/app/boards/arm/ferris/Kconfig.board new file mode 100644 index 00000000..70ee895d --- /dev/null +++ b/app/boards/arm/ferris/Kconfig.board @@ -0,0 +1,8 @@ +# Ferris board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_FERRIS + bool "Ferris rev 0.2" + depends on SOC_STM32F072XB diff --git a/app/boards/pierrechevalier83/ferris/Kconfig.defconfig b/app/boards/arm/ferris/Kconfig.defconfig similarity index 85% rename from app/boards/pierrechevalier83/ferris/Kconfig.defconfig rename to app/boards/arm/ferris/Kconfig.defconfig index 1c8ed02c..420ea01f 100644 --- a/app/boards/pierrechevalier83/ferris/Kconfig.defconfig +++ b/app/boards/arm/ferris/Kconfig.defconfig @@ -5,6 +5,9 @@ if BOARD_FERRIS +config BOARD + default "ferris_rev02" + config ZMK_KEYBOARD_NAME default "Ferris rev 0.2" diff --git a/app/boards/pierrechevalier83/ferris/README.md b/app/boards/arm/ferris/README.md similarity index 79% rename from app/boards/pierrechevalier83/ferris/README.md rename to app/boards/arm/ferris/README.md index 3dbfb1ba..b6fdcdf2 100644 --- a/app/boards/pierrechevalier83/ferris/README.md +++ b/app/boards/arm/ferris/README.md @@ -3,7 +3,7 @@ ## Standard Build ``` -west build -p -d build/ferris --board ferris +west build -p -d build/ferris --board ferris_rev02 ``` ## Flashing diff --git a/app/boards/pierrechevalier83/ferris/board.cmake b/app/boards/arm/ferris/board.cmake similarity index 100% rename from app/boards/pierrechevalier83/ferris/board.cmake rename to app/boards/arm/ferris/board.cmake diff --git a/app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk.dts b/app/boards/arm/ferris/ferris_rev02.dts similarity index 74% rename from app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk.dts rename to app/boards/arm/ferris/ferris_rev02.dts index c49ae602..618a5591 100644 --- a/app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -10,12 +10,6 @@ #include -#include - -&cuddlykeyboards_ferris_layout { - transform = <&matrix_transform0>; -}; - / { model = "Ferris rev0.2"; compatible = "ferris,rev02", "st,stm32f072"; @@ -23,14 +17,15 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; - zmk,kscan = &kscan0; - zmk,physical-layout = &cuddlykeyboards_ferris_layout; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,matrix_transform = &transform; /* TODO: Enable once we support the IC for underglow zmk,underglow = &led_strip; */ }; - matrix_transform0: matrix_transform0 { + transform: transform { compatible = "zmk,matrix-transform"; rows = <4>; columns = <10>; @@ -43,8 +38,9 @@ >; }; - kscan0: kscan0 { + kscan: kscan { compatible = "zmk,kscan-composite"; + label = "KSCAN"; rows = <4>; columns = <10>; @@ -54,12 +50,13 @@ right { kscan = <&kscan_right>; - col-offset = <5>; + column-offset = <5>; }; }; kscan_left: kscan_left { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_LEFT"; diode-direction = "col2row"; @@ -80,6 +77,7 @@ kscan_right: kscan_right { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_RIGHT"; diode-direction = "row2col"; @@ -106,7 +104,7 @@ clock-frequency = ; right_io: mcp23017@20 { - compatible = "microchip,mcp23017"; + compatible = "microchip,mcp230xx"; status = "okay"; gpio-controller; reg = <0x20>; @@ -115,24 +113,18 @@ }; }; -zephyr_udc0: &usb { +&usb { status = "okay"; - - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - - // Overridden to lower RAM usage. - num-bidir-endpoints = <4>; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { status = "okay"; }; -&clk_hsi48 { - status = "okay"; -}; - &pll { prediv = <1>; mul = <6>; @@ -147,37 +139,9 @@ zephyr_udc0: &usb { apb1-prescaler = <1>; }; + &rtc { - clocks = <&rcc STM32_CLOCK_BUS_APB1 0x10000000>, - <&rcc STM32_SRC_LSI RTC_SEL(2)>; status = "okay"; - - backup_regs { - status = "okay"; - }; -}; - -&bbram { - status = "okay"; - - retainedmem0: retainedmem { - compatible = "zephyr,retained-bbram"; - status = "okay"; - #address-cells = <1>; - #size-cells = <1>; - - retention0: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; -}; - -/ { - chosen { - zephyr,boot-mode = &retention0; - }; }; &flash0 { @@ -192,6 +156,7 @@ zephyr_udc0: &usb { /* Set 6Kb of storage at the end of the 128Kb of flash */ storage_partition: partition@3e800 { + label = "storage"; reg = <0x0001e800 0x00001800>; }; }; diff --git a/app/boards/pierrechevalier83/ferris/ferris.keymap b/app/boards/arm/ferris/ferris_rev02.keymap similarity index 93% rename from app/boards/pierrechevalier83/ferris/ferris.keymap rename to app/boards/arm/ferris/ferris_rev02.keymap index 1e686a6d..18fad423 100644 --- a/app/boards/pierrechevalier83/ferris/ferris.keymap +++ b/app/boards/arm/ferris/ferris_rev02.keymap @@ -4,8 +4,6 @@ * SPDX-License-Identifier: MIT */ -#undef ZMK_BEHAVIORS_KEEP_ALL - #include #include #include @@ -16,14 +14,15 @@ #define SYM_L 4 // Using layer taps on thumbs, having quick tap as well helps w/ repeating space/backspace -< { quick-tap-ms = <200>; }; +< { quick_tap_ms = <200>; }; / { behaviors { hm: homerow_mods { compatible = "zmk,behavior-hold-tap"; + label = "homerow mods"; #binding-cells = <2>; - tapping-term-ms = <200>; + tapping_term_ms = <200>; flavor = "tap-preferred"; bindings = <&kp>, <&kp>; }; @@ -35,16 +34,16 @@ default_layer { bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp H &hm RSHFT J &hm RCTRL K &hm LALT L &hm LGUI SQT + &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp H &hm RSHFT J &hm RCTRL K &hm LALT L &hm LGUI QUOT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH - < NAV_L TAB &kp ENTER < NUM_L SPACE < SYM_L BSPC + < NAV_L TAB &kp ENTER < NUM_L SPACE < SYM_L BKSP >; }; nav_layer { bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT + &trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp UARW &kp RARW &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &trans &trans &kp ESC &kp DEL >; diff --git a/app/boards/pierrechevalier83/ferris/ferris.yaml b/app/boards/arm/ferris/ferris_rev02.yaml similarity index 83% rename from app/boards/pierrechevalier83/ferris/ferris.yaml rename to app/boards/arm/ferris/ferris_rev02.yaml index d2dbfa0a..f4cbdcaf 100644 --- a/app/boards/pierrechevalier83/ferris/ferris.yaml +++ b/app/boards/arm/ferris/ferris_rev02.yaml @@ -1,4 +1,4 @@ -identifier: ferris +identifier: ferris_rev02 name: Ferris 0.2 type: mcu arch: arm diff --git a/app/boards/pierrechevalier83/ferris/ferris.zmk.yml b/app/boards/arm/ferris/ferris_rev02.zmk.yml similarity index 90% rename from app/boards/pierrechevalier83/ferris/ferris.zmk.yml rename to app/boards/arm/ferris/ferris_rev02.zmk.yml index 68919fe5..da3a7f53 100644 --- a/app/boards/pierrechevalier83/ferris/ferris.zmk.yml +++ b/app/boards/arm/ferris/ferris_rev02.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: ferris//zmk +id: ferris_rev02 name: Ferris 0.2 type: board arch: arm diff --git a/app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk_defconfig b/app/boards/arm/ferris/ferris_rev02_defconfig similarity index 81% rename from app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk_defconfig rename to app/boards/arm/ferris/ferris_rev02_defconfig index eb55b019..267035c9 100644 --- a/app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -1,9 +1,12 @@ # SPDX-License-Identifier: MIT +CONFIG_BOARD_FERRIS=y +CONFIG_SOC_SERIES_STM32F0X=y +CONFIG_SOC_STM32F072XB=y # 48MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=48000000 -# enable PINCTRL +# enable PINMUX CONFIG_PINCTRL=y # enable GPIO diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.board b/app/boards/arm/kbdfans_tofu65/Kconfig.board new file mode 100644 index 00000000..954166b7 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_KBDFANS_TOFU65_V2 + bool "KBDfans Tofu65 2.0" + depends on SOC_RP2040 diff --git a/app/boards/kbdfans/tofu65/Kconfig.defconfig b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig similarity index 74% rename from app/boards/kbdfans/tofu65/Kconfig.defconfig rename to app/boards/arm/kbdfans_tofu65/Kconfig.defconfig index 0a524c4e..0444f510 100644 --- a/app/boards/kbdfans/tofu65/Kconfig.defconfig +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_TOFU65 +if BOARD_KBDFANS_TOFU65_V2 config ZMK_KEYBOARD_NAME default "kbdfans tofu65" @@ -9,4 +9,4 @@ config ZMK_KEYBOARD_NAME config RP2_FLASH_W25Q080 default y -endif # BOARD_TOFU65 +endif # BOARD_KBDFANS_TOFU65_V2 diff --git a/app/boards/kbdfans/tofu65/tofu65_rp2040_zmk.dts b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts similarity index 87% rename from app/boards/kbdfans/tofu65/tofu65_rp2040_zmk.dts rename to app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts index d1249c83..261ffbf4 100644 --- a/app/boards/kbdfans/tofu65/tofu65_rp2040_zmk.dts +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts @@ -5,22 +5,25 @@ /dts-v1/; -#include -#include - +#include #include -#include - / { chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; - zephyr,flash-controller = &ssi; + zephyr,console = &cdc_acm_uart; + zephyr,shell-uart = &cdc_acm_uart; zephyr,code-partition = &code_partition; zmk,kscan = &kscan0; - zmk,physical-layout = &layout_65_ansi; + zmk,matrix_transform = &default_transform; + }; + + xtal_clk: xtal-clk { + compatible = "fixed-clock"; + clock-frequency = <12000000>; + #clock-cells = <0>; }; default_transform: keymap_transform_0 { @@ -50,6 +53,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -89,6 +93,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) /* Reserved memory for the second stage bootloader */ second_stage_bootloader: partition@0 { + label = "second_stage_bootloader"; reg = <0x00000000 0x100>; read-only; }; @@ -98,34 +103,23 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) * size is 16MB minus the 0x100 bytes taken by the bootloader. */ code_partition: partition@100 { + label = "code"; reg = <0x100 (DT_SIZE_M(16) - 0x100)>; read-only; }; }; }; -&timer { + +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + }; }; -&rtc { - clocks = <&clocks RPI_PICO_CLKID_CLK_RTC>; - status = "okay"; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -&vreg { - regulator-always-on; - regulator-allowed-modes = ; -}; &gpio0 { status = "okay"; }; -&layout_65_ansi { - transform = <&default_transform>; -}; diff --git a/app/boards/kbdfans/tofu65/tofu65.keymap b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap similarity index 100% rename from app/boards/kbdfans/tofu65/tofu65.keymap rename to app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap diff --git a/app/boards/kbdfans/tofu65/tofu65.yaml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml similarity index 84% rename from app/boards/kbdfans/tofu65/tofu65.yaml rename to app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml index 458b157f..e1089766 100644 --- a/app/boards/kbdfans/tofu65/tofu65.yaml +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml @@ -1,4 +1,4 @@ -identifier: tofu65 +identifier: kbdfans_tofu65_v2 name: KBDfans Tofu65 2.0 type: mcu arch: arm diff --git a/app/boards/kbdfans/tofu65/tofu65.zmk.yml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml similarity index 88% rename from app/boards/kbdfans/tofu65/tofu65.zmk.yml rename to app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml index fd24d183..382e7dd3 100644 --- a/app/boards/kbdfans/tofu65/tofu65.zmk.yml +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: tofu65//zmk +id: kbdfans_tofu65_v2 name: KBDfans Tofu65 2.0 type: board arch: arm diff --git a/app/boards/kbdfans/tofu65/tofu65_rp2040_zmk_defconfig b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig similarity index 83% rename from app/boards/kbdfans/tofu65/tofu65_rp2040_zmk_defconfig rename to app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig index a0ac1c3b..57014acf 100644 --- a/app/boards/kbdfans/tofu65/tofu65_rp2040_zmk_defconfig +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig @@ -1,6 +1,10 @@ # Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_RP2XXX=y +CONFIG_SOC_RP2040=y +CONFIG_BOARD_KBDFANS_TOFU65_V2=y + CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 # Enable USB CDC ACM logging for debugging @@ -8,7 +12,6 @@ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 # Enable reset by default CONFIG_RESET=y -CONFIG_CLOCK_CONTROL=y # Code partition needed to target the correct flash range CONFIG_USE_DT_CODE_PARTITION=y diff --git a/app/boards/moergo/glove80/CMakeLists.txt b/app/boards/arm/mikoto/CMakeLists.txt similarity index 56% rename from app/boards/moergo/glove80/CMakeLists.txt rename to app/boards/arm/mikoto/CMakeLists.txt index 3eb2cd27..12cf9b1c 100644 --- a/app/boards/moergo/glove80/CMakeLists.txt +++ b/app/boards/arm/mikoto/CMakeLists.txt @@ -1,3 +1,6 @@ + +if(CONFIG_PINMUX) zephyr_library() -zephyr_library_sources(usb_serial_number.c) +zephyr_library_sources(pinmux.c) zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) +endif() \ No newline at end of file diff --git a/app/module/boards/zhiayang/mikoto/Kconfig b/app/boards/arm/mikoto/Kconfig similarity index 81% rename from app/module/boards/zhiayang/mikoto/Kconfig rename to app/boards/arm/mikoto/Kconfig index 0313f68b..71ec9411 100644 --- a/app/module/boards/zhiayang/mikoto/Kconfig +++ b/app/boards/arm/mikoto/Kconfig @@ -1,6 +1,12 @@ +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_MIKOTO_520) + choice BOARD_MIKOTO_CHARGER_CURRENT prompt "Charge current to supply to attached batteries" - depends on (BOARD_MIKOTO) + depends on (BOARD_MIKOTO_520) config BOARD_MIKOTO_CHARGER_CURRENT_40MA bool "40mA charge current, for battery capacity 40mAh or higher" @@ -20,4 +26,4 @@ config BOARD_MIKOTO_CHARGER_CURRENT_350MA config BOARD_MIKOTO_CHARGER_CURRENT_NONE bool "Disable charge current" -endchoice +endchoice \ No newline at end of file diff --git a/app/boards/arm/mikoto/Kconfig.board b/app/boards/arm/mikoto/Kconfig.board new file mode 100644 index 00000000..a872fa1f --- /dev/null +++ b/app/boards/arm/mikoto/Kconfig.board @@ -0,0 +1,8 @@ +# mikoto board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_MIKOTO_520 + bool "mikoto_520" + depends on SOC_NRF52840_QIAA diff --git a/app/module/boards/zhiayang/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig similarity index 68% rename from app/module/boards/zhiayang/mikoto/Kconfig.defconfig rename to app/boards/arm/mikoto/Kconfig.defconfig index 730cc005..8117cc87 100644 --- a/app/module/boards/zhiayang/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -3,7 +3,10 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_MIKOTO +if BOARD_MIKOTO_520 + +config BOARD + default "mikoto" if USB @@ -15,8 +18,14 @@ config USB_DEVICE_STACK endif # USB +config BT_CTLR + default BT + +config PINMUX + default y + choice BOARD_MIKOTO_CHARGER_CURRENT default BOARD_MIKOTO_CHARGER_CURRENT_100MA endchoice -endif # BOARD_MIKOTO +endif # BOARD_MIKOTO_520 diff --git a/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi similarity index 98% rename from app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi rename to app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi index b2e2d6a3..ed6097ec 100644 --- a/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi +++ b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi @@ -55,5 +55,5 @@ pro_micro_d: &pro_micro {}; pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi1 {}; +pro_micro_spi: &spi0 {}; pro_micro_serial: &uart0 {}; diff --git a/app/boards/arm/mikoto/board.cmake b/app/boards/arm/mikoto/board.cmake new file mode 100644 index 00000000..fa847d50 --- /dev/null +++ b/app/boards/arm/mikoto/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi similarity index 55% rename from app/module/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi rename to app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi index 1c85c203..df43c407 100644 --- a/app/module/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -17,7 +17,7 @@ uart0_sleep: uart0_sleep { group1 { psels = , - ; + ; low-power-enable; }; }; @@ -25,31 +25,14 @@ i2c0_default: i2c0_default { group1 { psels = , - ; + ; }; }; i2c0_sleep: i2c0_sleep { group1 { psels = , - ; - low-power-enable; - }; - }; - - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; + ; low-power-enable; }; }; diff --git a/app/module/boards/zhiayang/mikoto/mikoto.dts b/app/boards/arm/mikoto/mikoto_520.dts similarity index 69% rename from app/module/boards/zhiayang/mikoto/mikoto.dts rename to app/boards/arm/mikoto/mikoto_520.dts index e0ce24aa..f8007033 100644 --- a/app/module/boards/zhiayang/mikoto/mikoto.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -6,7 +6,8 @@ /dts-v1/; #include -#include +#include "arduino_pro_micro_pins.dtsi" +#include "mikoto_520-pinctrl.dtsi" / { model = "mikoto"; @@ -16,18 +17,32 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; -}; -®1 { - regulator-initial-mode = ; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 1>; + output-ohms = <10000000>; + full-ohms = <(10000000 + 4000000)>; + }; }; &adc { @@ -53,13 +68,6 @@ pinctrl-names = "default", "sleep"; }; -&spi1 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - &uart0 { compatible = "nordic,nrf-uarte"; current-speed = <115200>; @@ -68,8 +76,12 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -84,9 +96,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -100,10 +114,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble.yaml b/app/boards/arm/mikoto/mikoto_520.yaml similarity index 78% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble.yaml rename to app/boards/arm/mikoto/mikoto_520.yaml index 19d1b122..8d9f49ae 100644 --- a/app/module/boards/keycapsss/puchi_ble/puchi_ble.yaml +++ b/app/boards/arm/mikoto/mikoto_520.yaml @@ -1,5 +1,5 @@ -identifier: puchi_ble -name: puchi_ble +identifier: mikoto_520 +name: mikoto_520 type: mcu arch: arm toolchain: diff --git a/app/boards/zhiayang/mikoto/mikoto.zmk.yml b/app/boards/arm/mikoto/mikoto_520.zmk.yml similarity index 54% rename from app/boards/zhiayang/mikoto/mikoto.zmk.yml rename to app/boards/arm/mikoto/mikoto_520.zmk.yml index 7726e82b..91dcc9e0 100644 --- a/app/boards/zhiayang/mikoto/mikoto.zmk.yml +++ b/app/boards/arm/mikoto/mikoto_520.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: mikoto//zmk -name: Mikoto +id: mikoto_520 +name: Mikoto 5.20 type: board arch: arm outputs: @@ -8,9 +8,3 @@ outputs: - ble url: https://github.com/zhiayang/mikoto exposes: [pro_micro] -revisions: - - "5.20" - - "6.1" - - "6.3" - - "7.2" -default_revision: "5.20" diff --git a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_defconfig b/app/boards/arm/mikoto/mikoto_520_defconfig similarity index 80% rename from app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_defconfig rename to app/boards/arm/mikoto/mikoto_520_defconfig index 56aa9526..354fa56a 100644 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_defconfig +++ b/app/boards/arm/mikoto/mikoto_520_defconfig @@ -1,7 +1,12 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_MIKOTO_520=y + # Enable MPU CONFIG_ARM_MPU=y + CONFIG_PINCTRL=y # enable GPIO diff --git a/app/module/boards/zhiayang/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c similarity index 93% rename from app/module/boards/zhiayang/mikoto/pinmux.c rename to app/boards/arm/mikoto/pinmux.c index a3901424..524aa17e 100644 --- a/app/module/boards/zhiayang/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -11,9 +11,10 @@ #include #include -static int pinmux_mikoto_init(void) { +static int pinmux_mikoto_init(const struct device *port) { + ARG_UNUSED(port); -#if CONFIG_BOARD_MIKOTO +#if CONFIG_BOARD_MIKOTO_520 const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); const struct device *p1 = DEVICE_DT_GET(DT_NODELABEL(gpio1)); #if CONFIG_BOARD_MIKOTO_CHARGER_CURRENT_40MA diff --git a/app/boards/nicekeyboards/nice60/Kconfig b/app/boards/arm/nice60/Kconfig similarity index 100% rename from app/boards/nicekeyboards/nice60/Kconfig rename to app/boards/arm/nice60/Kconfig diff --git a/app/boards/arm/nice60/Kconfig.board b/app/boards/arm/nice60/Kconfig.board new file mode 100644 index 00000000..88db9ee8 --- /dev/null +++ b/app/boards/arm/nice60/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2021 Nick Winans +# SPDX-License-Identifier: MIT + +config BOARD_NICE60 + bool "nice!60" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/nicekeyboards/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig similarity index 100% rename from app/boards/nicekeyboards/nice60/Kconfig.defconfig rename to app/boards/arm/nice60/Kconfig.defconfig diff --git a/app/boards/nicekeyboards/nice60/README.md b/app/boards/arm/nice60/README.md similarity index 86% rename from app/boards/nicekeyboards/nice60/README.md rename to app/boards/arm/nice60/README.md index 4b3fa09a..dce230ae 100644 --- a/app/boards/nicekeyboards/nice60/README.md +++ b/app/boards/arm/nice60/README.md @@ -7,5 +7,5 @@ The nice!60 is a hotswap 60% made by Nice Keyboards. https://nicekeyboards.com/n ## Building nice!60 ZMK firmware ``` -west build -p -b nice60//zmk +west build -p -b nice60 ``` diff --git a/app/boards/nicekeyboards/nice60/board.cmake b/app/boards/arm/nice60/board.cmake similarity index 84% rename from app/boards/nicekeyboards/nice60/board.cmake rename to app/boards/arm/nice60/board.cmake index 669907b9..2aca938a 100644 --- a/app/boards/nicekeyboards/nice60/board.cmake +++ b/app/boards/arm/nice60/board.cmake @@ -3,6 +3,5 @@ set(OPENOCD_NRF5_SUBFAMILY nrf52) board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi similarity index 59% rename from app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi rename to app/boards/arm/nice60/nice60-pinctrl.dtsi index e808eaa7..9b0e198d 100644 --- a/app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -9,11 +9,4 @@ psels = ; }; }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; }; diff --git a/app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk.dts b/app/boards/arm/nice60/nice60.dts similarity index 89% rename from app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk.dts rename to app/boards/arm/nice60/nice60.dts index acecda4d..651dd555 100644 --- a/app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -6,13 +6,10 @@ /dts-v1/; #include -#include #include #include -#include - #include "nice60-pinctrl.dtsi" / { @@ -23,9 +20,10 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,battery = &vbatt; zmk,kscan = &kscan0; - zmk,physical-layout = &layout_60_ansi; + zmk,matrix_transform = &default_transform; zmk,underglow = &led_strip; }; @@ -44,7 +42,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -76,27 +74,25 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { + ext-power { compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; io-channels = <&adc 2>; output-ohms = <2000000>; full-ohms = <(2000000 + 806000)>; }; }; -®1 { - regulator-initial-mode = ; -}; - &adc { status = "okay"; }; @@ -117,12 +113,12 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-names = "default"; status = "okay"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ @@ -136,8 +132,12 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R }; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { @@ -151,10 +151,12 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "mbr"; reg = <0x00000000 0x00001000>; }; code_partition: partition@1000 { + label = "code_partition"; reg = <0x00001000 0x000d3000>; }; @@ -168,15 +170,13 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@d4000 { + label = "storage"; reg = <0x000d4000 0x00020000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; }; - -&layout_60_ansi { - transform = <&default_transform>; -}; diff --git a/app/boards/nicekeyboards/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap similarity index 99% rename from app/boards/nicekeyboards/nice60/nice60.keymap rename to app/boards/arm/nice60/nice60.keymap index ba98ec23..3a357163 100644 --- a/app/boards/nicekeyboards/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -15,7 +15,7 @@ default_layer { // ------------------------------------------------------------------------------------------ -// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | +// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | diff --git a/app/boards/nicekeyboards/nice60/nice60.yaml b/app/boards/arm/nice60/nice60.yaml similarity index 100% rename from app/boards/nicekeyboards/nice60/nice60.yaml rename to app/boards/arm/nice60/nice60.yaml diff --git a/app/boards/nicekeyboards/nice60/nice60.zmk.yml b/app/boards/arm/nice60/nice60.zmk.yml similarity index 84% rename from app/boards/nicekeyboards/nice60/nice60.zmk.yml rename to app/boards/arm/nice60/nice60.zmk.yml index b6d2a2b1..cbcc8130 100644 --- a/app/boards/nicekeyboards/nice60/nice60.zmk.yml +++ b/app/boards/arm/nice60/nice60.zmk.yml @@ -1,12 +1,11 @@ file_format: "1" -id: nice60//zmk +id: nice60 name: nice!60 type: board arch: arm features: - keys - underglow - - studio outputs: - usb - ble diff --git a/app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk_defconfig b/app/boards/arm/nice60/nice60_defconfig similarity index 79% rename from app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk_defconfig rename to app/boards/arm/nice60/nice60_defconfig index 9b3a9144..fabcb7ed 100644 --- a/app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk_defconfig +++ b/app/boards/arm/nice60/nice60_defconfig @@ -1,6 +1,10 @@ # Copyright (c) 2021 Nick Winans # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NICE60=y + # Enable MPU CONFIG_ARM_MPU=y @@ -20,9 +24,11 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=160 CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 + CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nice_nano/Kconfig b/app/boards/arm/nice_nano/Kconfig new file mode 100644 index 00000000..ac6828a4 --- /dev/null +++ b/app/boards/arm/nice_nano/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) diff --git a/app/boards/arm/nice_nano/Kconfig.board b/app/boards/arm/nice_nano/Kconfig.board new file mode 100644 index 00000000..8dd16512 --- /dev/null +++ b/app/boards/arm/nice_nano/Kconfig.board @@ -0,0 +1,13 @@ +# nice!nano board configuration + +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +config BOARD_NICE_NANO + bool "nice!nano" + depends on SOC_NRF52840_QIAA + +config BOARD_NICE_NANO_V2 + bool "nice!nano v2" + depends on SOC_NRF52840_QIAA + diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig new file mode 100644 index 00000000..63102a57 --- /dev/null +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -0,0 +1,19 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_NICE_NANO || BOARD_NICE_NANO_V2 + +config BOARD + default "nice_nano" + +if USB_DEVICE_STACK + +config USB_NRFX + default y + +endif # USB_DEVICE_STACK + +config BT_CTLR + default BT + +endif # BOARD_NICE_NANO || BOARD_NICE_NANO_V2 diff --git a/app/module/boards/nicekeyboards/nice_nano/arduino_pro_micro_pins.dtsi b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi similarity index 98% rename from app/module/boards/nicekeyboards/nice_nano/arduino_pro_micro_pins.dtsi rename to app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi index 2c257ef0..f1b569c0 100644 --- a/app/module/boards/nicekeyboards/nice_nano/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi @@ -53,5 +53,5 @@ pro_micro_d: &pro_micro {}; pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi1 {}; +pro_micro_spi: &spi0 {}; pro_micro_serial: &uart0 {}; diff --git a/app/boards/arm/nice_nano/board.cmake b/app/boards/arm/nice_nano/board.cmake new file mode 100644 index 00000000..fa847d50 --- /dev/null +++ b/app/boards/arm/nice_nano/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/nicekeyboards/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi similarity index 65% rename from app/module/boards/nicekeyboards/nice_nano/nice_nano-pinctrl.dtsi rename to app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi index bcabf4ab..15c48509 100644 --- a/app/module/boards/nicekeyboards/nice_nano/nice_nano-pinctrl.dtsi +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -36,21 +36,4 @@ low-power-enable; }; }; - - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; }; diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0.overlay b/app/boards/arm/nice_nano/nice_nano.dts similarity index 72% rename from app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0.overlay rename to app/boards/arm/nice_nano/nice_nano.dts index 6c1590bb..4ee0df7f 100644 --- a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0.overlay +++ b/app/boards/arm/nice_nano/nice_nano.dts @@ -1,22 +1,26 @@ /* - * Copyright (c) 2025 The ZMK Contributors + * Copyright (c) 2021 The ZMK Contributors * * SPDX-License-Identifier: MIT */ +/dts-v1/; +#include "nice_nano.dtsi" + / { chosen { zmk,battery = &vbatt; }; - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { + ext-power { compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; io-channels = <&adc 2>; output-ohms = <2000000>; full-ohms = <(2000000 + 806000)>; diff --git a/app/module/boards/nicekeyboards/nice_nano/nice_nano.dts b/app/boards/arm/nice_nano/nice_nano.dtsi similarity index 85% rename from app/module/boards/nicekeyboards/nice_nano/nice_nano.dts rename to app/boards/arm/nice_nano/nice_nano.dtsi index 2788ceae..0c0a3823 100644 --- a/app/module/boards/nicekeyboards/nice_nano/nice_nano.dts +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -4,13 +4,10 @@ * SPDX-License-Identifier: MIT */ -/dts-v1/; - #include #include "nice_nano-pinctrl.dtsi" #include "arduino_pro_micro_pins.dtsi" - / { model = "nice!nano"; compatible = "nice,nano"; @@ -19,20 +16,18 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; }; -®1 { - regulator-initial-mode = ; -}; - &adc { status = "okay"; }; @@ -56,13 +51,6 @@ pinctrl-names = "default", "sleep"; }; -&spi1 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - &uart0 { compatible = "nordic,nrf-uarte"; current-speed = <115200>; @@ -71,8 +59,12 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -87,9 +79,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -103,10 +97,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/module/boards/nicekeyboards/nice_nano/nice_nano.yaml b/app/boards/arm/nice_nano/nice_nano.yaml similarity index 100% rename from app/module/boards/nicekeyboards/nice_nano/nice_nano.yaml rename to app/boards/arm/nice_nano/nice_nano.yaml diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano.zmk.yml b/app/boards/arm/nice_nano/nice_nano.zmk.yml similarity index 56% rename from app/boards/nicekeyboards/nice_nano/nice_nano.zmk.yml rename to app/boards/arm/nice_nano/nice_nano.zmk.yml index e9b69fff..1799c0de 100644 --- a/app/boards/nicekeyboards/nice_nano/nice_nano.zmk.yml +++ b/app/boards/arm/nice_nano/nice_nano.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nice_nano//zmk -name: nice!nano +id: nice_nano +name: nice!nano v1 type: board arch: arm outputs: @@ -8,7 +8,3 @@ outputs: - ble url: https://nicekeyboards.com/nice-nano exposes: [pro_micro] -revisions: - - "1.0.0" - - "2.0.0" -default_revision: "2.0.0" diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig similarity index 81% rename from app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0_defconfig rename to app/boards/arm/nice_nano/nice_nano_defconfig index babddaac..6b7fcab2 100644 --- a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NICE_NANO=y + # Enable MPU CONFIG_ARM_MPU=y diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0.overlay b/app/boards/arm/nice_nano/nice_nano_v2.dts similarity index 73% rename from app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0.overlay rename to app/boards/arm/nice_nano/nice_nano_v2.dts index 34c635ff..b2fbcc81 100644 --- a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0.overlay +++ b/app/boards/arm/nice_nano/nice_nano_v2.dts @@ -4,23 +4,23 @@ * SPDX-License-Identifier: MIT */ +/dts-v1/; +#include "nice_nano.dtsi" + / { chosen { zmk,battery = &vbatt; }; - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { + ext-power { compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; init-delay-ms = <50>; }; vbatt: vbatt { compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY"; }; }; - -®0 { - status = "okay"; -}; diff --git a/app/boards/arm/nice_nano/nice_nano_v2.yaml b/app/boards/arm/nice_nano/nice_nano_v2.yaml new file mode 100644 index 00000000..d050ce99 --- /dev/null +++ b/app/boards/arm/nice_nano/nice_nano_v2.yaml @@ -0,0 +1,15 @@ +identifier: nice_nano_v2 +name: nice!nano v2 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/nice_nano/nice_nano_v2.zmk.yml b/app/boards/arm/nice_nano/nice_nano_v2.zmk.yml new file mode 100644 index 00000000..3d1149a0 --- /dev/null +++ b/app/boards/arm/nice_nano/nice_nano_v2.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nice_nano_v2 +name: nice!nano v2 +type: board +arch: arm +outputs: + - usb + - ble +url: https://nicekeyboards.com/nice-nano +exposes: [pro_micro] diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0_defconfig b/app/boards/arm/nice_nano/nice_nano_v2_defconfig similarity index 76% rename from app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0_defconfig rename to app/boards/arm/nice_nano/nice_nano_v2_defconfig index 03d08c91..6b5044e5 100644 --- a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_v2_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NICE_NANO_V2=y + # Enable MPU CONFIG_ARM_MPU=y @@ -20,4 +24,4 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_BLE=y -CONFIG_ZMK_USB=y +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/module/boards/makerdiary/nrf52840_m2/Kconfig b/app/boards/arm/nrf52840_m2/Kconfig similarity index 100% rename from app/module/boards/makerdiary/nrf52840_m2/Kconfig rename to app/boards/arm/nrf52840_m2/Kconfig diff --git a/app/boards/arm/nrf52840_m2/Kconfig.board b/app/boards/arm/nrf52840_m2/Kconfig.board new file mode 100644 index 00000000..b2927ff2 --- /dev/null +++ b/app/boards/arm/nrf52840_m2/Kconfig.board @@ -0,0 +1,9 @@ +# Maker Diary nrf52840 M.2 board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_NRF52840_M2 + bool "nrf52480_m2" + depends on SOC_NRF52840_QIAA + diff --git a/app/module/boards/makerdiary/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig similarity index 85% rename from app/module/boards/makerdiary/nrf52840_m2/Kconfig.defconfig rename to app/boards/arm/nrf52840_m2/Kconfig.defconfig index a7851c3b..a5227fc0 100644 --- a/app/module/boards/makerdiary/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -3,6 +3,9 @@ if BOARD_NRF52840_M2 +config BOARD + default "nrf52480_m2" + if USB_DEVICE_STACK config USB_NRFX diff --git a/app/boards/makerdiary/nrf52840_m2/board.cmake b/app/boards/arm/nrf52840_m2/board.cmake similarity index 100% rename from app/boards/makerdiary/nrf52840_m2/board.cmake rename to app/boards/arm/nrf52840_m2/board.cmake diff --git a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts similarity index 73% rename from app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts rename to app/boards/arm/nrf52840_m2/nrf52840_m2.dts index 821fcd2a..253e6b77 100644 --- a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -15,20 +15,34 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { compatible = "gpio-leds"; red_led: led_0 { gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; + label = "Red LED"; }; green_led: led_1 { gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; + label = "Green LED"; }; blue_led: led_2 { gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; + }; &adc { @@ -47,9 +61,13 @@ status = "okay"; }; -zephyr_udc0: &usbd { +&usbd { compatible = "nordic,nrf-usbd"; status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -64,9 +82,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -80,10 +100,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml b/app/boards/arm/nrf52840_m2/nrf52840_m2.yaml similarity index 100% rename from app/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml rename to app/boards/arm/nrf52840_m2/nrf52840_m2.yaml diff --git a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.zmk.yml b/app/boards/arm/nrf52840_m2/nrf52840_m2.zmk.yml similarity index 89% rename from app/boards/makerdiary/nrf52840_m2/nrf52840_m2.zmk.yml rename to app/boards/arm/nrf52840_m2/nrf52840_m2.zmk.yml index 227c4500..2a4ccb0c 100644 --- a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.zmk.yml +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: nrf52840_m2//zmk +id: nrf52840_m2 name: nRF52840 M.2 Module type: board arch: arm diff --git a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_nrf52840_zmk_defconfig b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig similarity index 81% rename from app/boards/makerdiary/nrf52840_m2/nrf52840_m2_nrf52840_zmk_defconfig rename to app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig index d0b01539..93eef9e6 100644 --- a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_nrf52840_zmk_defconfig +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig @@ -1,6 +1,10 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NRF52840_M2=y + # Enable MPU CONFIG_ARM_MPU=y diff --git a/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.zmk.yml b/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml similarity index 86% rename from app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.zmk.yml rename to app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml index 738cf290..2a0d9946 100644 --- a/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.zmk.yml +++ b/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: nrf52840dk/nrf52840/zmk +id: nrf52840dk_nrf52840 name: Nordic nRF52840 DK type: board arch: arm diff --git a/app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml similarity index 86% rename from app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.zmk.yml rename to app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml index 96a461fe..444de996 100644 --- a/app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.zmk.yml +++ b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: nrf5340dk/nrf5340/cpuapp +id: nrf5340dk_nrf5340_cpuapp name: Nordic nRF5340 DK type: board arch: arm diff --git a/app/boards/arm/nrfmicro/CMakeLists.txt b/app/boards/arm/nrfmicro/CMakeLists.txt new file mode 100644 index 00000000..12cf9b1c --- /dev/null +++ b/app/boards/arm/nrfmicro/CMakeLists.txt @@ -0,0 +1,6 @@ + +if(CONFIG_PINMUX) +zephyr_library() +zephyr_library_sources(pinmux.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) +endif() \ No newline at end of file diff --git a/app/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig new file mode 100644 index 00000000..233ddbad --- /dev/null +++ b/app/boards/arm/nrfmicro/Kconfig @@ -0,0 +1,10 @@ +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + +config BOARD_NRFMICRO_CHARGER + bool "Enable battery charger" + default y + depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) diff --git a/app/boards/arm/nrfmicro/Kconfig.board b/app/boards/arm/nrfmicro/Kconfig.board new file mode 100644 index 00000000..441de5cf --- /dev/null +++ b/app/boards/arm/nrfmicro/Kconfig.board @@ -0,0 +1,20 @@ +# nrfmicro board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_NRFMICRO_11 + bool "nrfmicro_11" + depends on SOC_NRF52840_QIAA + +config BOARD_NRFMICRO_11_FLIPPED + bool "nrfmicro_11_flipped" + depends on SOC_NRF52840_QIAA + +config BOARD_NRFMICRO_13 + bool "nrfmicro_13" + depends on SOC_NRF52840_QIAA + +config BOARD_NRFMICRO_13_52833 + bool "nrfmicro_13_52833" + depends on SOC_NRF52833_QIAA diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig new file mode 100644 index 00000000..659e9c5c --- /dev/null +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -0,0 +1,31 @@ +# Electronut Labs Papyr board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 + +config BOARD + default "nrfmicro" + +if USB_DEVICE_STACK + +config USB_NRFX + default y + +endif # USB_DEVICE_STACK + +config BT_CTLR + default BT + +config PINMUX + default y + +if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 + +config BOARD_NRFMICRO_CHARGER + default y + +endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 + +endif # BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 diff --git a/app/module/boards/joric/nrfmicro/arduino_pro_micro_pins.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi similarity index 98% rename from app/module/boards/joric/nrfmicro/arduino_pro_micro_pins.dtsi rename to app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi index 1f88a4eb..01e342c0 100644 --- a/app/module/boards/joric/nrfmicro/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi @@ -55,5 +55,5 @@ pro_micro_d: &pro_micro {}; pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi1 {}; +pro_micro_spi: &spi0 {}; pro_micro_serial: &uart0 {}; diff --git a/app/module/boards/joric/nrfmicro/arduino_pro_micro_pins_52833.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi similarity index 98% rename from app/module/boards/joric/nrfmicro/arduino_pro_micro_pins_52833.dtsi rename to app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi index b16465e6..76ece25f 100644 --- a/app/module/boards/joric/nrfmicro/arduino_pro_micro_pins_52833.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi @@ -55,5 +55,5 @@ pro_micro_d: &pro_micro {}; pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi1 {}; +pro_micro_spi: &spi0 {}; pro_micro_serial: &uart0 {}; diff --git a/app/module/boards/joric/nrfmicro/arduino_pro_micro_pins_flipped.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi similarity index 98% rename from app/module/boards/joric/nrfmicro/arduino_pro_micro_pins_flipped.dtsi rename to app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi index 3ab31900..923efbbf 100644 --- a/app/module/boards/joric/nrfmicro/arduino_pro_micro_pins_flipped.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi @@ -53,5 +53,5 @@ pro_micro_d: &pro_micro {}; pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi1 {}; +pro_micro_spi: &spi0 {}; pro_micro_serial: &uart0 {}; diff --git a/app/boards/arm/nrfmicro/board.cmake b/app/boards/arm/nrfmicro/board.cmake new file mode 100644 index 00000000..fa847d50 --- /dev/null +++ b/app/boards/arm/nrfmicro/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/joric/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi similarity index 65% rename from app/module/boards/joric/nrfmicro/nrfmicro-flipped-pinctrl.dtsi rename to app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi index 57e868a4..22bc11d4 100644 --- a/app/module/boards/joric/nrfmicro/nrfmicro-flipped-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -36,21 +36,4 @@ low-power-enable; }; }; - - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; }; diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi similarity index 100% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi rename to app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts similarity index 79% rename from app/module/boards/joric/nrfmicro/nrfmicro_nrf52840.dts rename to app/boards/arm/nrfmicro/nrfmicro_11.dts index 787cfc34..14b9adb9 100644 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -6,7 +6,6 @@ /dts-v1/; #include - #include "arduino_pro_micro_pins.dtsi" #include "nrfmicro-pinctrl.dtsi" @@ -18,22 +17,22 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; -}; -®1 { - regulator-initial-mode = ; -}; - -&adc { - status = "okay"; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { @@ -55,13 +54,6 @@ pinctrl-names = "default", "sleep"; }; -&spi1 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - &uart0 { compatible = "nordic,nrf-uarte"; current-speed = <115200>; @@ -70,10 +62,15 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; + &flash0 { /* * For more information, see: @@ -85,9 +82,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -101,10 +100,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_11.yaml b/app/boards/arm/nrfmicro/nrfmicro_11.yaml similarity index 100% rename from app/module/boards/joric/nrfmicro/nrfmicro_11.yaml rename to app/boards/arm/nrfmicro/nrfmicro_11.yaml diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52833.zmk.yml b/app/boards/arm/nrfmicro/nrfmicro_11.zmk.yml similarity index 55% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52833.zmk.yml rename to app/boards/arm/nrfmicro/nrfmicro_11.zmk.yml index 632d283e..4160ec6a 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52833.zmk.yml +++ b/app/boards/arm/nrfmicro/nrfmicro_11.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nrfmicro/nrf52833/zmk -name: nRFMicro (nRF52833) +id: nrfmicro_11 +name: nRFMicro 1.1/1.2 type: board arch: arm outputs: @@ -8,6 +8,3 @@ outputs: - ble url: https://github.com/joric/nrfmicro/ exposes: [pro_micro] -revisions: - - "1.3.0" -default_revision: "1.3.0" diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_3_0_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig similarity index 79% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_3_0_defconfig rename to app/boards/arm/nrfmicro/nrfmicro_11_defconfig index 709f33d8..5ba4d6e1 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_3_0_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NRFMICRO_11=y + # Enable MPU CONFIG_ARM_MPU=y @@ -21,4 +25,4 @@ CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts similarity index 79% rename from app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts rename to app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 1e328816..874b67e2 100644 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -6,7 +6,6 @@ /dts-v1/; #include - #include "arduino_pro_micro_pins_flipped.dtsi" #include "nrfmicro-flipped-pinctrl.dtsi" @@ -18,18 +17,22 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; -}; -®1 { - regulator-initial-mode = ; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { @@ -51,13 +54,6 @@ pinctrl-names = "default", "sleep"; }; -&spi1 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - &uart0 { compatible = "nordic,nrf-uarte"; current-speed = <115200>; @@ -66,8 +62,12 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -82,9 +82,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -98,10 +100,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_11_flipped.yaml b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.yaml similarity index 100% rename from app/module/boards/joric/nrfmicro/nrfmicro_11_flipped.yaml rename to app/boards/arm/nrfmicro/nrfmicro_11_flipped.yaml diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.zmk.yml similarity index 51% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml rename to app/boards/arm/nrfmicro/nrfmicro_11_flipped.zmk.yml index d3b66619..b63ace2d 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nrfmicro/nrf52840/flipped_zmk -name: nRFMicro nRF52840 (flipped) +id: nrfmicro_11_flipped +name: nRFMicro 1.1 (flipped) type: board arch: arm outputs: @@ -8,6 +8,3 @@ outputs: - ble url: https://github.com/joric/nrfmicro/ exposes: [pro_micro] -revisions: - - "1.1.0" -default_revision: "1.1.0" diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig new file mode 100644 index 00000000..31cbfc9a --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NRFMICRO_11_FLIPPED=y + +# Enable MPU +CONFIG_ARM_MPU=y + +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y +CONFIG_CLOCK_CONTROL_NRF=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts new file mode 100644 index 00000000..65674132 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" + +/ { + model = "nrfmicro"; + compatible = "joric,nrfmicro"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_13.yaml b/app/boards/arm/nrfmicro/nrfmicro_13.yaml similarity index 100% rename from app/module/boards/joric/nrfmicro/nrfmicro_13.yaml rename to app/boards/arm/nrfmicro/nrfmicro_13.yaml diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840.zmk.yml b/app/boards/arm/nrfmicro/nrfmicro_13.zmk.yml similarity index 50% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52840.zmk.yml rename to app/boards/arm/nrfmicro/nrfmicro_13.zmk.yml index 403fdda3..8fd28d37 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840.zmk.yml +++ b/app/boards/arm/nrfmicro/nrfmicro_13.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nrfmicro/nrf52840/zmk -name: nRFMicro (nRF52840) 1.1/1.2/1.3 +id: nrfmicro_13 +name: nRFMicro 1.3/1.4 type: board arch: arm outputs: @@ -8,7 +8,3 @@ outputs: - ble url: https://github.com/joric/nrfmicro/ exposes: [pro_micro] -revisions: - - "1.1.0" - - "1.3.0" -default_revision: "1.3.0" diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts similarity index 72% rename from app/module/boards/joric/nrfmicro/nrfmicro_nrf52833.dts rename to app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 72398716..cfe77e37 100644 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -6,8 +6,6 @@ /dts-v1/; #include -#include - #include "arduino_pro_micro_pins_52833.dtsi" #include "nrfmicro-pinctrl.dtsi" @@ -19,18 +17,31 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; -}; -®1 { - regulator-initial-mode = ; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { @@ -56,13 +67,6 @@ pinctrl-names = "default", "sleep"; }; -&spi1 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - &uart0 { compatible = "nordic,nrf-uarte"; current-speed = <115200>; @@ -71,8 +75,12 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -87,9 +95,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x00046000>; }; @@ -103,10 +113,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@6c000 { + label = "storage"; reg = <0x0006c000 0x00008000>; }; boot_partition: partition@74000 { + label = "adafruit_boot"; reg = <0x00074000 0x0000c000>; }; }; diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_13_52833.yaml b/app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml similarity index 100% rename from app/module/boards/joric/nrfmicro/nrfmicro_13_52833.yaml rename to app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml b/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml new file mode 100644 index 00000000..757ff860 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nrfmicro_13_52833 +name: nRFMicro 1.3/1.4 (nRF52833) +type: board +arch: arm +outputs: + - usb + - ble +url: https://github.com/joric/nrfmicro/ +exposes: [pro_micro] diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_1_0_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig similarity index 78% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_1_0_defconfig rename to app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig index 709f33d8..f459f356 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_1_0_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52833_QIAA=y +CONFIG_BOARD_NRFMICRO_13_52833=y + # Enable MPU CONFIG_ARM_MPU=y @@ -21,4 +25,4 @@ CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_zmk_1_1_0_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig similarity index 79% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_zmk_1_1_0_defconfig rename to app/boards/arm/nrfmicro/nrfmicro_13_defconfig index 709f33d8..9ffb2766 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_zmk_1_1_0_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig @@ -1,5 +1,9 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_NRFMICRO_13=y + # Enable MPU CONFIG_ARM_MPU=y @@ -21,4 +25,4 @@ CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/module/boards/joric/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c similarity index 88% rename from app/module/boards/joric/nrfmicro/pinmux.c rename to app/boards/arm/nrfmicro/pinmux.c index 2e6674ad..6362b392 100644 --- a/app/module/boards/joric/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -11,7 +11,9 @@ #include #include -static int pinmux_nrfmicro_init(void) { +static int pinmux_nrfmicro_init(const struct device *port) { + ARG_UNUSED(port); + #if (CONFIG_BOARD_NRFMICRO_13 || CONFIG_BOARD_NRFMICRO_13_52833) const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_NRFMICRO_CHARGER diff --git a/app/module/boards/mechwild/pillbug/Kconfig b/app/boards/arm/pillbug/Kconfig similarity index 100% rename from app/module/boards/mechwild/pillbug/Kconfig rename to app/boards/arm/pillbug/Kconfig diff --git a/app/boards/arm/pillbug/Kconfig.board b/app/boards/arm/pillbug/Kconfig.board new file mode 100644 index 00000000..70232e18 --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PILLBUG + bool "PillBug" + depends on SOC_NRF52840_QIAA diff --git a/app/module/boards/mechwild/pillbug/Kconfig.defconfig b/app/boards/arm/pillbug/Kconfig.defconfig similarity index 86% rename from app/module/boards/mechwild/pillbug/Kconfig.defconfig rename to app/boards/arm/pillbug/Kconfig.defconfig index e29ed678..48427ed3 100644 --- a/app/module/boards/mechwild/pillbug/Kconfig.defconfig +++ b/app/boards/arm/pillbug/Kconfig.defconfig @@ -3,6 +3,9 @@ if BOARD_PILLBUG +config BOARD + default "PillBug" + if USB_DEVICE_STACK config USB_NRFX diff --git a/app/module/boards/mechwild/pillbug/blackpill_pins.dtsi b/app/boards/arm/pillbug/blackpill_pins.dtsi similarity index 100% rename from app/module/boards/mechwild/pillbug/blackpill_pins.dtsi rename to app/boards/arm/pillbug/blackpill_pins.dtsi diff --git a/app/module/boards/mechwild/pillbug/board.cmake b/app/boards/arm/pillbug/board.cmake similarity index 82% rename from app/module/boards/mechwild/pillbug/board.cmake rename to app/boards/arm/pillbug/board.cmake index d9d4ed92..992f395d 100644 --- a/app/module/boards/mechwild/pillbug/board.cmake +++ b/app/boards/arm/pillbug/board.cmake @@ -2,6 +2,5 @@ set(OPENOCD_NRF5_SUBFAMILY nrf52) board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/mechwild/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi similarity index 100% rename from app/boards/mechwild/pillbug/pillbug-pinctrl.dtsi rename to app/boards/arm/pillbug/pillbug-pinctrl.dtsi diff --git a/app/module/boards/mechwild/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts similarity index 73% rename from app/module/boards/mechwild/pillbug/pillbug.dts rename to app/boards/arm/pillbug/pillbug.dts index b24f05df..a2e56df3 100644 --- a/app/module/boards/mechwild/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -7,7 +7,6 @@ /dts-v1/; #include - #include "pillbug-pinctrl.dtsi" #include "blackpill_pins.dtsi" @@ -19,14 +18,32 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + label = "Blue LED"; }; }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; + init-delay-ms = <50>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { @@ -68,10 +85,15 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; + &flash0 { /* * For more information, see: @@ -83,10 +105,12 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "mbr"; reg = <0x00000000 0x00001000>; }; code_partition: partition@1000 { + label = "code_partition"; reg = <0x00001000 0x000d3000>; }; @@ -100,10 +124,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@d4000 { + label = "storage"; reg = <0x000d4000 0x00020000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/module/boards/mechwild/pillbug/pillbug.yaml b/app/boards/arm/pillbug/pillbug.yaml similarity index 100% rename from app/module/boards/mechwild/pillbug/pillbug.yaml rename to app/boards/arm/pillbug/pillbug.yaml diff --git a/app/boards/mechwild/pillbug/pillbug.zmk.yml b/app/boards/arm/pillbug/pillbug.zmk.yml similarity index 89% rename from app/boards/mechwild/pillbug/pillbug.zmk.yml rename to app/boards/arm/pillbug/pillbug.zmk.yml index 397ce653..5df11b9e 100644 --- a/app/boards/mechwild/pillbug/pillbug.zmk.yml +++ b/app/boards/arm/pillbug/pillbug.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: pillbug//zmk +id: pillbug name: PillBug type: board arch: arm diff --git a/app/boards/mechwild/pillbug/pillbug_nrf52840_zmk_defconfig b/app/boards/arm/pillbug/pillbug_defconfig similarity index 83% rename from app/boards/mechwild/pillbug/pillbug_nrf52840_zmk_defconfig rename to app/boards/arm/pillbug/pillbug_defconfig index f325d358..9ec72c41 100644 --- a/app/boards/mechwild/pillbug/pillbug_nrf52840_zmk_defconfig +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -1,6 +1,10 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_PILLBUG=y + # Enable MPU CONFIG_ARM_MPU=y diff --git a/app/boards/olkb/planck/CMakeLists.txt b/app/boards/arm/planck/CMakeLists.txt similarity index 100% rename from app/boards/olkb/planck/CMakeLists.txt rename to app/boards/arm/planck/CMakeLists.txt diff --git a/app/boards/olkb/planck/Kconfig.planck b/app/boards/arm/planck/Kconfig.board similarity index 55% rename from app/boards/olkb/planck/Kconfig.planck rename to app/boards/arm/planck/Kconfig.board index 7acad14f..28b7381f 100644 --- a/app/boards/olkb/planck/Kconfig.planck +++ b/app/boards/arm/planck/Kconfig.board @@ -3,6 +3,6 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -config BOARD_PLANCK - select SOC_STM32F303XC - select ZMK_BOARD_COMPAT +config BOARD_PLANCK_REV6 + bool "Planck V6 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/olkb/planck/Kconfig.defconfig b/app/boards/arm/planck/Kconfig.defconfig similarity index 81% rename from app/boards/olkb/planck/Kconfig.defconfig rename to app/boards/arm/planck/Kconfig.defconfig index d588982e..69dea84c 100644 --- a/app/boards/olkb/planck/Kconfig.defconfig +++ b/app/boards/arm/planck/Kconfig.defconfig @@ -3,7 +3,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_PLANCK +if BOARD_PLANCK_REV6 config ZMK_KEYBOARD_NAME default "Planck V6" @@ -11,4 +11,4 @@ config ZMK_KEYBOARD_NAME config ZMK_KSCAN_MATRIX_POLLING default y -endif # BOARD_PLANCK +endif # BOARD_PLANCK_REV6 diff --git a/app/boards/olkb/planck/board.cmake b/app/boards/arm/planck/board.cmake similarity index 100% rename from app/boards/olkb/planck/board.cmake rename to app/boards/arm/planck/board.cmake diff --git a/app/boards/olkb/planck/planck_stm32f303xc_zmk.dts b/app/boards/arm/planck/planck_rev6.dts similarity index 83% rename from app/boards/olkb/planck/planck_stm32f303xc_zmk.dts rename to app/boards/arm/planck/planck_rev6.dts index 2f34571f..5fdd2c21 100644 --- a/app/boards/olkb/planck/planck_stm32f303xc_zmk.dts +++ b/app/boards/arm/planck/planck_rev6.dts @@ -9,11 +9,6 @@ #include #include -#include -#include -#include - - / { model = "Plack PCD, rev6"; compatible = "planck,rev6", "st,stm32f303"; @@ -21,12 +16,14 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan0; - zmk,physical-layout = &layout_ortho_4x12_all1u; + zmk,matrix_transform = &layout_grid_transform; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; row-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> @@ -48,20 +45,6 @@ ; }; - encoder: encoder { - compatible = "alps,ec11"; - a-gpios = <&gpiob 12 GPIO_PULL_UP>; - b-gpios = <&gpiob 13 GPIO_PULL_UP>; - steps = <80>; - status = "disabled"; - }; - - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - triggers-per-rotation = <20>; - }; - layout_grid_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; @@ -100,10 +83,14 @@ layout_2x2u_transform: }; }; -zephyr_udc0: &usb { +&usb { pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; pinctrl-names = "default"; status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hse { @@ -138,19 +125,8 @@ zephyr_udc0: &usb { /* Set 6Kb of storage at the end of the 256Kb of flash */ storage_partition: partition@3e800 { + label = "storage"; reg = <0x0003e800 0x00001800>; }; }; }; - -&layout_ortho_4x12_all1u { - transform = <&layout_grid_transform>; -}; - -&layout_ortho_4x12_1x2u { - transform = <&layout_mit_transform>; -}; - -&layout_ortho_4x12_2x2u { - transform = <&layout_2x2u_transform>; -}; diff --git a/app/boards/olkb/planck/planck.keymap b/app/boards/arm/planck/planck_rev6.keymap similarity index 85% rename from app/boards/olkb/planck/planck.keymap rename to app/boards/arm/planck/planck_rev6.keymap index 22fe2868..65138057 100644 --- a/app/boards/olkb/planck/planck.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -7,11 +7,6 @@ #include #include -/* Uncomment this block if using an encoder */ -//&encoder { -// status = "okay"; -//}; - / { keymap { compatible = "zmk,keymap"; @@ -21,14 +16,13 @@ // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTRL | LALT | LGUI | LOWR | SPACE | RAIS | LEFT | DOWN | UP | RIGHT | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | bindings = < &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTRL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; lower { diff --git a/app/boards/olkb/planck/planck.yaml b/app/boards/arm/planck/planck_rev6.yaml similarity index 100% rename from app/boards/olkb/planck/planck.yaml rename to app/boards/arm/planck/planck_rev6.yaml diff --git a/app/boards/olkb/planck/planck.zmk.yml b/app/boards/arm/planck/planck_rev6.zmk.yml similarity index 54% rename from app/boards/olkb/planck/planck.zmk.yml rename to app/boards/arm/planck/planck_rev6.zmk.yml index 54194542..56c00006 100644 --- a/app/boards/olkb/planck/planck.zmk.yml +++ b/app/boards/arm/planck/planck_rev6.zmk.yml @@ -1,14 +1,10 @@ file_format: "1" -id: planck//zmk -name: Planck (Rev6) +id: planck_rev6 +name: Planck Rev6 type: board arch: arm features: - keys - - encoder outputs: - usb url: https://olkb.com/collections/planck -revisions: - - "6.0.0" -default_revision: "6.0.0" diff --git a/app/boards/olkb/preonic/preonic_stm32f303xc_zmk_defconfig b/app/boards/arm/planck/planck_rev6_defconfig similarity index 70% rename from app/boards/olkb/preonic/preonic_stm32f303xc_zmk_defconfig rename to app/boards/arm/planck/planck_rev6_defconfig index fbe05d58..74050f3d 100644 --- a/app/boards/olkb/preonic/preonic_stm32f303xc_zmk_defconfig +++ b/app/boards/arm/planck/planck_rev6_defconfig @@ -1,9 +1,13 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_STM32F3X=y +CONFIG_SOC_STM32F303XC=y # 72MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 -# enable pinctrl + +# enable pinmux +CONFIG_PINMUX=y CONFIG_PINCTRL=y # enable GPIO diff --git a/app/boards/olkb/preonic/CMakeLists.txt b/app/boards/arm/preonic/CMakeLists.txt similarity index 100% rename from app/boards/olkb/preonic/CMakeLists.txt rename to app/boards/arm/preonic/CMakeLists.txt diff --git a/app/boards/olkb/preonic/Kconfig.preonic b/app/boards/arm/preonic/Kconfig.board similarity index 55% rename from app/boards/olkb/preonic/Kconfig.preonic rename to app/boards/arm/preonic/Kconfig.board index 7bfd47e7..39f35db6 100644 --- a/app/boards/olkb/preonic/Kconfig.preonic +++ b/app/boards/arm/preonic/Kconfig.board @@ -3,6 +3,6 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -config BOARD_PREONIC - select SOC_STM32F303XC - select ZMK_BOARD_COMPAT +config BOARD_PREONIC_REV3 + bool "Preonic V3 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/olkb/preonic/Kconfig.defconfig b/app/boards/arm/preonic/Kconfig.defconfig similarity index 80% rename from app/boards/olkb/preonic/Kconfig.defconfig rename to app/boards/arm/preonic/Kconfig.defconfig index ab7b9b52..86b2e3d0 100644 --- a/app/boards/olkb/preonic/Kconfig.defconfig +++ b/app/boards/arm/preonic/Kconfig.defconfig @@ -3,7 +3,7 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_PREONIC +if BOARD_PREONIC_REV3 config ZMK_KEYBOARD_NAME default "Preonic V3" @@ -11,4 +11,4 @@ config ZMK_KEYBOARD_NAME config ZMK_KSCAN_MATRIX_POLLING default y -endif # BOARD_PREONIC +endif # BOARD_PREONIC_REV3 diff --git a/app/boards/olkb/preonic/board.cmake b/app/boards/arm/preonic/board.cmake similarity index 100% rename from app/boards/olkb/preonic/board.cmake rename to app/boards/arm/preonic/board.cmake diff --git a/app/boards/olkb/preonic/preonic_stm32f303xc_zmk.dts b/app/boards/arm/preonic/preonic_rev3.dts similarity index 91% rename from app/boards/olkb/preonic/preonic_stm32f303xc_zmk.dts rename to app/boards/arm/preonic/preonic_rev3.dts index 0bb0e2ce..c19b1319 100644 --- a/app/boards/olkb/preonic/preonic_stm32f303xc_zmk.dts +++ b/app/boards/arm/preonic/preonic_rev3.dts @@ -9,9 +9,6 @@ #include #include -#include -#include -#include / { model = "Preonic PCD, rev3"; @@ -21,11 +18,12 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zmk,kscan = &kscan0; - zmk,physical-layout = &layout_ortho_5x12_all1u; + zmk,matrix_transform = &layout_grid_transform; }; kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; row-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> @@ -92,10 +90,14 @@ }; }; -zephyr_udc0: &usb { +&usb { pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; pinctrl-names = "default"; status = "okay"; +cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hse { @@ -130,19 +132,8 @@ zephyr_udc0: &usb { /* Set 6Kb of storage at the end of the 256Kb of flash */ storage_partition: partition@3e800 { + label = "storage"; reg = <0x0003e800 0x00001800>; }; }; }; - -&layout_ortho_5x12_all1u { - transform = <&layout_grid_transform>; -}; - -&layout_ortho_5x12_1x2u { - transform = <&layout_mit_transform>; -}; - -&layout_ortho_5x12_2x2u { - transform = <&layout_2x2u_transform>; -}; diff --git a/app/boards/olkb/preonic/preonic.keymap b/app/boards/arm/preonic/preonic_rev3.keymap similarity index 98% rename from app/boards/olkb/preonic/preonic.keymap rename to app/boards/arm/preonic/preonic_rev3.keymap index a3d85a94..350fe6de 100644 --- a/app/boards/olkb/preonic/preonic.keymap +++ b/app/boards/arm/preonic/preonic_rev3.keymap @@ -13,6 +13,7 @@ #define RAISE 2 / { + chosen { zmk,matrix_transform = &layout_grid_transform; }; keymap { compatible = "zmk,keymap"; default_layer { diff --git a/app/boards/olkb/preonic/preonic.yaml b/app/boards/arm/preonic/preonic_rev3.yaml similarity index 100% rename from app/boards/olkb/preonic/preonic.yaml rename to app/boards/arm/preonic/preonic_rev3.yaml diff --git a/app/boards/olkb/preonic/preonic.zmk.yml b/app/boards/arm/preonic/preonic_rev3.zmk.yml similarity index 67% rename from app/boards/olkb/preonic/preonic.zmk.yml rename to app/boards/arm/preonic/preonic_rev3.zmk.yml index 88755083..bd9d9579 100644 --- a/app/boards/olkb/preonic/preonic.zmk.yml +++ b/app/boards/arm/preonic/preonic_rev3.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: preonic//zmk +id: preonic_rev3 name: Preonic Rev3 type: board arch: arm @@ -8,6 +8,3 @@ features: outputs: - usb url: https://olkb.com/collections/preonic -revisions: - - "3.0.0" -default_revision: "3.0.0" diff --git a/app/boards/qmk/proton_c/proton_c_stm32f303xc_zmk_defconfig b/app/boards/arm/preonic/preonic_rev3_defconfig similarity index 80% rename from app/boards/qmk/proton_c/proton_c_stm32f303xc_zmk_defconfig rename to app/boards/arm/preonic/preonic_rev3_defconfig index f7abf012..e063827a 100644 --- a/app/boards/qmk/proton_c/proton_c_stm32f303xc_zmk_defconfig +++ b/app/boards/arm/preonic/preonic_rev3_defconfig @@ -1,11 +1,10 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_STM32F3X=y +CONFIG_SOC_STM32F303XC=y # 72MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 -# Floating Point Options -CONFIG_FPU=y - # enable pinctrl CONFIG_PINCTRL=y diff --git a/app/boards/arm/proton_c/Kconfig.board b/app/boards/arm/proton_c/Kconfig.board new file mode 100644 index 00000000..1596077f --- /dev/null +++ b/app/boards/arm/proton_c/Kconfig.board @@ -0,0 +1,8 @@ +# QMK Proton-C board configuration + +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +config BOARD_QMK_PROTON_C + bool "QMK Proton-C" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.defconfig b/app/boards/arm/proton_c/Kconfig.defconfig new file mode 100644 index 00000000..eed4b830 --- /dev/null +++ b/app/boards/arm/proton_c/Kconfig.defconfig @@ -0,0 +1,11 @@ +# QMK Proton-C board configuration + +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +if BOARD_QMK_PROTON_C + +config BOARD + default "proton_c" + +endif # BOARD_QMK_PROTON_C diff --git a/app/module/boards/qmk/proton_c/arduino_pro_micro_pins.dtsi b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/module/boards/qmk/proton_c/arduino_pro_micro_pins.dtsi rename to app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi diff --git a/app/module/boards/qmk/proton_c/board.cmake b/app/boards/arm/proton_c/board.cmake similarity index 100% rename from app/module/boards/qmk/proton_c/board.cmake rename to app/boards/arm/proton_c/board.cmake diff --git a/app/module/boards/qmk/proton_c/proton_c.dts b/app/boards/arm/proton_c/proton_c.dts similarity index 88% rename from app/module/boards/qmk/proton_c/proton_c.dts rename to app/boards/arm/proton_c/proton_c.dts index 05872b25..b5a490ee 100644 --- a/app/module/boards/qmk/proton_c/proton_c.dts +++ b/app/boards/arm/proton_c/proton_c.dts @@ -16,6 +16,7 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; }; aliases { @@ -26,6 +27,7 @@ compatible = "gpio-leds"; led: led_0 { gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; + label = "User LED"; }; }; }; @@ -65,10 +67,14 @@ apb2-prescaler = <1>; }; -zephyr_udc0: &usb { +&usb { pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; pinctrl-names = "default"; status = "okay"; + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { @@ -87,6 +93,7 @@ zephyr_udc0: &usb { /* Set 6Kb of storage at the end of the 256Kb of flash */ storage_partition: partition@3e800 { + label = "storage"; reg = <0x0003e800 0x00001800>; }; }; diff --git a/app/module/boards/qmk/proton_c/proton_c.yaml b/app/boards/arm/proton_c/proton_c.yaml similarity index 100% rename from app/module/boards/qmk/proton_c/proton_c.yaml rename to app/boards/arm/proton_c/proton_c.yaml diff --git a/app/module/boards/qmk/proton_c/proton_c.zmk.yml b/app/boards/arm/proton_c/proton_c.zmk.yml similarity index 100% rename from app/module/boards/qmk/proton_c/proton_c.zmk.yml rename to app/boards/arm/proton_c/proton_c.zmk.yml diff --git a/app/module/boards/qmk/proton_c/proton_c_defconfig b/app/boards/arm/proton_c/proton_c_defconfig similarity index 77% rename from app/module/boards/qmk/proton_c/proton_c_defconfig rename to app/boards/arm/proton_c/proton_c_defconfig index 83dd1ee9..c552bf15 100644 --- a/app/module/boards/qmk/proton_c/proton_c_defconfig +++ b/app/boards/arm/proton_c/proton_c_defconfig @@ -1,5 +1,7 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_STM32F3X=y +CONFIG_SOC_STM32F303XC=y # 72MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 @@ -14,3 +16,5 @@ CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y + +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/puchi_ble/CMakeLists.txt b/app/boards/arm/puchi_ble/CMakeLists.txt new file mode 100644 index 00000000..12cf9b1c --- /dev/null +++ b/app/boards/arm/puchi_ble/CMakeLists.txt @@ -0,0 +1,6 @@ + +if(CONFIG_PINMUX) +zephyr_library() +zephyr_library_sources(pinmux.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) +endif() \ No newline at end of file diff --git a/app/module/boards/keycapsss/puchi_ble/Kconfig b/app/boards/arm/puchi_ble/Kconfig similarity index 100% rename from app/module/boards/keycapsss/puchi_ble/Kconfig rename to app/boards/arm/puchi_ble/Kconfig diff --git a/app/boards/arm/puchi_ble/Kconfig.board b/app/boards/arm/puchi_ble/Kconfig.board new file mode 100644 index 00000000..0f5b7f96 --- /dev/null +++ b/app/boards/arm/puchi_ble/Kconfig.board @@ -0,0 +1,8 @@ +# Puchi-BLE board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PUCHI_BLE_v1 + bool "puchi_ble_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/polarityworks/bt75/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig similarity index 51% rename from app/boards/polarityworks/bt75/Kconfig.defconfig rename to app/boards/arm/puchi_ble/Kconfig.defconfig index ded51c24..3533104b 100644 --- a/app/boards/polarityworks/bt75/Kconfig.defconfig +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -1,22 +1,22 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -config ZMK_KEYBOARD_NAME - default "BT75" if BOARD_BT75 +if BOARD_PUCHI_BLE_v1 -if BOARD_BT75 +config BOARD + default "puchi_ble" -if USB +if USB_DEVICE_STACK config USB_NRFX default y -config USB_DEVICE_STACK - default y - -endif # USB +endif # USB_DEVICE_STACK config BT_CTLR default BT -endif # BOARD_BT75 +config PINMUX + default y + +endif # BOARD_PUCHI_BLE_v1 diff --git a/app/module/boards/keycapsss/puchi_ble/arduino_pro_micro_pins.dtsi b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/module/boards/keycapsss/puchi_ble/arduino_pro_micro_pins.dtsi rename to app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi diff --git a/app/module/boards/keycapsss/puchi_ble/board.cmake b/app/boards/arm/puchi_ble/board.cmake similarity index 74% rename from app/module/boards/keycapsss/puchi_ble/board.cmake rename to app/boards/arm/puchi_ble/board.cmake index fd74278a..3b5c4aea 100644 --- a/app/module/boards/keycapsss/puchi_ble/board.cmake +++ b/app/boards/arm/puchi_ble/board.cmake @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/keycapsss/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c similarity index 83% rename from app/module/boards/keycapsss/puchi_ble/pinmux.c rename to app/boards/arm/puchi_ble/pinmux.c index 42689383..28178274 100644 --- a/app/module/boards/keycapsss/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -11,8 +11,10 @@ #include #include -static int pinmux_puchi_ble_init(void) { -#if CONFIG_BOARD_PUCHI_BLE +static int pinmux_puchi_ble_init(const struct device *port) { + ARG_UNUSED(port); + +#if CONFIG_BOARD_PUCHI_BLE_v1 const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_PUCHI_BLE_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); diff --git a/app/module/boards/joric/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi similarity index 65% rename from app/module/boards/joric/nrfmicro/nrfmicro-pinctrl.dtsi rename to app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi index c4b9f5a7..35a46e5a 100644 --- a/app/module/boards/joric/nrfmicro/nrfmicro-pinctrl.dtsi +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -36,21 +36,4 @@ low-power-enable; }; }; - - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; }; diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts similarity index 83% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble.dts rename to app/boards/arm/puchi_ble/puchi_ble_v1.dts index 8195f568..b056f711 100644 --- a/app/module/boards/keycapsss/puchi_ble/puchi_ble.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -6,10 +6,8 @@ /dts-v1/; #include -#include - #include "arduino_pro_micro_pins.dtsi" -#include "puchi_ble-pinctrl.dtsi" +#include "puchi_ble_v1-pinctrl.dtsi" / { model = "puchi_ble"; @@ -19,6 +17,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,battery = &vbatt; }; @@ -26,17 +25,19 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { + ext-power { compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; io-channels = <&adc 2>; output-ohms = <2000000>; full-ohms = <(2000000 + 820000)>; @@ -73,8 +74,12 @@ pinctrl-names = "default", "sleep"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; @@ -89,9 +94,11 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "softdevice"; reg = <0x00000000 0x00026000>; }; code_partition: partition@26000 { + label = "code_partition"; reg = <0x00026000 0x000c6000>; }; @@ -105,10 +112,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@ec000 { + label = "storage"; reg = <0x000ec000 0x00008000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.yaml b/app/boards/arm/puchi_ble/puchi_ble_v1.yaml new file mode 100644 index 00000000..18770722 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.yaml @@ -0,0 +1,15 @@ +identifier: puchi_ble_v1 +name: puchi_ble_v1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml b/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml similarity index 92% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml rename to app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml index 18f6463c..f3114008 100644 --- a/app/module/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: puchi_ble +id: puchi_ble_v1 name: Puchi-BLE V1 type: board arch: arm diff --git a/app/boards/keycapsss/puchi_ble/puchi_ble_nrf52840_zmk_defconfig b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig similarity index 81% rename from app/boards/keycapsss/puchi_ble/puchi_ble_nrf52840_zmk_defconfig rename to app/boards/arm/puchi_ble/puchi_ble_v1_defconfig index f6aaf5fd..ab197df0 100644 --- a/app/boards/keycapsss/puchi_ble/puchi_ble_nrf52840_zmk_defconfig +++ b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig @@ -1,6 +1,10 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_PUCHI_BLE_v1=y + # Enable MPU CONFIG_ARM_MPU=y @@ -23,4 +27,4 @@ CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/s40nc/Kconfig.board b/app/boards/arm/s40nc/Kconfig.board new file mode 100644 index 00000000..e703d726 --- /dev/null +++ b/app/boards/arm/s40nc/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_S40NC + bool "S40NC" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/mechwild/s40nc/Kconfig.defconfig b/app/boards/arm/s40nc/Kconfig.defconfig similarity index 100% rename from app/boards/mechwild/s40nc/Kconfig.defconfig rename to app/boards/arm/s40nc/Kconfig.defconfig diff --git a/app/boards/mechwild/s40nc/README.md b/app/boards/arm/s40nc/README.md similarity index 100% rename from app/boards/mechwild/s40nc/README.md rename to app/boards/arm/s40nc/README.md diff --git a/app/boards/mechwild/s40nc/board.cmake b/app/boards/arm/s40nc/board.cmake similarity index 84% rename from app/boards/mechwild/s40nc/board.cmake rename to app/boards/arm/s40nc/board.cmake index d31c7167..c50b2d9d 100644 --- a/app/boards/mechwild/s40nc/board.cmake +++ b/app/boards/arm/s40nc/board.cmake @@ -3,6 +3,5 @@ set(OPENOCD_NRF5_SUBFAMILY nrf52) board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/mechwild/s40nc/s40nc_nrf52840_zmk.dts b/app/boards/arm/s40nc/s40nc.dts similarity index 88% rename from app/boards/mechwild/s40nc/s40nc_nrf52840_zmk.dts rename to app/boards/arm/s40nc/s40nc.dts index 814a0801..6eb9e2a5 100644 --- a/app/boards/mechwild/s40nc/s40nc_nrf52840_zmk.dts +++ b/app/boards/arm/s40nc/s40nc.dts @@ -6,8 +6,6 @@ /dts-v1/; #include -#include - #include / { @@ -18,9 +16,10 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,battery = &vbatt; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -38,7 +37,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -67,11 +66,13 @@ compatible = "gpio-leds"; blue_led: led_0 { gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; io-channels = <&adc 2>; output-ohms = <2000000>; full-ohms = <(2000000 + 820000)>; @@ -94,8 +95,12 @@ status = "okay"; }; -zephyr_udc0: &usbd { +&usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { @@ -109,10 +114,12 @@ zephyr_udc0: &usbd { #size-cells = <1>; sd_partition: partition@0 { + label = "mbr"; reg = <0x00000000 0x00001000>; }; code_partition: partition@1000 { + label = "code_partition"; reg = <0x00001000 0x000d3000>; }; @@ -126,10 +133,12 @@ zephyr_udc0: &usbd { * if enabled. */ storage_partition: partition@d4000 { + label = "storage"; reg = <0x000d4000 0x00020000>; }; boot_partition: partition@f4000 { + label = "adafruit_boot"; reg = <0x000f4000 0x0000c000>; }; }; diff --git a/app/boards/mechwild/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap similarity index 100% rename from app/boards/mechwild/s40nc/s40nc.keymap rename to app/boards/arm/s40nc/s40nc.keymap diff --git a/app/boards/mechwild/s40nc/s40nc.yaml b/app/boards/arm/s40nc/s40nc.yaml similarity index 100% rename from app/boards/mechwild/s40nc/s40nc.yaml rename to app/boards/arm/s40nc/s40nc.yaml diff --git a/app/boards/mechwild/s40nc/s40nc.zmk.yml b/app/boards/arm/s40nc/s40nc.zmk.yml similarity index 88% rename from app/boards/mechwild/s40nc/s40nc.zmk.yml rename to app/boards/arm/s40nc/s40nc.zmk.yml index e64fc007..57b30eca 100644 --- a/app/boards/mechwild/s40nc/s40nc.zmk.yml +++ b/app/boards/arm/s40nc/s40nc.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: s40nc//zmk +id: s40nc name: S40NC type: board arch: arm diff --git a/app/boards/mechwild/s40nc/s40nc_nrf52840_zmk_defconfig b/app/boards/arm/s40nc/s40nc_defconfig similarity index 82% rename from app/boards/mechwild/s40nc/s40nc_nrf52840_zmk_defconfig rename to app/boards/arm/s40nc/s40nc_defconfig index 79d4175f..b523ceb8 100644 --- a/app/boards/mechwild/s40nc/s40nc_nrf52840_zmk_defconfig +++ b/app/boards/arm/s40nc/s40nc_defconfig @@ -1,6 +1,10 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_S40NC=y + # Enable MPU CONFIG_ARM_MPU=y diff --git a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml b/app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml similarity index 69% rename from app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml rename to app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml index da65bb69..1225fb31 100644 --- a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml +++ b/app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: seeeduino_xiao//zmk -name: Seeed Studio XIAO SAMD21 +id: seeeduino_xiao +name: Seeeduino XIAO type: board arch: arm outputs: diff --git a/app/boards/seeed/xiao_ble/xiao_ble.zmk.yml b/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml similarity index 71% rename from app/boards/seeed/xiao_ble/xiao_ble.zmk.yml rename to app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml index d4159e36..360bd04b 100644 --- a/app/boards/seeed/xiao_ble/xiao_ble.zmk.yml +++ b/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: xiao_ble//zmk -name: Seeed Studio XIAO nRF52840 +id: seeeduino_xiao_ble +name: Seeeduino XIAO BLE type: board arch: arm outputs: diff --git a/app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml similarity index 69% rename from app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml rename to app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml index ab30d3f7..77d8d664 100644 --- a/app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml +++ b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: xiao_rp2040//zmk -name: Seeed Studio XIAO RP2040 +id: seeeduino_xiao_rp2040 +name: Seeeduino XIAO RP2040 type: board arch: arm outputs: diff --git a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml similarity index 81% rename from app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml rename to app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml index d9243be0..26a2ca64 100644 --- a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml +++ b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: sparkfun_pro_micro_rp2040//zmk +id: sparkfun_pro_micro_rp2040 name: SparkFun Pro Micro RP2040 type: board arch: arm diff --git a/app/boards/blackpill_f401ce.conf b/app/boards/blackpill_f401ce.conf new file mode 100644 index 00000000..07e304cf --- /dev/null +++ b/app/boards/blackpill_f401ce.conf @@ -0,0 +1,7 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=n +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk.dts b/app/boards/blackpill_f401ce.overlay similarity index 94% rename from app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk.dts rename to app/boards/blackpill_f401ce.overlay index f9be15c1..54e360a3 100644 --- a/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk.dts +++ b/app/boards/blackpill_f401ce.overlay @@ -1,10 +1,9 @@ /* - * Copyright (c) 2026 The ZMK Contributors + * Copyright (c) 2022 The ZMK Contributors * * SPDX-License-Identifier: MIT */ -#include <../boards/weact/blackpill_f411ce/blackpill_f411ce.dts> / { blackpill: connector { diff --git a/app/boards/blackpill_f411ce.conf b/app/boards/blackpill_f411ce.conf new file mode 100644 index 00000000..07e304cf --- /dev/null +++ b/app/boards/blackpill_f411ce.conf @@ -0,0 +1,7 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=n +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk.dts b/app/boards/blackpill_f411ce.overlay similarity index 94% rename from app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk.dts rename to app/boards/blackpill_f411ce.overlay index ea7f0634..54e360a3 100644 --- a/app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk.dts +++ b/app/boards/blackpill_f411ce.overlay @@ -1,10 +1,9 @@ /* - * Copyright (c) 2026 The ZMK Contributors + * Copyright (c) 2022 The ZMK Contributors * * SPDX-License-Identifier: MIT */ -#include <../boards/weact/blackpill_f401ce/blackpill_f401ce.dts> / { blackpill: connector { diff --git a/app/boards/boardsource/blok/Kconfig.boardsource_blok b/app/boards/boardsource/blok/Kconfig.boardsource_blok deleted file mode 100644 index fd3ce989..00000000 --- a/app/boards/boardsource/blok/Kconfig.boardsource_blok +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2026 Pete Johanson -# SPDX-License-Identifier: MIT - -config BOARD_BOARDSOURCE_BLOK - select ZMK_BOARD_COMPAT if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK - imply RETAINED_MEM if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK - imply RETENTION if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK - imply RETENTION_BOOT_MODE if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK - diff --git a/app/boards/boardsource/blok/board.yml b/app/boards/boardsource/blok/board.yml deleted file mode 100644 index 0891ee1b..00000000 --- a/app/boards/boardsource/blok/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: boardsource_blok - variants: - - name: zmk - qualifier: rp2040 diff --git a/app/boards/boardsource/blok/boardsource_blok.zmk.yml b/app/boards/boardsource/blok/boardsource_blok.zmk.yml deleted file mode 100644 index dac3d4df..00000000 --- a/app/boards/boardsource/blok/boardsource_blok.zmk.yml +++ /dev/null @@ -1,9 +0,0 @@ -file_format: "1" -id: boardsource_blok//zmk -name: Boardsource Blok -type: board -arch: arm -outputs: - - usb -url: https://boardsource.xyz/products/blok-rp2040-keyboard-controller -exposes: [pro_micro] diff --git a/app/boards/boardsource/blok/boardsource_blok_zmk.dts b/app/boards/boardsource/blok/boardsource_blok_zmk.dts deleted file mode 100644 index c7bb7cc2..00000000 --- a/app/boards/boardsource/blok/boardsource_blok_zmk.dts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/boardsource/blok/boardsource_blok.dts> -#include - -&pro_micro_serial { status = "disabled"; }; - -&code_partition { - reg = <0x100 (DT_SIZE_M(16) - 0x100 - DT_SIZE_K(512))>; -}; - -&flash0 { - partitions { - storage_partition: partition@f80000 { - reg = <0xf80000 DT_SIZE_K(512)>; - read-only; - }; - }; -}; diff --git a/app/boards/boardsource/blok/boardsource_blok_zmk_defconfig b/app/boards/boardsource/blok/boardsource_blok_zmk_defconfig deleted file mode 100644 index 0c1a531e..00000000 --- a/app/boards/boardsource/blok/boardsource_blok_zmk_defconfig +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 - -CONFIG_RESET=y - -# Enable clock control by default -CONFIG_CLOCK_CONTROL=y - -# Code partition needed to target the correct flash range -CONFIG_USE_DT_CODE_PARTITION=y - -# Output UF2 by default, native bootloader supports it. -CONFIG_BUILD_OUTPUT_UF2=y - -# USB HID -CONFIG_ZMK_USB=y - -# Settings Support -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/boardsource_blok.conf b/app/boards/boardsource_blok.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/boardsource_blok.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit/kb2040/adafruit_kb2040_zmk.dts b/app/boards/boardsource_blok.overlay similarity index 53% rename from app/boards/adafruit/kb2040/adafruit_kb2040_zmk.dts rename to app/boards/boardsource_blok.overlay index 8c05cbaf..b14e0d04 100644 --- a/app/boards/adafruit/kb2040/adafruit_kb2040_zmk.dts +++ b/app/boards/boardsource_blok.overlay @@ -4,7 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include <../boards/adafruit/kb2040/adafruit_kb2040.dts> -#include +#include "usb_console.dtsi" &pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml index b06e8d54..d6eb89a3 100644 --- a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml +++ b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml @@ -9,6 +9,10 @@ description: | natural extension, once there were many shields designed for it, many other *boards* began to be developed that were compatible to leverage the extensive available shields. Today, many dev kits come with Uno headers to make it easy to work with them. + + Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only + supports 32-bit and 64-bit platforms. As a result, boards like the original Arduino Uno Rev3 itself are + *not* supported by ZMK. node_labels: gpio: arduino_header i2c: arduino_i2c diff --git a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml index 041375ae..83aa31c7 100644 --- a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml +++ b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml @@ -6,8 +6,12 @@ url: https://www.sparkfun.com/products/12640 manufacturer: SparkFun description: | The SparkFun Pro Micro grew popular as a low cost ATmega32U4 board with sufficient GPIO and peripherals - to work for many keyboard needs. Since the original Pro Micro, many pin compatible boards have appeared - with various changes or improvements. + to work for many keyboard needs. Since the original Pro Micro, many pin compatible boards have appeared, + with various changes or improvements, such as the Elite-C w/ USB-C, nice!nano with nRF52840 wireless. + + Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only + supports 32-bit and 64-bit platforms. As a result, controllers like the SparkFun Pro Micro and the Elite-C + are *not* supported by ZMK. node_labels: gpio: pro_micro i2c: pro_micro_i2c diff --git a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml index 139cf625..48080c7f 100644 --- a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml +++ b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml @@ -5,9 +5,9 @@ type: interconnect url: https://wiki.seeedstudio.com/Seeeduino-XIAO/ manufacturer: Seeed description: | - The Seeed Studio XIAO is a popular smaller format micro-controller, that has gained popularity as an alternative + The Seeed(uino) XIAO is a popular smaller format micro-controller, that has gained popularity as an alterative to the SparkFun Pro Micro. Since its creation, several pin compatible controllers, such - as the Seeed Studio XIAO nRF52840 (also known as XIAO BLE), Adafruit QT Py and Adafruit QT Py RP2040, have become available. + as the Seeeduino XIAO BLE, Adafruit QT Py and Adafruit QT Py RP2040, have become available. node_labels: gpio: xiao_d i2c: xiao_i2c diff --git a/app/boards/joric/nrfmicro/Kconfig.nrfmicro b/app/boards/joric/nrfmicro/Kconfig.nrfmicro deleted file mode 100644 index 68d724c4..00000000 --- a/app/boards/joric/nrfmicro/Kconfig.nrfmicro +++ /dev/null @@ -1,13 +0,0 @@ -# nrfmicro board configuration - -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_NRFMICRO - select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_ZMK - select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK - select SOC_NRF52833_QIAA if BOARD_NRFMICRO_NRF52833_ZMK - select ZMK_BOARD_COMPAT if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK - imply RETAINED_MEM if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK - imply RETENTION if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK - imply RETENTION_BOOT_MODE if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK diff --git a/app/boards/joric/nrfmicro/board.yml b/app/boards/joric/nrfmicro/board.yml deleted file mode 100644 index 391cee63..00000000 --- a/app/boards/joric/nrfmicro/board.yml +++ /dev/null @@ -1,9 +0,0 @@ -board: - extend: nrfmicro - variants: - - name: zmk - qualifier: nrf52840 - - name: flipped_zmk - qualifier: nrf52840 - - name: zmk - qualifier: nrf52833 diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk.dts deleted file mode 100644 index 7f597f58..00000000 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk.dts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/joric/nrfmicro/nrfmicro_nrf52833.dts> -#include - -/ { - chosen { - zmk,battery = &vbatt; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - init-delay-ms = <50>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; -}; - diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_zmk.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_zmk.dts deleted file mode 100644 index d1de13ce..00000000 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_zmk.dts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts> -#include - -/ { - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; -}; diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk.dts deleted file mode 100644 index a1995732..00000000 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk.dts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/joric/nrfmicro/nrfmicro_nrf52840.dts> -#include - -/ { - - chosen { - zmk,battery = &vbatt; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - init-delay-ms = <50>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; -}; diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_3_0.overlay b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_3_0.overlay deleted file mode 100644 index 3963dc43..00000000 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_3_0.overlay +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/ { - chosen { - zmk,battery = &vbatt; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - init-delay-ms = <50>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; -}; - -&adc { - status = "okay"; -}; - diff --git a/app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 b/app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 deleted file mode 100644 index 8a9b31d7..00000000 --- a/app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2026 Pete Johanson, Derek Schmell -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_BLUEMICRO840 - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_BLUEMICRO840_NRF52840_ZMK - imply RETAINED_MEM if BOARD_BLUEMICRO840_NRF52840_ZMK - imply RETENTION if BOARD_BLUEMICRO840_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_BLUEMICRO840_NRF52840_ZMK diff --git a/app/boards/jpconstantineau/bluemicro840/bluemicro840_nrf52840_zmk.dts b/app/boards/jpconstantineau/bluemicro840/bluemicro840_nrf52840_zmk.dts deleted file mode 100644 index e36be912..00000000 --- a/app/boards/jpconstantineau/bluemicro840/bluemicro840_nrf52840_zmk.dts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2026 Pete Johanson, Derek Schmell - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/jpconstantineau/bluemicro840/bluemicro840.dts> -#include - -/ { - chosen { - zmk,battery = &vbatt; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - init-delay-ms = <20>; - control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 7>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; - -}; diff --git a/app/boards/jpconstantineau/bluemicro840/bluemicro840_nrf52840_zmk_defconfig b/app/boards/jpconstantineau/bluemicro840/bluemicro840_nrf52840_zmk_defconfig deleted file mode 100644 index b41fbe47..00000000 --- a/app/boards/jpconstantineau/bluemicro840/bluemicro840_nrf52840_zmk_defconfig +++ /dev/null @@ -1,22 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y diff --git a/app/boards/jpconstantineau/bluemicro840/board.yml b/app/boards/jpconstantineau/bluemicro840/board.yml deleted file mode 100644 index 4341c04f..00000000 --- a/app/boards/jpconstantineau/bluemicro840/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: bluemicro840 - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake b/app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/kbdfans/tofu65/Kconfig.tofu65 b/app/boards/kbdfans/tofu65/Kconfig.tofu65 deleted file mode 100644 index 6844d439..00000000 --- a/app/boards/kbdfans/tofu65/Kconfig.tofu65 +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_TOFU65 - select SOC_RP2040 - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/kbdfans/tofu65/board.yml b/app/boards/kbdfans/tofu65/board.yml deleted file mode 100644 index 9441c642..00000000 --- a/app/boards/kbdfans/tofu65/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - name: tofu65 - vendor: kbdfans - socs: - - name: rp2040 - variants: - - name: zmk diff --git a/app/boards/keebio/bdn9/Kconfig.bdn9 b/app/boards/keebio/bdn9/Kconfig.bdn9 deleted file mode 100644 index 98a73619..00000000 --- a/app/boards/keebio/bdn9/Kconfig.bdn9 +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2020 Pete Johanson -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_BDN9 - select SOC_STM32F072XB - select ZMK_BOARD_COMPAT diff --git a/app/boards/keebio/bdn9/bdn9-layouts.dtsi b/app/boards/keebio/bdn9/bdn9-layouts.dtsi deleted file mode 100644 index bc0f5527..00000000 --- a/app/boards/keebio/bdn9/bdn9-layouts.dtsi +++ /dev/null @@ -1,20 +0,0 @@ -#include - -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "BDN9"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/boards/keebio/bdn9/board.yml b/app/boards/keebio/bdn9/board.yml deleted file mode 100644 index a2c5917d..00000000 --- a/app/boards/keebio/bdn9/board.yml +++ /dev/null @@ -1,12 +0,0 @@ -board: - name: bdn9 - vendor: keebio - socs: - - name: stm32f072xb - variants: - - name: zmk - revision: - format: major.minor.patch - default: 2.0.0 - revisions: - - name: 2.0.0 diff --git a/app/boards/keycapsss/puchi_ble/Kconfig.defconfig b/app/boards/keycapsss/puchi_ble/Kconfig.defconfig deleted file mode 100644 index 696e60f0..00000000 --- a/app/boards/keycapsss/puchi_ble/Kconfig.defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if BOARD_PUCHI_BLE - -if USB_DEVICE_STACK - -config USB_NRFX - default y - -endif # USB_DEVICE_STACK - -endif # BOARD_PUCHI_BLE diff --git a/app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble b/app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble deleted file mode 100644 index 67f52a99..00000000 --- a/app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble +++ /dev/null @@ -1,11 +0,0 @@ -# Puchi-BLE board configuration - -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_PUCHI_BLE - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_PUCHI_BLE_NRF52840_ZMK - imply RETAINED_MEM if BOARD_PUCHI_BLE_NRF52840_ZMK - imply RETENTION if BOARD_PUCHI_BLE_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_PUCHI_BLE_NRF52840_ZMK diff --git a/app/boards/keycapsss/puchi_ble/board.yml b/app/boards/keycapsss/puchi_ble/board.yml deleted file mode 100644 index ba5a6b11..00000000 --- a/app/boards/keycapsss/puchi_ble/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: puchi_ble - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/keycapsss/puchi_ble/pre_dt_board.cmake b/app/boards/keycapsss/puchi_ble/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/keycapsss/puchi_ble/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml b/app/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml deleted file mode 100644 index c641fe7d..00000000 --- a/app/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml +++ /dev/null @@ -1,10 +0,0 @@ -file_format: "1" -id: puchi_ble//zmk -name: Puchi-BLE V1 -type: board -arch: arm -outputs: - - usb - - ble -url: https://keycapsss.com/keyboard-parts/mcu-controller/202/puchi-ble-wireless-microcontroller -exposes: [pro_micro] diff --git a/app/boards/keycapsss/puchi_ble/puchi_ble_nrf52840_zmk.dts b/app/boards/keycapsss/puchi_ble/puchi_ble_nrf52840_zmk.dts deleted file mode 100644 index 4ba21200..00000000 --- a/app/boards/keycapsss/puchi_ble/puchi_ble_nrf52840_zmk.dts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/keycapsss/puchi_ble/puchi_ble.dts> -#include - - -/ { - chosen { - zmk,battery = &vbatt; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; -}; - diff --git a/app/boards/kinesis/adv360pro/Kconfig.adv360pro_left b/app/boards/kinesis/adv360pro/Kconfig.adv360pro_left deleted file mode 100644 index a0bf978a..00000000 --- a/app/boards/kinesis/adv360pro/Kconfig.adv360pro_left +++ /dev/null @@ -1,11 +0,0 @@ -# -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -config BOARD_ADV360PRO_LEFT - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/kinesis/adv360pro/Kconfig.adv360pro_right b/app/boards/kinesis/adv360pro/Kconfig.adv360pro_right deleted file mode 100644 index 823f262c..00000000 --- a/app/boards/kinesis/adv360pro/Kconfig.adv360pro_right +++ /dev/null @@ -1,11 +0,0 @@ -# -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -config BOARD_ADV360PRO_RIGHT - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/kinesis/adv360pro/Kconfig.defconfig b/app/boards/kinesis/adv360pro/Kconfig.defconfig deleted file mode 100644 index 0c4abacf..00000000 --- a/app/boards/kinesis/adv360pro/Kconfig.defconfig +++ /dev/null @@ -1,55 +0,0 @@ -# -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -if BOARD_ADV360PRO_LEFT - -config ZMK_KEYBOARD_NAME - default "Adv360 Pro" - -config ZMK_SPLIT_ROLE_CENTRAL - default y - -endif # BOARD_ADV360PRO_LEFT - -if BOARD_ADV360PRO_RIGHT - -config ZMK_KEYBOARD_NAME - default "Adv360 Pro rt" - -endif # BOARD_ADV360PRO_RIGHT - - -if BOARD_ADV360PRO_LEFT || BOARD_ADV360PRO_RIGHT - -config BOARD - default "adv360pro" - -config ZMK_SPLIT - default y - -config SPI - bool - default y - -config BT_CTLR - default BT - -if USB - -config USB_NRFX - default y - -config USB_DEVICE_STACK - default y - -endif # USB - -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - -config SPI - default y - -endif # BOARD_ADV360PRO_LEFT || BOARD_ADV360PRO_RIGHT diff --git a/app/boards/kinesis/adv360pro/README.md b/app/boards/kinesis/adv360pro/README.md deleted file mode 100755 index 89fa1da5..00000000 --- a/app/boards/kinesis/adv360pro/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Kinesis Advantage 360 Professional - -This board definition provides upstream support for the [Kinesis Advantage 360 Professional](https://kinesis-ergo.com/keyboards/advantage360/) - -Kinesis offer a specific [custom configuration](https://github.com/KinesisCorporation/Adv360-Pro-ZMK/) for the 360 Pro that references [a customised version of ZMK](https://github.com/ReFil/zmk/tree/adv360-z3.2-2) with Advantage 360 Pro specific functionality and changes over base ZMK. The Kinesis fork is regularly updated to bring the latest updates and changes from base ZMK however will not always be completely up to date, some features such as new keycodes will not be immediately available on the 360 Pro after they are implemented in base ZMK. - -When using this board definition some of the more advanced features (the indicator RGB leds) will not work, and Kinesis cannot provide customer service for usage of base ZMK. Likewise the ZMK community cannot provide support for either the Kinesis keymap editor, nor any usage of the Kinesis custom fork. diff --git a/app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi b/app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi deleted file mode 100644 index 7970e1be..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi +++ /dev/null @@ -1,87 +0,0 @@ -#include - -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 125 100 0 25 0 0 0> - , <&key_physical_attrs 100 100 125 25 0 0 0> - , <&key_physical_attrs 100 100 225 0 0 0 0> - , <&key_physical_attrs 100 100 325 0 0 0 0> - , <&key_physical_attrs 100 100 425 0 0 0 0> - , <&key_physical_attrs 100 100 525 0 0 0 0> - , <&key_physical_attrs 100 100 625 0 0 0 0> - , <&key_physical_attrs 100 100 1075 0 0 0 0> - , <&key_physical_attrs 100 100 1175 0 0 0 0> - , <&key_physical_attrs 100 100 1275 0 0 0 0> - , <&key_physical_attrs 100 100 1375 0 0 0 0> - , <&key_physical_attrs 100 100 1475 0 0 0 0> - , <&key_physical_attrs 100 100 1575 25 0 0 0> - , <&key_physical_attrs 125 100 1675 25 0 0 0> - , <&key_physical_attrs 125 100 0 125 0 0 0> - , <&key_physical_attrs 100 100 125 125 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 1075 100 0 0 0> - , <&key_physical_attrs 100 100 1175 100 0 0 0> - , <&key_physical_attrs 100 100 1275 100 0 0 0> - , <&key_physical_attrs 100 100 1375 100 0 0 0> - , <&key_physical_attrs 100 100 1475 100 0 0 0> - , <&key_physical_attrs 100 100 1575 125 0 0 0> - , <&key_physical_attrs 125 100 1675 125 0 0 0> - , <&key_physical_attrs 125 100 0 225 0 0 0> - , <&key_physical_attrs 100 100 125 225 0 0 0> - , <&key_physical_attrs 100 100 225 200 0 0 0> - , <&key_physical_attrs 100 100 325 200 0 0 0> - , <&key_physical_attrs 100 100 425 200 0 0 0> - , <&key_physical_attrs 100 100 525 200 0 0 0> - , <&key_physical_attrs 100 100 625 200 0 0 0> - , <&key_physical_attrs 100 100 675 400 1500 525 400> - , <&key_physical_attrs 100 100 775 400 1500 525 400> - , <&key_physical_attrs 100 100 925 400 (-1500) 1275 400> - , <&key_physical_attrs 100 100 1025 400 (-1500) 1275 400> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 100 100 1275 200 0 0 0> - , <&key_physical_attrs 100 100 1375 200 0 0 0> - , <&key_physical_attrs 100 100 1475 200 0 0 0> - , <&key_physical_attrs 100 100 1575 225 0 0 0> - , <&key_physical_attrs 125 100 1675 225 0 0 0> - , <&key_physical_attrs 125 100 0 325 0 0 0> - , <&key_physical_attrs 100 100 125 325 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 775 500 1500 525 400> - , <&key_physical_attrs 100 100 925 500 (-1500) 1275 400> - , <&key_physical_attrs 100 100 1175 300 0 0 0> - , <&key_physical_attrs 100 100 1275 300 0 0 0> - , <&key_physical_attrs 100 100 1375 300 0 0 0> - , <&key_physical_attrs 100 100 1475 300 0 0 0> - , <&key_physical_attrs 100 100 1575 325 0 0 0> - , <&key_physical_attrs 125 100 1675 325 0 0 0> - , <&key_physical_attrs 125 100 0 425 0 0 0> - , <&key_physical_attrs 100 100 125 425 0 0 0> - , <&key_physical_attrs 100 100 225 400 0 0 0> - , <&key_physical_attrs 100 100 325 400 0 0 0> - , <&key_physical_attrs 100 100 425 400 0 0 0> - , <&key_physical_attrs 100 200 575 500 1500 525 400> - , <&key_physical_attrs 100 200 675 500 1500 525 400> - , <&key_physical_attrs 100 100 775 600 1500 525 400> - , <&key_physical_attrs 100 100 925 600 (-1500) 1275 400> - , <&key_physical_attrs 100 200 1025 500 (-1500) 1275 400> - , <&key_physical_attrs 100 200 1125 500 (-1500) 1275 400> - , <&key_physical_attrs 100 100 1275 400 0 0 0> - , <&key_physical_attrs 100 100 1375 400 0 0 0> - , <&key_physical_attrs 100 100 1475 400 0 0 0> - , <&key_physical_attrs 100 100 1575 425 0 0 0> - , <&key_physical_attrs 125 100 1675 425 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi b/app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi deleted file mode 100644 index 7dafcdce..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * SPDX-License-Identifier: MIT - */ - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; - pwm0_default: pwm0_default { - group1 { - psels = ; - }; - }; - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; \ No newline at end of file diff --git a/app/boards/kinesis/adv360pro/adv360pro.dtsi b/app/boards/kinesis/adv360pro/adv360pro.dtsi deleted file mode 100644 index d9a00b01..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro.dtsi +++ /dev/null @@ -1,165 +0,0 @@ -/* -* -* Copyright (c) 2023 The ZMK Contributors -* SPDX-License-Identifier: MIT -* -*/ - -/dts-v1/; -#include -#include - -#include -#include - -#include "adv360pro-layouts.dtsi" -#include "adv360pro-pinctrl.dtsi" - -&physical_layout0 { - transform = <&matrix_transform0>; -}; - -/ { - model = "Adv360 Pro"; - compatible = "kinesis,adv360pro"; - - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zmk,backlight = &backlight; - zmk,battery = &vbatt; - zmk,physical-layout = &physical_layout0; - zmk,kscan = &kscan0; - zmk,underglow = &led_strip; - }; - - matrix_transform0: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <20>; - rows = <5>; - - - map = < - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) RC(4,18) RC(4,19) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) RC(3,18) RC(3,19) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) RC(2,18) RC(2,19) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,9) RC(1,10) RC(1,14) RC(1,15) RC(1,16) RC(1,17) RC(1,18) RC(1,19) - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,15) RC(0,16) RC(0,17) RC(0,18) RC(0,19) - - >; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - output-ohms = <100000>; - full-ohms = <(100000 + 100000)>; - }; - - backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 10000 PWM_POLARITY_NORMAL>; - }; - }; - -}; - -®1 { - regulator-initial-mode = ; -}; - -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&adc { - status = "okay"; -}; - -&gpiote { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&gpio1 { - status = "okay"; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -&flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - sd_partition: partition@0 { - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - reg = <0x00026000 0x000c6000>; - }; - - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ - - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - reg = <0x000ec000 0x00008000>; - }; - - boot_partition: partition@f4000 { - reg = <0x000f4000 0x0000c000>; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <3>; /* number of LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; diff --git a/app/boards/kinesis/adv360pro/adv360pro.keymap b/app/boards/kinesis/adv360pro/adv360pro.keymap deleted file mode 100644 index 999781e4..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro.keymap +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &tog 1 &mo 3 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS - &kp TAB &kp Q &kp W &kp E &kp R &kp T &none &none &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp ESC &kp A &kp S &kp D &kp F &kp G &none &kp LCTRL &kp LALT &kp LGUI &kp RCTRL &none &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp HOME &kp PG_UP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &mo 2 &kp GRAVE &kp CAPS &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp END &kp PG_DN &kp ENTER &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &mo 2 - >; - }; - keypad { - bindings = < - &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &trans &mo 3 &kp N6 &kp KP_NUM &kp KP_EQUAL &kp KP_DIVIDE &kp KP_MULTIPLY &kp MINUS - &kp TAB &kp Q &kp W &kp E &kp R &kp T &none &none &kp Y &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp BSLH - &kp ESC &kp A &kp S &kp D &kp F &kp G &none &kp LCTRL &kp LALT &kp LGUI &kp RCTRL &none &kp H &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp HOME &kp PG_UP &kp N &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &kp RSHFT - &mo 2 &kp GRAVE &kp CAPS &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp END &kp PG_DN &kp ENTER &kp KP_N0 &kp UP &kp DOWN &kp KP_DOT &kp RBKT &mo 2 - >; - }; - fn { - bindings = < - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &tog 1 &mo 3 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 - &trans &trans &trans &trans &trans &trans &none &none &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &none &trans &trans &trans &trans &none &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - mod { - bindings = < - &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &trans &none &none &none &none &none &none - &none &none &none &none &none &none &bootloader &bootloader &none &none &none &none &none &none - &none &none &none &none &none &none &none &none &none &bt BT_CLR &none &none &none &none &none &none &none &none - &none &none &none &none &none &none &none &none &none &none &none &none &none &none - &none &none &none &none &none &none &none &none &none &bl BL_TOG &rgb_ug RGB_TOG &bl BL_INC &bl BL_DEC &none &none &none - >; - }; - }; -}; diff --git a/app/boards/kinesis/adv360pro/adv360pro.zmk.yml b/app/boards/kinesis/adv360pro/adv360pro.zmk.yml deleted file mode 100644 index 2d1e3496..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro.zmk.yml +++ /dev/null @@ -1,17 +0,0 @@ -file_format: "1" -id: adv360pro -name: Advantage 360 Pro -type: board -url: https://kinesis-ergo.com/keyboards/advantage360 -arch: arm -features: - - keys - - underglow - - backlight - - studio -outputs: - - usb - - ble -siblings: - - adv360pro_left//zmk - - adv360pro_right//zmk diff --git a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk.dts b/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk.dts deleted file mode 100644 index 459a2232..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk.dts +++ /dev/null @@ -1,37 +0,0 @@ -/* -* -* Copyright (c) 2023 The ZMK Contributors -* SPDX-License-Identifier: MIT -* -*/ - -#include "adv360pro.dtsi" - -/{ - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - - diode-direction = "col2row"; - row-gpios - = <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - - col-gpios - = <&gpio0 25 GPIO_ACTIVE_HIGH> - , <&gpio0 11 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - ; - }; -}; diff --git a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk_defconfig b/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk_defconfig deleted file mode 100644 index 7a8db4dc..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk_defconfig +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -# Enable SPI for LEDS -CONFIG_PINCTRL=y -CONFIG_SPI=y -CONFIG_SPI_NRFX=y - -# Enable writing to flash -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Enable 32kHz crystal -CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y -CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y - -#RGB leds config -CONFIG_ZMK_RGB_UNDERGLOW=y -CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y -CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n -CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=0 -CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y - -#Backlighting configuration -CONFIG_PWM=y -CONFIG_LED_PWM=y -CONFIG_ZMK_BACKLIGHT=y -CONFIG_ZMK_BACKLIGHT_BRT_START=20 -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y - -#Misc configuration -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -CONFIG_ZMK_HID_REPORT_TYPE_NKRO=y -CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y diff --git a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk.dts b/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk.dts deleted file mode 100644 index 3c96f3a1..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk.dts +++ /dev/null @@ -1,41 +0,0 @@ -/* -* -* Copyright (c) 2023 The ZMK Contributors -* SPDX-License-Identifier: MIT -* -*/ - -#include "adv360pro.dtsi" - -/{ - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - - diode-direction = "col2row"; - row-gpios - = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - - col-gpios - = <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - ; - }; -}; - -&matrix_transform0 { - col-offset = <10>; -}; diff --git a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk_defconfig b/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk_defconfig deleted file mode 100644 index 1cda90c0..00000000 --- a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk_defconfig +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -# Enable SPI for LEDS -CONFIG_PINCTRL=y -CONFIG_SPI=y -CONFIG_SPI_NRFX=y - -# Enable writing to flash -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Enable 32kHz crystal -CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y -CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y - -#RGB leds config -CONFIG_ZMK_RGB_UNDERGLOW=y -CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y -CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n -CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=0 -CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y - -#Backlighting configuration -CONFIG_PWM=y -CONFIG_LED_PWM=y -CONFIG_ZMK_BACKLIGHT=y -CONFIG_ZMK_BACKLIGHT_BRT_START=20 -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y - -#Misc configuration -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -CONFIG_ZMK_HID_REPORT_TYPE_NKRO=y -CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_ZMK_BLE=y diff --git a/app/boards/kinesis/adv360pro/board.cmake b/app/boards/kinesis/adv360pro/board.cmake deleted file mode 100644 index bee7f6ad..00000000 --- a/app/boards/kinesis/adv360pro/board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") - -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/kinesis/adv360pro/board.yml b/app/boards/kinesis/adv360pro/board.yml deleted file mode 100644 index 8ec7f8f8..00000000 --- a/app/boards/kinesis/adv360pro/board.yml +++ /dev/null @@ -1,13 +0,0 @@ -boards: - - name: adv360pro_left - vendor: kinesis - socs: - - name: nrf52840 - variants: - - name: zmk - - name: adv360pro_right - vendor: kinesis - socs: - - name: nrf52840 - variants: - - name: zmk diff --git a/app/boards/kinesis/adv360pro/pre_dt_board.cmake b/app/boards/kinesis/adv360pro/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/kinesis/adv360pro/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left b/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left deleted file mode 100644 index fb1e7027..00000000 --- a/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left +++ /dev/null @@ -1,11 +0,0 @@ -# -# Copyright (c) 2022 Darryl deHaan -# SPDX-License-Identifier: MIT -# - -config BOARD_CORNEISH_ZEN_LEFT - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_right b/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_right deleted file mode 100644 index 4009ebf1..00000000 --- a/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_right +++ /dev/null @@ -1,11 +0,0 @@ -# -# Copyright (c) 2022 Darryl deHaan -# SPDX-License-Identifier: MIT -# - -config BOARD_CORNEISH_ZEN_RIGHT - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/lowprokb/corneish_zen/board.cmake b/app/boards/lowprokb/corneish_zen/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/boards/lowprokb/corneish_zen/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/lowprokb/corneish_zen/board.yml b/app/boards/lowprokb/corneish_zen/board.yml deleted file mode 100644 index aafdcbd6..00000000 --- a/app/boards/lowprokb/corneish_zen/board.yml +++ /dev/null @@ -1,27 +0,0 @@ -boards: - - name: corneish_zen_left - vendor: lowprokb - socs: - - name: nrf52840 - variants: - - name: zmk - revision: - format: major.minor.patch - default: 2.0.0 - exact: false - revisions: - - name: 2.0.0 - - name: 1.0.0 - - name: corneish_zen_right - vendor: lowprokb - socs: - - name: nrf52840 - variants: - - name: zmk - revision: - format: major.minor.patch - default: 2.0.0 - exact: false - revisions: - - name: 2.0.0 - - name: 1.0.0 diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk.dts deleted file mode 100644 index 6849efa3..00000000 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_left_nrf52840_zmk.dts +++ /dev/null @@ -1,8 +0,0 @@ -/* -* -* Copyright (c) 2025 The ZMK Contributors -* SPDX-License-Identifier: MIT -* -*/ - -#include "corneish_zen.dtsi" \ No newline at end of file diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk.dts deleted file mode 100644 index 6849efa3..00000000 --- a/app/boards/lowprokb/corneish_zen/corneish_zen_right_nrf52840_zmk.dts +++ /dev/null @@ -1,8 +0,0 @@ -/* -* -* Copyright (c) 2025 The ZMK Contributors -* SPDX-License-Identifier: MIT -* -*/ - -#include "corneish_zen.dtsi" \ No newline at end of file diff --git a/app/boards/lowprokb/corneish_zen/pre_dt_board.cmake b/app/boards/lowprokb/corneish_zen/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/lowprokb/corneish_zen/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 b/app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 deleted file mode 100644 index 9225eb86..00000000 --- a/app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_NRF52840_M2 - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_NRF52840_M2_NRF52840_ZMK - imply RETAINED_MEM if BOARD_NRF52840_M2_NRF52840_ZMK - imply RETENTION if BOARD_NRF52840_M2_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_NRF52840_M2_NRF52840_ZMK diff --git a/app/boards/makerdiary/nrf52840_m2/board.yml b/app/boards/makerdiary/nrf52840_m2/board.yml deleted file mode 100644 index 16079c2c..00000000 --- a/app/boards/makerdiary/nrf52840_m2/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: nrf52840_m2 - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_nrf52840_zmk.dts b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_nrf52840_zmk.dts deleted file mode 100644 index cdca8a68..00000000 --- a/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_nrf52840_zmk.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; -#include <../boards/makerdiary/nrf52840_m2/nrf52840_m2.dts> -#include - -/ { - model = "Makerdiary nRF52840 M.2 module"; - compatible = "makerdiary,nrf52840_m2"; - - chosen { - zmk,battery = &vbatt; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 0>; - output-ohms = <1000000>; - full-ohms = <(1000000 + 1000000)>; - }; -}; diff --git a/app/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake b/app/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/mechwild/pillbug/Kconfig.pillbug b/app/boards/mechwild/pillbug/Kconfig.pillbug deleted file mode 100644 index 548a7e64..00000000 --- a/app/boards/mechwild/pillbug/Kconfig.pillbug +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PILLBUG - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_PILLBUG_NRF52840_ZMK - imply RETAINED_MEM if BOARD_PILLBUG_NRF52840_ZMK - imply RETENTION if BOARD_PILLBUG_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_PILLBUG_NRF52840_ZMK diff --git a/app/boards/mechwild/pillbug/board.cmake b/app/boards/mechwild/pillbug/board.cmake deleted file mode 100644 index d9d4ed92..00000000 --- a/app/boards/mechwild/pillbug/board.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: MIT - -set(OPENOCD_NRF5_SUBFAMILY nrf52) -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) -include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/mechwild/pillbug/board.yml b/app/boards/mechwild/pillbug/board.yml deleted file mode 100644 index eb3d5172..00000000 --- a/app/boards/mechwild/pillbug/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: pillbug - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/mechwild/pillbug/pillbug_nrf52840_zmk.dts b/app/boards/mechwild/pillbug/pillbug_nrf52840_zmk.dts deleted file mode 100644 index ff977338..00000000 --- a/app/boards/mechwild/pillbug/pillbug_nrf52840_zmk.dts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; - -#include <../boards/mechwild/pillbug/pillbug.dts> -#include - - -/ { - chosen { - zmk,battery = &vbatt; - }; - - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; - init-delay-ms = <50>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; -}; diff --git a/app/boards/mechwild/s40nc/Kconfig.s40nc b/app/boards/mechwild/s40nc/Kconfig.s40nc deleted file mode 100644 index 749f8f11..00000000 --- a/app/boards/mechwild/s40nc/Kconfig.s40nc +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_S40NC - select SOC_NRF52840_QIAA - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/mechwild/s40nc/board.yml b/app/boards/mechwild/s40nc/board.yml deleted file mode 100644 index 61700618..00000000 --- a/app/boards/mechwild/s40nc/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - name: s40nc - vendor: mechwild - socs: - - name: nrf52840 - variants: - - name: zmk diff --git a/app/boards/mechwild/s40nc/pre_dt_board.cmake b/app/boards/mechwild/s40nc/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/mechwild/s40nc/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/moergo/glove80/Kconfig.defconfig b/app/boards/moergo/glove80/Kconfig.defconfig deleted file mode 100644 index 6280a151..00000000 --- a/app/boards/moergo/glove80/Kconfig.defconfig +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if BOARD_GLOVE80_LH - -config BOARD - default "glove80 lh" - -config ZMK_SPLIT_ROLE_CENTRAL - default y - -endif # BOARD_GLOVE80_LH - -if BOARD_GLOVE80_RH - -config BOARD - default "glove80 rh" - -endif # BOARD_GLOVE80_RH - -if BOARD_GLOVE80_LH || BOARD_GLOVE80_RH - -config ZMK_SPLIT - default y - -config BT_CTLR - default BT - -config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS - default 5 - -config PINCTRL - default y - -if USB - -config USB_NRFX - default y - -config USB_DEVICE_STACK - default y - -endif # USB - -if ZMK_BACKLIGHT - -config PWM - default y - -config LED_PWM - default y - -endif # ZMK_BACKLIGHT - -endif # BOARD_GLOVE80_LH || BOARD_GLOVE80_RH diff --git a/app/boards/moergo/glove80/Kconfig.glove80_lh b/app/boards/moergo/glove80/Kconfig.glove80_lh deleted file mode 100644 index 33046e7d..00000000 --- a/app/boards/moergo/glove80/Kconfig.glove80_lh +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_GLOVE80_LH - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/moergo/glove80/Kconfig.glove80_rh b/app/boards/moergo/glove80/Kconfig.glove80_rh deleted file mode 100644 index 68590e4b..00000000 --- a/app/boards/moergo/glove80/Kconfig.glove80_rh +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_GLOVE80_RH - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/moergo/glove80/board.cmake b/app/boards/moergo/glove80/board.cmake deleted file mode 100644 index ed0e07a5..00000000 --- a/app/boards/moergo/glove80/board.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/moergo/glove80/board.yml b/app/boards/moergo/glove80/board.yml deleted file mode 100644 index fcbd7cf5..00000000 --- a/app/boards/moergo/glove80/board.yml +++ /dev/null @@ -1,9 +0,0 @@ -boards: - - name: glove80_rh - vendor: moergo - socs: - - name: nrf52840 - - name: glove80_lh - vendor: moergo - socs: - - name: nrf52840 diff --git a/app/boards/moergo/glove80/glove80-layouts.dtsi b/app/boards/moergo/glove80/glove80-layouts.dtsi deleted file mode 100644 index 0c4f2d4e..00000000 --- a/app/boards/moergo/glove80/glove80-layouts.dtsi +++ /dev/null @@ -1,91 +0,0 @@ -#include - -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 50 0 0 0> - , <&key_physical_attrs 100 100 100 50 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 100 100 1600 50 0 0 0> - , <&key_physical_attrs 100 100 1700 50 0 0 0> - , <&key_physical_attrs 100 100 0 150 0 0 0> - , <&key_physical_attrs 100 100 100 150 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 100 100 1300 100 0 0 0> - , <&key_physical_attrs 100 100 1400 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 100 100 1600 150 0 0 0> - , <&key_physical_attrs 100 100 1700 150 0 0 0> - , <&key_physical_attrs 100 100 0 250 0 0 0> - , <&key_physical_attrs 100 100 100 250 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 1200 200 0 0 0> - , <&key_physical_attrs 100 100 1300 200 0 0 0> - , <&key_physical_attrs 100 100 1400 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 100 100 1600 250 0 0 0> - , <&key_physical_attrs 100 100 1700 250 0 0 0> - , <&key_physical_attrs 100 100 0 350 0 0 0> - , <&key_physical_attrs 100 100 100 350 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 1200 300 0 0 0> - , <&key_physical_attrs 100 100 1300 300 0 0 0> - , <&key_physical_attrs 100 100 1400 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 100 100 1600 350 0 0 0> - , <&key_physical_attrs 100 100 1700 350 0 0 0> - , <&key_physical_attrs 100 100 0 450 0 0 0> - , <&key_physical_attrs 100 100 100 450 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 400 400 0 0 0> - , <&key_physical_attrs 100 100 500 400 0 0 0> - , <&key_physical_attrs 100 100 400 450 3000 450 925> - , <&key_physical_attrs 100 100 400 450 4500 450 925> - , <&key_physical_attrs 100 100 400 450 6000 450 925> - , <&key_physical_attrs 100 100 1300 450 (-6000) 1350 925> - , <&key_physical_attrs 100 100 1300 450 (-4500) 1350 925> - , <&key_physical_attrs 100 100 1300 450 (-3000) 1350 925> - , <&key_physical_attrs 100 100 1200 400 0 0 0> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - , <&key_physical_attrs 100 100 1600 450 0 0 0> - , <&key_physical_attrs 100 100 1700 450 0 0 0> - , <&key_physical_attrs 100 100 0 550 0 0 0> - , <&key_physical_attrs 100 100 100 550 0 0 0> - , <&key_physical_attrs 100 100 200 500 0 0 0> - , <&key_physical_attrs 100 100 300 500 0 0 0> - , <&key_physical_attrs 100 100 400 500 0 0 0> - , <&key_physical_attrs 100 100 400 550 2000 450 925> - , <&key_physical_attrs 100 100 400 550 4000 450 925> - , <&key_physical_attrs 100 100 400 550 6000 450 925> - , <&key_physical_attrs 100 100 1300 550 (-6000) 1350 925> - , <&key_physical_attrs 100 100 1300 550 (-4000) 1350 925> - , <&key_physical_attrs 100 100 1300 550 (-2000) 1350 925> - , <&key_physical_attrs 100 100 1300 500 0 0 0> - , <&key_physical_attrs 100 100 1400 500 0 0 0> - , <&key_physical_attrs 100 100 1500 500 0 0 0> - , <&key_physical_attrs 100 100 1600 550 0 0 0> - , <&key_physical_attrs 100 100 1700 550 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/boards/moergo/glove80/glove80.dtsi b/app/boards/moergo/glove80/glove80.dtsi deleted file mode 100644 index cf3ce7cc..00000000 --- a/app/boards/moergo/glove80/glove80.dtsi +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; -#include -#include - -#include -#include "glove80-layouts.dtsi" - -&physical_layout0 { - transform = <&matrix_transform0>; -}; - - -/ { - chosen { - zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - }; - - matrix_transform0: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <6>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(3,6) RC(4,6) RC(5,6) RC(5,7) RC(4,7) RC(3,7) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) - >; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - - diode-direction = "col2row"; - debounce-press-ms = <4>; - debounce-release-ms = <20>; - }; -}; - -®1 { - regulator-initial-mode = ; -}; - -&adc { - status = "okay"; -}; - -&gpiote { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&gpio1 { - status = "okay"; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -&flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - sd_partition: partition@0 { - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - reg = <0x00026000 0x000c6000>; - }; - - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ - - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - reg = <0x000ec000 0x00008000>; - }; - - boot_partition: partition@f4000 { - reg = <0x000f4000 0x0000c000>; - }; - }; -}; diff --git a/app/boards/moergo/glove80/glove80.keymap b/app/boards/moergo/glove80/glove80.keymap deleted file mode 100644 index 60129bd9..00000000 --- a/app/boards/moergo/glove80/glove80.keymap +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include - -// layers -#define DEFAULT 0 -#define LOWER 1 -#define MAGIC 2 - -/ { - behaviors { - // For the "layer" key, it'd nice to be able to use it as either a shift or a toggle. - // Configure it as a tap dance, so the first tap (or hold) is a &mo and the second tap is a &to - layer_td: tap_dance_0 { - compatible = "zmk,behavior-tap-dance"; - #binding-cells = <0>; - tapping-term-ms = <200>; - bindings = <&mo LOWER>, <&to LOWER>; - }; - }; - - macros { - bt_0: bt_profile_macro_0 { - compatible = "zmk,behavior-macro"; - #binding-cells = <0>; - bindings - = <&out OUT_BLE>, - <&bt BT_SEL 0>; - }; - - bt_1: bt_profile_macro_1 { - compatible = "zmk,behavior-macro"; - #binding-cells = <0>; - bindings - = <&out OUT_BLE>, - <&bt BT_SEL 1>; - }; - - bt_2: bt_profile_macro_2 { - compatible = "zmk,behavior-macro"; - #binding-cells = <0>; - bindings - = <&out OUT_BLE>, - <&bt BT_SEL 2>; - }; - - bt_3: bt_profile_macro_3 { - compatible = "zmk,behavior-macro"; - #binding-cells = <0>; - bindings - = <&out OUT_BLE>, - <&bt BT_SEL 3>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - // --------------------------------------------------------------------------------------------------------------------------------- - // | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | - // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | - // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | - // | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | - // | ` | Z | X | C | V | B | LSHFT | LCTRL | LOWER | | LGUI | RCTRL | RSHFT | N | M | , | . | / | PGUP | - // | MAGIC | HOME| END | LEFT | RIGHT| | BSPC | DEL | LALT | | RALT | RET | SPACE | | UP | DOWN | [ | ] | PGDN | - - bindings = < - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 - &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &layer_td &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP - &mo MAGIC &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN - >; - }; - - lower_layer { - bindings = < - &kp C_BRI_DN &kp C_BRI_UP &kp C_PREV &kp C_NEXT &kp C_PP &kp C_MUTE &kp C_VOL_DN &kp C_VOL_UP &none &kp PAUSE_BREAK - &trans &none &none &none &none &kp HOME &kp LPAR &kp KP_NUM &kp KP_EQUAL &kp KP_DIVIDE &kp KP_MULTIPLY &kp PSCRN - &trans &none &none &kp UP &none &kp END &kp RPAR &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp SLCK - &trans &none &kp LEFT &kp DOWN &kp RIGHT &kp PG_UP &kp PRCNT &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &none - &trans &kp K_CMENU &none &kp F11 &kp F12 &kp PG_DN &trans &trans &to DEFAULT &trans &trans &trans &kp COMMA &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &trans - &trans &kp CAPS &kp INS &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans - >; - }; - - magic_layer { - bindings = < - &bt BT_CLR &none &none &none &none &none &none &none &none &none - &none &none &none &none &none &none &none &none &none &none &none &none - &none &rgb_ug RGB_SPI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &none &none &none &none &none &none - &bootloader &rgb_ug RGB_SPD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_EFF &none &none &none &none &none &bootloader - &sys_reset &none &none &none &none &none &bt_2 &bt_3 &none &none &none &none &none &none &none &none &none &sys_reset - &none &none &none &none &none &bt_0 &bt_1 &out OUT_USB &none &none &none &none &none &none &none &none - >; - }; - }; -}; diff --git a/app/boards/moergo/glove80/glove80.zmk.yml b/app/boards/moergo/glove80/glove80.zmk.yml deleted file mode 100644 index 708fa4f2..00000000 --- a/app/boards/moergo/glove80/glove80.zmk.yml +++ /dev/null @@ -1,17 +0,0 @@ -file_format: "1" -id: glove80 -name: Glove80 -type: board -arch: arm -url: https://www.moergo.com/ -features: - - keys - - underglow - - backlight - - studio -outputs: - - usb - - ble -siblings: - - glove80_lh - - glove80_rh diff --git a/app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi b/app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi deleted file mode 100644 index 3dbf3d7e..00000000 --- a/app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * SPDX-License-Identifier: MIT - */ - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; // WS2812_VEXT_DATA - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; - - pwm0_default: pwm0_default { - group1 { - psels = ; // rear LED - }; - }; - - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - bias-pull-down; - }; - }; - - uart0_default: uart0_default { - group1 { - psels = , // EXT1 - ; // EXT2 - }; - }; - - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; -}; diff --git a/app/boards/moergo/glove80/glove80_lh.dts b/app/boards/moergo/glove80/glove80_lh.dts deleted file mode 100644 index 2ed56688..00000000 --- a/app/boards/moergo/glove80/glove80_lh.dts +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "glove80.dtsi" -#include "glove80_lh-pinctrl.dtsi" - -#include - -/ { - model = "glove80_lh"; - compatible = "glove80_lh"; - - chosen { - zmk,underglow = &led_strip; - zmk,backlight = &back_led_backlight; - zmk,battery = &vbatt; - }; - - back_led_backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; - }; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ - init-delay-ms = <100>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-nrf-vddh"; - }; - - glove80_ext: connector { - compatible = "moergo,glove80-ext"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <1 0 &gpio0 22 0> /* EXT1 */ - , <2 0 &gpio0 21 0> /* EXT2 */ - , <3 0 &gpio0 24 0> /* EXT3 */ - , <4 0 &gpio0 20 0> /* EXT4 */ - , <5 0 &gpio0 25 0> /* EXT5 */ - , <6 0 &gpio1 00 0> /* EXT6 */ - ; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <40>; /* 40 keys have underglow at the moment */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&kscan0 { - row-gpios - = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW1 - , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW2 - , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW3 - , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW4 - , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW5 - , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW6 - ; - col-gpios - = <&gpio1 8 GPIO_ACTIVE_HIGH> // LH COL6 - , <&gpio1 4 GPIO_ACTIVE_HIGH> // LH COL5 - , <&gpio1 6 GPIO_ACTIVE_HIGH> // LH COL4 - , <&gpio1 7 GPIO_ACTIVE_HIGH> // LH COL3 - , <&gpio1 5 GPIO_ACTIVE_HIGH> // LH COL2 - , <&gpio1 3 GPIO_ACTIVE_HIGH> // LH COL1 - , <&gpio1 1 GPIO_ACTIVE_HIGH> // LH Thumb - ; -}; diff --git a/app/boards/moergo/glove80/glove80_lh_defconfig b/app/boards/moergo/glove80/glove80_lh_defconfig deleted file mode 100644 index 9973e953..00000000 --- a/app/boards/moergo/glove80/glove80_lh_defconfig +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -# Enable both USB and BLE -CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y - -# Keyboard IDs -CONFIG_ZMK_KEYBOARD_NAME="Glove80 Left" -CONFIG_USB_DEVICE_PID=0x27db -CONFIG_USB_DEVICE_VID=0x16c0 -CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" -CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" - -CONFIG_BT_DIS_PNP_PID=0x27db -CONFIG_BT_DIS_PNP_VID=0x16c0 -CONFIG_BT_DIS_MANUF="MoErgo" -CONFIG_BT_DIS_MODEL="Glove80" - -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y - -# Work-around for Windows bug with battery notifications -CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable GPIO -CONFIG_GPIO=y - -# Build configurations -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9807B007" -CONFIG_USE_DT_CODE_PARTITION=y - -# Flash configuration -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Enable 32kHz crystal -CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y - -# Enable RGB underglow -CONFIG_ZMK_RGB_UNDERGLOW=y - -CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y -CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n -CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 -CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=4 - -# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 80. Configuring -# BRT_MAX above 80% will draw additional current and can potentially damage your -# computer. WARRANTY IS VOID IF BRT_MAX SET ABOVE 80. -CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 - -CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 -CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 -CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 -CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 - -# The power LED is implemented as a backlight -# For now, the power LED is acting as a "USB connected" indicator -CONFIG_ZMK_BACKLIGHT=y -CONFIG_ZMK_BACKLIGHT_ON_START=y -CONFIG_ZMK_BACKLIGHT_BRT_START=5 -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y - -# The full two-byte consumer report space has compatibility issues with some -# operating systems, most notably macOS. Use the more basic single-byte usage -# space. -CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y - -# Turn on debugging to disable optimization. Debug messages can result in larger -# stacks, so enable stack protection and particularly a larger BLE peripheral stack. -# CONFIG_DEBUG=y -# CONFIG_DEBUG_THREAD_INFO=y -# CONFIG_EXCEPTION_STACK_TRACE=y -# CONFIG_HW_STACK_PROTECTION=y -# CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE=1300 - -# Log via USB or Segger RTT -CONFIG_ZMK_USB_LOGGING=n -CONFIG_ZMK_RTT_LOGGING=n diff --git a/app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi b/app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi deleted file mode 100644 index 454a2621..00000000 --- a/app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * SPDX-License-Identifier: MIT - */ - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; // WS2812_VEXT_DATA - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; - - pwm0_default: pwm0_default { - group1 { - psels = ; // Rear LED - }; - }; - - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - bias-pull-down; - }; - }; - - uart0_default: uart0_default { - group1 { - psels = , // EXT1 - ; // EXT2 - }; - }; - - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; - -}; diff --git a/app/boards/moergo/glove80/glove80_rh.dts b/app/boards/moergo/glove80/glove80_rh.dts deleted file mode 100644 index 7b54f62c..00000000 --- a/app/boards/moergo/glove80/glove80_rh.dts +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - - -#include "glove80.dtsi" -#include "glove80_rh-pinctrl.dtsi" - -#include - -/ { - model = "glove80_rh"; - compatible = "glove80_rh"; - - chosen { - zmk,underglow = &led_strip; - zmk,backlight = &back_led_backlight; - zmk,battery = &vbatt; - }; - - back_led_backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; - }; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ - init-delay-ms = <100>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-nrf-vddh"; - }; - - glove80_ext: connector { - compatible = "moergo,glove80-ext"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <1 0 &gpio0 21 0> /* EXT1 */ - , <2 0 &gpio0 24 0> /* EXT2 */ - , <3 0 &gpio0 20 0> /* EXT3 */ - , <4 0 &gpio0 25 0> /* EXT4 */ - , <5 0 &gpio0 22 0> /* EXT5 */ - , <6 0 &gpio1 00 0> /* EXT6 */ - ; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <40>; /* 40 keys have underglow at the moment */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; - - -&uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -/* For right hand, the columns are offset by 7 */ -&matrix_transform0 { - col-offset = <7>; -}; - -&kscan0 { - row-gpios - = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW1 - , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW2 - , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW3 - , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW4 - , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW5 - , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW6 - ; - col-gpios - = <&gpio1 6 GPIO_ACTIVE_HIGH> // RH Thumb - , <&gpio1 4 GPIO_ACTIVE_HIGH> // RH COL1 - , <&gpio0 2 GPIO_ACTIVE_HIGH> // RH COL2 - , <&gpio1 7 GPIO_ACTIVE_HIGH> // RH COL3 - , <&gpio1 5 GPIO_ACTIVE_HIGH> // RH COL4 - , <&gpio1 3 GPIO_ACTIVE_HIGH> // RH COL5 - , <&gpio1 1 GPIO_ACTIVE_HIGH> // RH COL6 - ; -}; diff --git a/app/boards/moergo/glove80/glove80_rh.keymap b/app/boards/moergo/glove80/glove80_rh.keymap deleted file mode 100644 index dd4c2d6a..00000000 --- a/app/boards/moergo/glove80/glove80_rh.keymap +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "glove80.keymap" diff --git a/app/boards/moergo/glove80/glove80_rh_defconfig b/app/boards/moergo/glove80/glove80_rh_defconfig deleted file mode 100644 index d45e0ded..00000000 --- a/app/boards/moergo/glove80/glove80_rh_defconfig +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -# Enable both USB and BLE -CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y - -# Keyboard IDs -CONFIG_ZMK_KEYBOARD_NAME="Glove80 Right" -CONFIG_USB_DEVICE_PID=0x27d9 -CONFIG_USB_DEVICE_VID=0x16c0 -CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" -CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" - -CONFIG_BT_DIS_PNP_PID=0x27d9 -CONFIG_BT_DIS_PNP_VID=0x16c0 -CONFIG_BT_DIS_MANUF="MoErgo" -CONFIG_BT_DIS_MODEL="Glove80 Right" - -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable GPIO -CONFIG_GPIO=y - -# Build configurations -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9808B007" -CONFIG_USE_DT_CODE_PARTITION=y - -# Flash configuration -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Enable 32kHz crystal -CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y - -# Enable RGB underglow -CONFIG_ZMK_RGB_UNDERGLOW=y - -CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y -CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n -CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 -CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=4 - -# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 80. Configuring -# BRT_MAX above 80% will draw additional current and can potentially damage your -# computer. WARRANTY IS VOID IF BRT_MAX SET ABOVE 80. -CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 - -CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 -CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 -CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 -CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 - -# The power LED is implemented as a backlight -# For now, the power LED is acting as a "USB connected" indicator -CONFIG_ZMK_BACKLIGHT=y -CONFIG_ZMK_BACKLIGHT_ON_START=y -CONFIG_ZMK_BACKLIGHT_BRT_START=5 -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y - -# The full two-byte consumer report space has compatibility issues with some -# operating systems, most notably macOS. Use the more basic single-byte usage -# space. -CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y - -# Turn on debugging to disable optimization. Debug messages can result in larger -# stacks, so enable stack protection and particularly a larger BLE peripheral stack. -# CONFIG_DEBUG=y -# CONFIG_DEBUG_THREAD_INFO=y -# CONFIG_EXCEPTION_STACK_TRACE=y -# CONFIG_HW_STACK_PROTECTION=y -# CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE=1300 - -# Log via USB or Segger RTT -CONFIG_ZMK_USB_LOGGING=n -CONFIG_ZMK_RTT_LOGGING=n diff --git a/app/boards/moergo/glove80/pre_dt_board.cmake b/app/boards/moergo/glove80/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/moergo/glove80/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/moergo/glove80/readme.md b/app/boards/moergo/glove80/readme.md deleted file mode 100644 index 2c770376..00000000 --- a/app/boards/moergo/glove80/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -## MoErgo Glove80 - -This board definition provides ZMK support for the [MoErgo Glove80](https://www.moergo.com) -keyboard. - -MoErgo additionally offers a customized version of ZMK which adds additional functionality such as -RGB status indicators, available on GitHub at [moergo-sc/zmk](https://github.com/moergo-sc/zmk). The -MoErgo customized ZMK fork is regularly updated to include the latest changes from mainline ZMK, but -will not always be completely up-to-date. MoErgo also offers an online layout configurator and -firmware builder application using the customized fork at [my.glove80.com](https://my.glove80.com). - -While mainline ZMK is expected to work well with Glove80, MoErgo only provides support for use of -their customized fork. Likewise, the ZMK community cannot directly provide support for MoErgo's fork. diff --git a/app/boards/moergo/glove80/usb_serial_number.c b/app/boards/moergo/glove80/usb_serial_number.c deleted file mode 100644 index 44d7ee20..00000000 --- a/app/boards/moergo/glove80/usb_serial_number.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include "usb_descriptor.h" - -#define LOG_LEVEL CONFIG_USB_DEVICE_LOG_LEVEL -#include -LOG_MODULE_DECLARE(usb_descriptor); - -int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize); - -uint8_t *usb_update_sn_string_descriptor(void) { - /* - * nrf52840 hwinfo returns a 64-bit hardware id. Glove80 uses this as a - * serial number, encoded as base16 into the last 16 characters of the - * CONFIG_USB_DEVICE_SN template. If insufficient template space is - * available, instead return the static serial number string. - */ - const uint8_t template_len = sizeof(CONFIG_USB_DEVICE_SN); - const uint8_t sn_len = 16; - - if (template_len < sn_len + 1) { - LOG_DBG("Serial number template too short"); - return CONFIG_USB_DEVICE_SN; - } - - static uint8_t serial[sizeof(CONFIG_USB_DEVICE_SN)]; - strncpy(serial, CONFIG_USB_DEVICE_SN, template_len); - - uint8_t hwid[8]; - memset(hwid, 0, sizeof(hwid)); - uint8_t hwlen = hwinfo_get_device_id(hwid, sizeof(hwid)); - - if (hwlen > 0) { - const uint8_t offset = template_len - sn_len - 1; - LOG_HEXDUMP_DBG(&hwid, sn_len, "Serial Number"); - base16_encode(hwid, hwlen, serial + offset, sn_len + 1); - } - - return serial; -} - -int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize) { - const char hex[] = "0123456789ABCDEF"; - - int i = 0; - while (i < bufSize && i < length * 2) { - uint8_t nibble; - if (i % 2 == 0) { - nibble = data[i / 2] >> 4; - } else { - nibble = data[i / 2] & 0xF; - } - result[i] = hex[nibble]; - ++i; - } - if (i < bufSize) { - result[i] = '\0'; - } - return i; -} diff --git a/app/boards/native/native_sim/Kconfig b/app/boards/native/native_sim/Kconfig deleted file mode 100644 index 8d7f746f..00000000 --- a/app/boards/native/native_sim/Kconfig +++ /dev/null @@ -1,11 +0,0 @@ - -config BOARD_NATIVE_SIM - bool - select POSIX_ARCH_CONSOLE - select NATIVE_LIBRARY - select NATIVE_POSIX_TIMER - select 64BIT if BOARD_NATIVE_SIM_NATIVE_ZMK_TEST_MOCK || BOARD_NATIVE_SIM_NATIVE_ZMK_DISPLAY_TESTING - imply BOARD_NATIVE_POSIX if NATIVE_SIM_NATIVE_POSIX_COMPAT - help - Native simulator (Single Core) - Will produce a console Linux process which can be executed natively. diff --git a/app/boards/native/native_sim/board.yml b/app/boards/native/native_sim/board.yml deleted file mode 100644 index 81f8d1b2..00000000 --- a/app/boards/native/native_sim/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - extend: native_sim - variants: - - name: zmk_display_testing - qualifier: native - - name: zmk_test_mock - qualifier: native diff --git a/app/boards/native/native_sim/native_sim_native_zmk_display_testing.keymap b/app/boards/native/native_sim/native_sim_native_zmk_display_testing.keymap deleted file mode 100644 index d55614c3..00000000 --- a/app/boards/native/native_sim/native_sim_native_zmk_display_testing.keymap +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &none &mo 1 - &kp A &none>; - }; - - lower_layer { - bindings = < - &none &trans - &none &kp A>; - }; - }; -}; diff --git a/app/boards/native/native_sim/native_sim_native_zmk_display_testing_defconfig b/app/boards/native/native_sim/native_sim_native_zmk_display_testing_defconfig deleted file mode 100644 index 26fcc6ad..00000000 --- a/app/boards/native/native_sim/native_sim_native_zmk_display_testing_defconfig +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_ZMK_DISPLAY=y - -CONFIG_CONSOLE=y -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=1000000 - -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_DEBUG=y -CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 diff --git a/app/boards/native/native_sim/native_sim_zmk_display_testing.dts b/app/boards/native/native_sim/native_sim_zmk_display_testing.dts deleted file mode 100644 index f82371b4..00000000 --- a/app/boards/native/native_sim/native_sim_zmk_display_testing.dts +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: MIT */ - -#include "native_sim_zmk_test_mock.dts" - -&kscan { - events = <>; - /delete-property/ exit-after; -}; - -&sdl_dc { - width = <128>; - height = <128>; -}; diff --git a/app/boards/native/nrf_bsim/board.yml b/app/boards/native/nrf_bsim/board.yml deleted file mode 100644 index 89ccb73e..00000000 --- a/app/boards/native/nrf_bsim/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: nrf52_bsim - variants: - - name: zmk_test_mock - qualifier: native diff --git a/app/boards/native/nrf_bsim/nrf52_bsim_native_zmk_test_mock_defconfig b/app/boards/native/nrf_bsim/nrf52_bsim_native_zmk_test_mock_defconfig deleted file mode 100644 index c24991bf..00000000 --- a/app/boards/native/nrf_bsim/nrf52_bsim_native_zmk_test_mock_defconfig +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -CONFIG_CONSOLE=y -CONFIG_NO_OPTIMIZATIONS=y - -CONFIG_ZMK_BLE=y -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y diff --git a/app/tests/pointing/mouse-move/move_x/native_sim.conf b/app/boards/native_posix.conf similarity index 66% rename from app/tests/pointing/mouse-move/move_x/native_sim.conf rename to app/boards/native_posix.conf index fa514727..c3d0260e 100644 --- a/app/tests/pointing/mouse-move/move_x/native_sim.conf +++ b/app/boards/native_posix.conf @@ -3,4 +3,5 @@ CONFIG_ZMK_BLE=n CONFIG_LOG=y CONFIG_LOG_BACKEND_SHOW_COLOR=n CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y +CONFIG_DEBUG=y +CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 diff --git a/app/boards/native/nrf_bsim/nrf52_bsim_zmk_test_mock.dts b/app/boards/native_posix.overlay similarity index 83% rename from app/boards/native/nrf_bsim/nrf52_bsim_zmk_test_mock.dts rename to app/boards/native_posix.overlay index 835a49c1..f8a8f700 100644 --- a/app/boards/native/nrf_bsim/nrf52_bsim_zmk_test_mock.dts +++ b/app/boards/native_posix.overlay @@ -1,5 +1,3 @@ -#include <../boards/native/nrf_bsim/nrf52_bsim.dts> - #include #include #include @@ -11,8 +9,10 @@ kscan: kscan { compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; rows = <2>; columns = <2>; + exit-after; }; }; diff --git a/app/boards/native/native_sim/native_sim_native_zmk_test_mock_defconfig b/app/boards/native_posix_64.conf similarity index 56% rename from app/boards/native/native_sim/native_sim_native_zmk_test_mock_defconfig rename to app/boards/native_posix_64.conf index fc1b0407..0d8e0d81 100644 --- a/app/boards/native/native_sim/native_sim_native_zmk_test_mock_defconfig +++ b/app/boards/native_posix_64.conf @@ -1,8 +1,6 @@ -# SPDX-License-Identifier: MIT - -CONFIG_CONSOLE=y -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=1000000 - +CONFIG_GPIO=n +# Enable to have the native posix build expose USBIP device(s) +# CONFIG_ZMK_USB=y CONFIG_LOG=y CONFIG_LOG_BACKEND_SHOW_COLOR=n CONFIG_ZMK_LOG_LEVEL_DBG=y diff --git a/app/boards/native/native_sim/native_sim_zmk_test_mock.dts b/app/boards/native_posix_64.overlay similarity index 71% rename from app/boards/native/native_sim/native_sim_zmk_test_mock.dts rename to app/boards/native_posix_64.overlay index fa67bfc5..f8a8f700 100644 --- a/app/boards/native/native_sim/native_sim_zmk_test_mock.dts +++ b/app/boards/native_posix_64.overlay @@ -1,5 +1,4 @@ - -#include <../boards/native/native_sim/native_sim.dts> +#include #include #include @@ -8,12 +7,12 @@ zmk,kscan = &kscan; }; - kscan: native_posix_64_kscan_mock { + kscan: kscan { compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; rows = <2>; columns = <2>; exit-after; }; }; - diff --git a/app/boards/nicekeyboards/nice60/Kconfig.nice60 b/app/boards/nicekeyboards/nice60/Kconfig.nice60 deleted file mode 100644 index cf02e433..00000000 --- a/app/boards/nicekeyboards/nice60/Kconfig.nice60 +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2021 Nick Winans -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_NICE60 - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_NICE60_NRF52840_ZMK - imply RETAINED_MEM if BOARD_NICE60_NRF52840_ZMK - imply RETENTION if BOARD_NICE60_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_NICE60_NRF52840_ZMK diff --git a/app/boards/nicekeyboards/nice60/board.yml b/app/boards/nicekeyboards/nice60/board.yml deleted file mode 100644 index e945cbf0..00000000 --- a/app/boards/nicekeyboards/nice60/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - name: nice60 - vendor: nicekeyboards - socs: - - name: nrf52840 - variants: - - name: zmk diff --git a/app/boards/nicekeyboards/nice60/pre_dt_board.cmake b/app/boards/nicekeyboards/nice60/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/nicekeyboards/nice60/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano b/app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano deleted file mode 100644 index dd120dbc..00000000 --- a/app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2020 Pete Johanson -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_NICE_NANO - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_NICE_NANO_NRF52840_ZMK - imply RETAINED_MEM if BOARD_NICE_NANO_NRF52840_ZMK - imply RETENTION if BOARD_NICE_NANO_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_NICE_NANO_NRF52840_ZMK diff --git a/app/boards/nicekeyboards/nice_nano/board.yml b/app/boards/nicekeyboards/nice_nano/board.yml deleted file mode 100644 index 13cba4f6..00000000 --- a/app/boards/nicekeyboards/nice_nano/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: nice_nano - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk.dts b/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk.dts deleted file mode 100644 index ed5b9b7b..00000000 --- a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk.dts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; - -#include <../boards/nicekeyboards/nice_nano/nice_nano.dts> -#include - diff --git a/app/boards/nicekeyboards/nice_nano/pre_dt_board.cmake b/app/boards/nicekeyboards/nice_nano/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/nicekeyboards/nice_nano/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/nordic/nrf52840dk/Kconfig.nrf52840dk b/app/boards/nordic/nrf52840dk/Kconfig.nrf52840dk deleted file mode 100644 index 8c213cce..00000000 --- a/app/boards/nordic/nrf52840dk/Kconfig.nrf52840dk +++ /dev/null @@ -1,4 +0,0 @@ - -config BOARD_NRF52840DK - select SOC_NRF52840_QIAA if BOARD_NRF52840DK_NRF52840_ZMK - select ZMK_BOARD_COMPAT if BOARD_NRF52840DK_NRF52840_ZMK diff --git a/app/boards/nordic/nrf52840dk/board.yml b/app/boards/nordic/nrf52840dk/board.yml deleted file mode 100644 index a8be86a3..00000000 --- a/app/boards/nordic/nrf52840dk/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: nrf52840dk - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_zmk.dts b/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_zmk.dts deleted file mode 100644 index d2a0b855..00000000 --- a/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_zmk.dts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts> - diff --git a/app/boards/nordic/nrf52840dongle/Kconfig.nrf52840dongle b/app/boards/nordic/nrf52840dongle/Kconfig.nrf52840dongle deleted file mode 100644 index 3558e141..00000000 --- a/app/boards/nordic/nrf52840dongle/Kconfig.nrf52840dongle +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_NRF52840DONGLE - select ZMK_BOARD_COMPAT if BOARD_NRF52840DONGLE_NRF52840_ZMK diff --git a/app/boards/nordic/nrf52840dongle/board.yml b/app/boards/nordic/nrf52840dongle/board.yml deleted file mode 100644 index 26104aa0..00000000 --- a/app/boards/nordic/nrf52840dongle/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: nrf52840dongle - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840_zmk.dts b/app/boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840_zmk.dts deleted file mode 100644 index 2b093635..00000000 --- a/app/boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840_zmk.dts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840.dts> - diff --git a/app/boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840_zmk_defconfig b/app/boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840_zmk_defconfig deleted file mode 100644 index 2c19ebd8..00000000 --- a/app/boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840_zmk_defconfig +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable hardware stack protection -CONFIG_HW_STACK_PROTECTION=y - -# enable GPIO -CONFIG_GPIO=y - -# Board Kconfig.defconfig enables USB CDC ACM and should disable USB remote -# wakeup by default. It needs to be disabled here, because the USB nrfx -# driver always overwrites option from Kconfig mentioned above with the -# imply from CONFIG_USB_NRFX. -CONFIG_USB_DEVICE_REMOTE_WAKEUP=n - -# HID Transports -CONFIG_ZMK_BLE=y -CONFIG_ZMK_USB=y - -# Settings options -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y diff --git a/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_zmk_defconfig b/app/boards/nrf52840dk_nrf52840.conf similarity index 59% rename from app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_zmk_defconfig rename to app/boards/nrf52840dk_nrf52840.conf index 087cfbd0..6c9bcdf1 100644 --- a/app/boards/nordic/nrf52840dk/nrf52840dk_nrf52840_zmk_defconfig +++ b/app/boards/nrf52840dk_nrf52840.conf @@ -1,20 +1,9 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable hardware stack protection -CONFIG_HW_STACK_PROTECTION=y - -# enable GPIO -CONFIG_GPIO=y - -# USB and BLE HID CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y -# Settings Support CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y CONFIG_SETTINGS_NVS=y diff --git a/app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.conf b/app/boards/nrf5340dk_nrf5340_cpuapp.conf similarity index 100% rename from app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.conf rename to app/boards/nrf5340dk_nrf5340_cpuapp.conf diff --git a/app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay similarity index 100% rename from app/boards/nordic/nrf5340dk/nrf5340dk_nrf5340_cpuapp.overlay rename to app/boards/nrf5340dk_nrf5340_cpuapp.overlay diff --git a/app/boards/olkb/planck/board.yml b/app/boards/olkb/planck/board.yml deleted file mode 100644 index dd30d7cf..00000000 --- a/app/boards/olkb/planck/board.yml +++ /dev/null @@ -1,12 +0,0 @@ -board: - name: planck - vendor: olkb - socs: - - name: stm32f303xc - variants: - - name: zmk - revision: - format: major.minor.patch - default: 6.0.0 - revisions: - - name: 6.0.0 diff --git a/app/boards/olkb/planck/planck_stm32f303xc_zmk_6_0_0_defconfig b/app/boards/olkb/planck/planck_stm32f303xc_zmk_6_0_0_defconfig deleted file mode 100644 index 154e7687..00000000 --- a/app/boards/olkb/planck/planck_stm32f303xc_zmk_6_0_0_defconfig +++ /dev/null @@ -1,18 +0,0 @@ -# SPDX-License-Identifier: MIT - -# 72MHz system clock -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -# clock configuration -CONFIG_CLOCK_CONTROL=y - -CONFIG_ZMK_USB=y - -# Uncomment these two lines to add support for encoder to your firmware -#CONFIG_EC11=y -#CONFIG_EC11_TRIGGER_OWN_THREAD=y diff --git a/app/boards/olkb/preonic/board.yml b/app/boards/olkb/preonic/board.yml deleted file mode 100644 index 95992c3e..00000000 --- a/app/boards/olkb/preonic/board.yml +++ /dev/null @@ -1,12 +0,0 @@ -board: - name: preonic - vendor: olkb - socs: - - name: stm32f303xc - variants: - - name: zmk - revision: - format: major.minor.patch - default: 3.0.0 - revisions: - - name: 3.0.0 diff --git a/app/boards/pierrechevalier83/ferris/Kconfig.ferris b/app/boards/pierrechevalier83/ferris/Kconfig.ferris deleted file mode 100644 index 348ef27d..00000000 --- a/app/boards/pierrechevalier83/ferris/Kconfig.ferris +++ /dev/null @@ -1,14 +0,0 @@ -# Ferris board configuration - -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_FERRIS - select SOC_STM32F072XB - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE - imply STM32_BOOTLOADER - imply RTC - imply BBRAM diff --git a/app/boards/pierrechevalier83/ferris/board.yml b/app/boards/pierrechevalier83/ferris/board.yml deleted file mode 100644 index 6fb3af39..00000000 --- a/app/boards/pierrechevalier83/ferris/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - name: ferris - vendor: pierrechevalier83 - socs: - - name: stm32f072xb - variants: - - name: zmk diff --git a/app/boards/polarityworks/bt60/Kconfig.bt60 b/app/boards/polarityworks/bt60/Kconfig.bt60 deleted file mode 100644 index f1e578c6..00000000 --- a/app/boards/polarityworks/bt60/Kconfig.bt60 +++ /dev/null @@ -1,11 +0,0 @@ -# CKP BT60 board configuration - -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BT60 - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/polarityworks/bt60/Kconfig.bt60_hs b/app/boards/polarityworks/bt60/Kconfig.bt60_hs deleted file mode 100644 index cc30cc2c..00000000 --- a/app/boards/polarityworks/bt60/Kconfig.bt60_hs +++ /dev/null @@ -1,11 +0,0 @@ -# BT60 HS board configuration - -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BT60_HS - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/polarityworks/bt60/Kconfig.defconfig b/app/boards/polarityworks/bt60/Kconfig.defconfig deleted file mode 100644 index 1b681d07..00000000 --- a/app/boards/polarityworks/bt60/Kconfig.defconfig +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config ZMK_KEYBOARD_NAME - default "BT60" if BOARD_BT60 || BOARD_BT60_HS - -if BOARD_BT60 || BOARD_BT60_HS - -if USB - -config USB_NRFX - default y - -config USB_DEVICE_STACK - default y - -endif # USB - -config BT_CTLR - default BT - -endif # BOARD_BT60 || BOARD_BT60_HS diff --git a/app/boards/polarityworks/bt60/board.yml b/app/boards/polarityworks/bt60/board.yml deleted file mode 100644 index 2f9a8b80..00000000 --- a/app/boards/polarityworks/bt60/board.yml +++ /dev/null @@ -1,19 +0,0 @@ -boards: - - name: bt60_hs - vendor: polarityworks - socs: - - name: nrf52840 - variants: - - name: zmk - - name: bt60 - vendor: polarityworks - socs: - - name: nrf52840 - variants: - - name: zmk - revision: - format: major.minor.patch - default: 2.0.0 - revisions: - - name: 1.0.0 - - name: 2.0.0 diff --git a/app/boards/polarityworks/bt60/bt60_1_0_0.dtsi b/app/boards/polarityworks/bt60/bt60_1_0_0.dtsi deleted file mode 100644 index d760b284..00000000 --- a/app/boards/polarityworks/bt60/bt60_1_0_0.dtsi +++ /dev/null @@ -1,38 +0,0 @@ -/* -* Copyright (c) 2021 Polarity Works -* -* SPDX-License-Identifier: MIT -*/ - -#include - -/ { - model = "BT60"; - compatible = "polarityworks,bt60"; - - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - triggers-per-rotation = <20>; - }; - - left_encoder: encoder_left { - compatible = "alps,ec11"; - a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - steps = <80>; - status = "okay"; - }; - - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - }; - }; -}; - -&vbatt { - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; -}; diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk.dts b/app/boards/polarityworks/bt60/bt60_nrf52840_zmk.dts deleted file mode 100644 index d4c52c1c..00000000 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk.dts +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2022 The ZMK Contributors -* -* SPDX-License-Identifier: MIT -*/ - -/dts-v1/; -#include -#include - -/ { - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zmk,battery = &vbatt; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 2>; - }; -}; - -&adc { - status = "okay"; -}; - -&gpiote { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&gpio1 { - status = "okay"; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -&flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - sd_partition: partition@0 { - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - reg = <0x00026000 0x000c6000>; - }; - - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ - - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - reg = <0x000ec000 0x00008000>; - }; - - boot_partition: partition@f4000 { - reg = <0x000f4000 0x0000c000>; - }; - }; -}; diff --git a/app/boards/polarityworks/bt60/pre_dt_board.cmake b/app/boards/polarityworks/bt60/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/polarityworks/bt60/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/polarityworks/bt65/Kconfig.bt65 b/app/boards/polarityworks/bt65/Kconfig.bt65 deleted file mode 100644 index 2aa7be69..00000000 --- a/app/boards/polarityworks/bt65/Kconfig.bt65 +++ /dev/null @@ -1,11 +0,0 @@ -# CKP BT65 board configuration - -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BT65 - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/polarityworks/bt65/board.cmake b/app/boards/polarityworks/bt65/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/boards/polarityworks/bt65/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/polarityworks/bt65/board.yml b/app/boards/polarityworks/bt65/board.yml deleted file mode 100644 index 7392a405..00000000 --- a/app/boards/polarityworks/bt65/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - name: bt65 - vendor: polarityworks - socs: - - name: nrf52840 - variants: - - name: zmk diff --git a/app/boards/polarityworks/bt65/pre_dt_board.cmake b/app/boards/polarityworks/bt65/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/polarityworks/bt65/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/polarityworks/bt75/Kconfig.bt75 b/app/boards/polarityworks/bt75/Kconfig.bt75 deleted file mode 100644 index b2718fcd..00000000 --- a/app/boards/polarityworks/bt75/Kconfig.bt75 +++ /dev/null @@ -1,11 +0,0 @@ -# CKP BT75 board configuration - -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BT75 - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/boards/polarityworks/bt75/board.cmake b/app/boards/polarityworks/bt75/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/boards/polarityworks/bt75/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/polarityworks/bt75/board.yml b/app/boards/polarityworks/bt75/board.yml deleted file mode 100644 index 5a8057c8..00000000 --- a/app/boards/polarityworks/bt75/board.yml +++ /dev/null @@ -1,7 +0,0 @@ -board: - name: bt75 - vendor: polarityworks - socs: - - name: nrf52840 - variants: - - name: zmk diff --git a/app/boards/polarityworks/bt75/pre_dt_board.cmake b/app/boards/polarityworks/bt75/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/polarityworks/bt75/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/polarityworks/common/ckp-base.dtsi b/app/boards/polarityworks/common/ckp-base.dtsi deleted file mode 100644 index 0b1d9d13..00000000 --- a/app/boards/polarityworks/common/ckp-base.dtsi +++ /dev/null @@ -1,61 +0,0 @@ -&adc { - status = "okay"; -}; - -&gpiote { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&gpio1 { - status = "okay"; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -®1 { - regulator-initial-mode = ; -}; - - -&flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - sd_partition: partition@0 { - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - reg = <0x00026000 0x000c6000>; - }; - - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ - - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - reg = <0x000ec000 0x00008000>; - }; - - boot_partition: partition@f4000 { - reg = <0x000f4000 0x0000c000>; - }; - }; -}; - diff --git a/app/boards/post_boards_shields.cmake b/app/boards/post_boards_shields.cmake deleted file mode 100644 index 6c4dd0ad..00000000 --- a/app/boards/post_boards_shields.cmake +++ /dev/null @@ -1,100 +0,0 @@ -# TODO: Check for env or command line "ZMK_CONFIG" setting. -# * That directory should load -# * defconfigs, -# * .conf file, -# * single overlay, -# * or per board/shield. - -list(APPEND KEYMAP_DIRS "${BOARD_DIRECTORIES}") -get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) -# Give a shield like `kyria_rev2_left` we want to use `kyria_rev2` and `kyria` as candidate names for -# overlay/conf/keymap files. -if(DEFINED SHIELD) - list(APPEND KEYMAP_DIRS ${SHIELD_DIRS}) - foreach(s ${SHIELD_AS_LIST}) - if (DEFINED SHIELD_DIR_${s}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - list(APPEND shield_candidate_names ${shield_dir_name}) - endif() - string(REPLACE "_" ";" S_PIECES ${s}) - list(LENGTH S_PIECES S_PIECES_LEN) - while(NOT S_PIECES STREQUAL "") - list(POP_BACK S_PIECES) - list(JOIN S_PIECES "_" s_substr) - if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") - break() - endif() - list(APPEND shield_candidate_names ${s_substr}) - endwhile() - endforeach() -endif() - -if (ZMK_CONFIG) - if (EXISTS ${ZMK_CONFIG}) - message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") - list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") - - if (DEFINED SHIELD) - foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) - if (DEFINED ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") - if (NOT "${shield_dir_name}" STREQUAL "${s}") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") - endif() - list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") - endforeach() - endif() - - # TODO: Board revisions? - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") - - foreach(overlay ${overlay_candidates}) - if (EXISTS "${overlay}") - message(STATUS "ZMK Config devicetree overlay: ${overlay}") - list(APPEND shield_dts_files "${overlay}") - break() - endif() - endforeach() - - foreach(conf ${config_candidates}) - if (EXISTS "${conf}") - message(STATUS "ZMK Config Kconfig: ${conf}") - list(APPEND shield_conf_files "${conf}") - endif() - endforeach() - else() - message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") - endif() -endif() - - -if(NOT KEYMAP_FILE) - message("${NORMALIZED_BOARD_TARGET} for ${NORMALIZED_BOARD_QUALIFIERS} for ${BOARD} with version ${BOARD_REVISION}") - foreach(keymap_dir ${KEYMAP_DIRS}) - foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} "${NORMALIZED_BOARD_TARGET}" "${BOARD}_${BOARD_REVISION_STRING}" ${BOARD} ${BOARD_DIR_NAME}) - if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) - set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(EXTRA_DTC_OVERLAY_FILE ${KEYMAP_FILE}) - break() - endif() - endforeach() - endforeach() -else() - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(EXTRA_DTC_OVERLAY_FILE ${KEYMAP_FILE}) -endif() - -if (NOT KEYMAP_FILE) - message(WARNING "Failed to locate keymap file!") -endif() diff --git a/app/boards/qmk/proton_c/Kconfig.proton_c b/app/boards/qmk/proton_c/Kconfig.proton_c deleted file mode 100644 index c3eaaf68..00000000 --- a/app/boards/qmk/proton_c/Kconfig.proton_c +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PROTON_C - select ZMK_BOARD_COMPAT - diff --git a/app/boards/qmk/proton_c/board.yml b/app/boards/qmk/proton_c/board.yml deleted file mode 100644 index 0b6a5d3e..00000000 --- a/app/boards/qmk/proton_c/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: proton_c - variants: - - name: zmk - qualifier: stm32f303xc diff --git a/app/boards/qmk/proton_c/proton_c.zmk.yml b/app/boards/qmk/proton_c/proton_c.zmk.yml deleted file mode 100644 index e89acf24..00000000 --- a/app/boards/qmk/proton_c/proton_c.zmk.yml +++ /dev/null @@ -1,9 +0,0 @@ -file_format: "1" -id: proton_c//zmk -name: QMK Proton-C -type: board -arch: arm -outputs: - - usb -url: https://qmk.fm/proton-c/ -exposes: [pro_micro] diff --git a/app/boards/qmk/proton_c/proton_c_stm32f303xc_zmk.dts b/app/boards/qmk/proton_c/proton_c_stm32f303xc_zmk.dts deleted file mode 100644 index dfee886e..00000000 --- a/app/boards/qmk/proton_c/proton_c_stm32f303xc_zmk.dts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; -#include <../boards/qmk/proton_c/proton_c.dts> - diff --git a/app/boards/raspberrypi/rpi_pico/Kconfig.rpi_pico b/app/boards/raspberrypi/rpi_pico/Kconfig.rpi_pico deleted file mode 100644 index 5a9e8ef0..00000000 --- a/app/boards/raspberrypi/rpi_pico/Kconfig.rpi_pico +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_RPI_PICO - select SOC_RP2040 - select ZMK_BOARD_COMPAT if BOARD_RPI_PICO_RP2040_ZMK - imply RETAINED_MEM if BOARD_RPI_PICO_RP2040_ZMK - imply RETENTION if BOARD_RPI_PICO_RP2040_ZMK - imply RETENTION_BOOT_MODE if BOARD_RPI_PICO_RP2040_ZMK - diff --git a/app/boards/raspberrypi/rpi_pico/board.yml b/app/boards/raspberrypi/rpi_pico/board.yml deleted file mode 100644 index de179f80..00000000 --- a/app/boards/raspberrypi/rpi_pico/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: rpi_pico - variants: - - name: zmk - qualifier: rp2040 diff --git a/app/boards/raspberrypi/rpi_pico/rpi_pico.zmk.yml b/app/boards/raspberrypi/rpi_pico/rpi_pico.zmk.yml deleted file mode 100644 index 7142cb56..00000000 --- a/app/boards/raspberrypi/rpi_pico/rpi_pico.zmk.yml +++ /dev/null @@ -1,8 +0,0 @@ -file_format: "1" -id: rpi_pico//zmk -name: Raspberry Pi Pico -type: board -arch: arm -outputs: - - usb -url: https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html#pico-1-family diff --git a/app/boards/raspberrypi/rpi_pico/rpi_pico_rp2040_zmk.dts b/app/boards/raspberrypi/rpi_pico/rpi_pico_rp2040_zmk.dts deleted file mode 100644 index 3acf57ff..00000000 --- a/app/boards/raspberrypi/rpi_pico/rpi_pico_rp2040_zmk.dts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/raspberrypi/rpi_pico/rpi_pico.dts> -#include - -&uart0 { status = "disabled"; }; - -&code_partition { - reg = <0x100 (DT_SIZE_M(2) - 0x100 - DT_SIZE_K(512))>; -}; - -&flash0 { - partitions { - storage_partition: partition@180000 { - reg = <0x180000 DT_SIZE_K(512)>; - read-only; - }; - }; -}; diff --git a/app/boards/raspberrypi/rpi_pico/rpi_pico_rp2040_zmk_defconfig b/app/boards/raspberrypi/rpi_pico/rpi_pico_rp2040_zmk_defconfig deleted file mode 100644 index 5ff98221..00000000 --- a/app/boards/raspberrypi/rpi_pico/rpi_pico_rp2040_zmk_defconfig +++ /dev/null @@ -1,27 +0,0 @@ -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 - -# Core deps -CONFIG_RESET=y -CONFIG_CLOCK_CONTROL=y -CONFIG_GPIO=y - -# Build Output -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_BUILD_OUTPUT_HEX=y - -# USB HID -CONFIG_ZMK_USB=y - -# Settings Support -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/rpi_pico.conf b/app/boards/rpi_pico.conf new file mode 100644 index 00000000..f0db8ed1 --- /dev/null +++ b/app/boards/rpi_pico.conf @@ -0,0 +1,5 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y diff --git a/app/boards/rpi_pico.overlay b/app/boards/rpi_pico.overlay new file mode 100644 index 00000000..efc8e080 --- /dev/null +++ b/app/boards/rpi_pico.overlay @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + diff --git a/app/boards/seeed/seeeduino_xiao/Kconfig.seeeduino_xiao b/app/boards/seeed/seeeduino_xiao/Kconfig.seeeduino_xiao deleted file mode 100644 index 0e1b9cc9..00000000 --- a/app/boards/seeed/seeeduino_xiao/Kconfig.seeeduino_xiao +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2026 Pete Johanson -# SPDX-License-Identifier: MIT - -config BOARD_SEEEDUINO_XIAO - select ZMK_BOARD_COMPAT if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK - imply RETAINED_MEM if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK - imply RETENTION if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK - imply RETENTION_BOOT_MODE if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK - diff --git a/app/boards/seeed/seeeduino_xiao/board.yml b/app/boards/seeed/seeeduino_xiao/board.yml deleted file mode 100644 index c5d20792..00000000 --- a/app/boards/seeed/seeeduino_xiao/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: seeeduino_xiao - variants: - - name: zmk - qualifier: samd21g18a diff --git a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao_zmk.dts b/app/boards/seeed/seeeduino_xiao/seeeduino_xiao_zmk.dts deleted file mode 100644 index 66a500dd..00000000 --- a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao_zmk.dts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/seeed/seeeduino_xiao/seeeduino_xiao.dts> - diff --git a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao_zmk_defconfig b/app/boards/seeed/seeeduino_xiao/seeeduino_xiao_zmk_defconfig deleted file mode 100644 index 04da60c9..00000000 --- a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao_zmk_defconfig +++ /dev/null @@ -1,11 +0,0 @@ -# XTAL setup -CONFIG_SOC_ATMEL_SAMD_XOSC32K=y -CONFIG_SOC_ATMEL_SAMD_XOSC32K_AS_MAIN=y - -# Bootloader Setup -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_BOOTLOADER_BOSSA=y -CONFIG_BOOTLOADER_BOSSA_ADAFRUIT_UF2=y - -# ZMK USB Transport -CONFIG_ZMK_USB=y diff --git a/app/boards/seeed/xiao_ble/Kconfig.xiao_ble b/app/boards/seeed/xiao_ble/Kconfig.xiao_ble deleted file mode 100644 index 475ba15b..00000000 --- a/app/boards/seeed/xiao_ble/Kconfig.xiao_ble +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2026 Pete Johanson -# SPDX-License-Identifier: MIT - -config BOARD_XIAO_BLE - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_XIAO_BLE_NRF52840_ZMK - imply RETAINED_MEM if BOARD_XIAO_BLE_NRF52840_ZMK - imply RETENTION if BOARD_XIAO_BLE_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_XIAO_BLE_NRF52840_ZMK - diff --git a/app/boards/seeed/xiao_ble/board.yml b/app/boards/seeed/xiao_ble/board.yml deleted file mode 100644 index 5643184c..00000000 --- a/app/boards/seeed/xiao_ble/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: xiao_ble - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/seeed/xiao_ble/xiao_ble_zmk.dts b/app/boards/seeed/xiao_ble/xiao_ble_zmk.dts deleted file mode 100644 index b01c544e..00000000 --- a/app/boards/seeed/xiao_ble/xiao_ble_zmk.dts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/seeed/xiao_ble/xiao_ble.dts> -#include - -/* Add an sd_partition label for compatibility with the nosd snippet */ -sd_partition: &reserved_partition_0 { }; - -/ { - chosen { - zmk,battery = &vbatt; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 7>; - power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; - output-ohms = <510000>; - full-ohms = <(1000000 + 510000)>; - }; -}; - -&xiao_serial { status = "disabled"; }; - -&adc { - status = "okay"; -}; - -&qspi { - status = "okay"; - pinctrl-0 = <&qspi_default>; - pinctrl-1 = <&qspi_sleep>; - pinctrl-names = "default", "sleep"; - p25q16h: p25q16h@0 { - compatible = "nordic,qspi-nor"; - reg = <0>; - sck-frequency = <104000000>; - quad-enable-requirements = "S2B1v1"; - jedec-id = [85 60 15]; - sfdp-bfp = [ - e5 20 f1 ff ff ff ff 00 44 eb 08 6b 08 3b 80 bb - ee ff ff ff ff ff 00 ff ff ff 00 ff 0c 20 0f 52 - 10 d8 08 81 - ]; - size = <16777216>; - has-dpd; - t-enter-dpd = <3000>; - t-exit-dpd = <8000>; - }; -}; diff --git a/app/boards/seeed/xiao_ble/xiao_ble_zmk_defconfig b/app/boards/seeed/xiao_ble/xiao_ble_zmk_defconfig deleted file mode 100644 index fd85e275..00000000 --- a/app/boards/seeed/xiao_ble/xiao_ble_zmk_defconfig +++ /dev/null @@ -1,30 +0,0 @@ - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable hardware stack protection -CONFIG_HW_STACK_PROTECTION=y - -# Enable GPIO -CONFIG_GPIO=y - -CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y - -# Build UF2 by default, supported by the Adafruit nRF52 Bootloader -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_USE_DT_CODE_PARTITION=y - -# Settings Support -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y -CONFIG_ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52=y diff --git a/app/boards/seeed/xiao_rp2040/Kconfig.xiao_rp2040 b/app/boards/seeed/xiao_rp2040/Kconfig.xiao_rp2040 deleted file mode 100644 index 3bd098fe..00000000 --- a/app/boards/seeed/xiao_rp2040/Kconfig.xiao_rp2040 +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2026 Pete Johanson -# SPDX-License-Identifier: MIT - -config BOARD_XIAO_RP2040 - select ZMK_BOARD_COMPAT if BOARD_XIAO_RP2040_RP2040_ZMK - imply RETAINED_MEM if BOARD_XIAO_RP2040_RP2040_ZMK - imply RETENTION if BOARD_XIAO_RP2040_RP2040_ZMK - imply RETENTION_BOOT_MODE if BOARD_XIAO_RP2040_RP2040_ZMK - - diff --git a/app/boards/seeed/xiao_rp2040/board.yml b/app/boards/seeed/xiao_rp2040/board.yml deleted file mode 100644 index 813e3346..00000000 --- a/app/boards/seeed/xiao_rp2040/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: xiao_rp2040 - variants: - - name: zmk - qualifier: rp2040 diff --git a/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk.dts b/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk.dts deleted file mode 100644 index b55ddc63..00000000 --- a/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk.dts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/seeed/xiao_rp2040/xiao_rp2040.dts> -#include - -&xiao_serial { status = "disabled"; }; - -&code_partition { - reg = <0x100 (DT_SIZE_M(2) - 0x100 - DT_SIZE_K(512))>; -}; - -&flash0 { - reg = <0x10000000 DT_SIZE_M(2)>; - - partitions { - storage_partition: partition@180000 { - reg = <0x180000 DT_SIZE_K(512)>; - read-only; - }; - }; -}; diff --git a/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk_defconfig b/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk_defconfig deleted file mode 100644 index d4a902e0..00000000 --- a/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk_defconfig +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 -CONFIG_RESET=y - -# Enable clock control by default -CONFIG_CLOCK_CONTROL=y - -# Code partition needed to target the correct flash range -CONFIG_USE_DT_CODE_PARTITION=y - -# Output UF2 by default, native bootloader supports it. -CONFIG_BUILD_OUTPUT_UF2=y - -# Enable USB HID transport by default -CONFIG_ZMK_USB=y - -# Settings Enablement -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - - -# Bootloader support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/seeeduino_xiao.conf b/app/boards/seeeduino_xiao.conf new file mode 100644 index 00000000..f0db8ed1 --- /dev/null +++ b/app/boards/seeeduino_xiao.conf @@ -0,0 +1,5 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y diff --git a/app/boards/seeeduino_xiao.overlay b/app/boards/seeeduino_xiao.overlay new file mode 100644 index 00000000..a2ddaea4 --- /dev/null +++ b/app/boards/seeeduino_xiao.overlay @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; +}; + +&usb0 { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + diff --git a/app/boards/adafruit_metro_rp2040.conf b/app/boards/seeeduino_xiao_ble.conf similarity index 72% rename from app/boards/adafruit_metro_rp2040.conf rename to app/boards/seeeduino_xiao_ble.conf index 714e715c..205f67e9 100644 --- a/app/boards/adafruit_metro_rp2040.conf +++ b/app/boards/seeeduino_xiao_ble.conf @@ -1,11 +1,15 @@ + CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y +CONFIG_FLASH_MAP=y \ No newline at end of file diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay new file mode 100644 index 00000000..e6a5b62c --- /dev/null +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + output-ohms = <510000>; + full-ohms = <(1000000 + 510000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&usbd { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&qspi { + status = "disabled"; +}; diff --git a/app/boards/seeeduino_xiao_rp2040.conf b/app/boards/seeeduino_xiao_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/seeeduino_xiao_rp2040.overlay b/app/boards/seeeduino_xiao_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/shields/Kconfig.defconfig b/app/boards/shields/Kconfig.defconfig new file mode 100644 index 00000000..58dd45d6 --- /dev/null +++ b/app/boards/shields/Kconfig.defconfig @@ -0,0 +1,14 @@ + + + +config ZMK_KEYBOARD_NAME + default "cradios" + +# Unable to use interrupts as the same pin number is used +# across A & B controllers, and STM32F303CCT6 can't enable +# interrutps for multiple controllers for the same "line" +# for the external interrupts. +config ZMK_KSCAN_GPIO_POLLING + default y + + diff --git a/app/boards/shields/Kconfig.shield b/app/boards/shields/Kconfig.shield new file mode 100644 index 00000000..cab78898 --- /dev/null +++ b/app/boards/shields/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +config SHIELD_CRADIOS + def_bool $(shields_list_contains,cradios) diff --git a/app/boards/shields/a_dux/a_dux-layouts.dtsi b/app/boards/shields/a_dux/a_dux-layouts.dtsi deleted file mode 100644 index ea8e3509..00000000 --- a/app/boards/shields/a_dux/a_dux-layouts.dtsi +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ -#include - -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 133 0 0 0> - , <&key_physical_attrs 100 100 100 31 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 28 0 0 0> - , <&key_physical_attrs 100 100 400 42 0 0 0> - , <&key_physical_attrs 100 100 800 42 0 0 0> - , <&key_physical_attrs 100 100 900 28 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 31 0 0 0> - , <&key_physical_attrs 100 100 1200 133 0 0 0> - , <&key_physical_attrs 100 100 0 233 0 0 0> - , <&key_physical_attrs 100 100 100 131 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 128 0 0 0> - , <&key_physical_attrs 100 100 400 142 0 0 0> - , <&key_physical_attrs 100 100 800 142 0 0 0> - , <&key_physical_attrs 100 100 900 128 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 131 0 0 0> - , <&key_physical_attrs 100 100 1200 233 0 0 0> - , <&key_physical_attrs 100 100 0 333 0 0 0> - , <&key_physical_attrs 100 100 100 231 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 228 0 0 0> - , <&key_physical_attrs 100 100 400 242 0 0 0> - , <&key_physical_attrs 100 100 800 242 0 0 0> - , <&key_physical_attrs 100 100 900 228 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 231 0 0 0> - , <&key_physical_attrs 100 100 1200 333 0 0 0> - , <&key_physical_attrs 100 100 400 375 0 0 0> - , <&key_physical_attrs 100 100 500 400 0 0 0> - , <&key_physical_attrs 100 100 700 400 0 0 0> - , <&key_physical_attrs 100 100 800 375 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/a_dux/a_dux.dtsi b/app/boards/shields/a_dux/a_dux.dtsi index 0e581a9d..28156f42 100644 --- a/app/boards/shields/a_dux/a_dux.dtsi +++ b/app/boards/shields/a_dux/a_dux.dtsi @@ -5,18 +5,12 @@ */ #include -#include "a_dux-layouts.dtsi" - -&physical_layout0 { - transform = <&default_transform>; -}; - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -33,8 +27,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; - wakeup-source; - + label = "KSCAN"; input-gpios = <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, @@ -55,4 +48,5 @@ <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> ; }; + }; diff --git a/app/boards/shields/a_dux/a_dux.keymap b/app/boards/shields/a_dux/a_dux.keymap index 37452d59..0f162a33 100644 --- a/app/boards/shields/a_dux/a_dux.keymap +++ b/app/boards/shields/a_dux/a_dux.keymap @@ -14,7 +14,6 @@ // This is a sample keymap intended to be replaced with your own base_layer { - display-name = "Base Layer"; bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI diff --git a/app/boards/shields/bat43/bat43.keymap b/app/boards/shields/bat43/bat43.keymap index a690ff38..0f7e2d55 100644 --- a/app/boards/shields/bat43/bat43.keymap +++ b/app/boards/shields/bat43/bat43.keymap @@ -20,7 +20,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp TAB &kp A &kp S &kp D &kp F &kp G &kp BSPC &kp H &kp J &kp K &kp L &kp SEMI &kp RSHFT @@ -30,7 +29,6 @@ >; }; lower_layer { - display-name = "Lower Layer"; bindings = < &trans &none &none &none &none &none &none &kp EQUAL &kp PLUS &kp STAR &kp PRCNT &trans &trans &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &trans &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans @@ -40,7 +38,6 @@ >; }; raise_layer { - display-name = "Raise Layer"; bindings = < &trans &kp BSLH &kp EXCL &kp AMPS &kp PIPE &none &none &kp EQUAL &kp PLUS &kp STAR &kp PRCNT &trans &trans &kp HASH &kp GRAVE &kp DQT &kp SQT &kp TILDE &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp DLLR &trans diff --git a/app/boards/shields/bat43/bat43.overlay b/app/boards/shields/bat43/bat43.overlay index 89c2428d..fc906e0f 100644 --- a/app/boards/shields/bat43/bat43.overlay +++ b/app/boards/shields/bat43/bat43.overlay @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -28,7 +28,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/bfo9000/bfo9000.dtsi b/app/boards/shields/bfo9000/bfo9000.dtsi index 11080671..c5547920 100644 --- a/app/boards/shields/bfo9000/bfo9000.dtsi +++ b/app/boards/shields/bfo9000/bfo9000.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -28,7 +28,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index 412fcbed..18a2085c 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -19,7 +19,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | @@ -37,7 +36,6 @@ }; lower_layer { - display-name = "Lower Layer"; // | | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | | | | diff --git a/app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi b/app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi deleted file mode 100644 index 0bbee3bd..00000000 --- a/app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - horizontal_physical_layout: horizontal_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Horizontal Layout"; - - keys - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - ; - }; - - vertical_physical_layout: vertical_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Vertical Layout"; - - keys - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - ; - }; - - position_map { - compatible = "zmk,physical-layout-position-map"; - - horizontal_map: horizontal { - // A 7 8 9 - // B 4 5 6 - // C 1 2 3 - physical-layout = <&horizontal_physical_layout>; - positions = ; - }; - vertical_map: verctical { - // A B C - // 7 8 9 - // 4 5 6 - // 1 2 3 - physical-layout = <&vertical_physical_layout>; - positions = ; - }; - }; - -}; diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.keymap b/app/boards/shields/boardsource3x4/boardsource3x4.keymap index 5648d235..c47126ab 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.keymap +++ b/app/boards/shields/boardsource3x4/boardsource3x4.keymap @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 The ZMK Contributors + * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &tog 1 &kp C_PREV &kp C_PP &kp C_NEXT @@ -24,7 +23,6 @@ }; num_layer { - display-name = "Num Layer"; bindings = < &trans &kp N7 &kp N8 &kp N9 &trans &kp N4 &kp N5 &kp N6 @@ -33,16 +31,14 @@ }; lower_layer { - display-name = "Lower Layer"; bindings = < &bt BT_CLR &none &sys_reset &bootloader &trans &bt BT_SEL 3 &bt BT_SEL 4 &none - &studio_unlock &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 + &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 >; }; raise_layer { - display-name = "Raise Layer"; bindings = < &kp 0x68 &kp 0x69 &kp 0x6A &kp 0x6B &kp 0x6C &kp 0x6D &kp 0x6E &kp 0x6F @@ -50,4 +46,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.overlay b/app/boards/shields/boardsource3x4/boardsource3x4.overlay index 37d0c3fc..afbc9abf 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.overlay +++ b/app/boards/shields/boardsource3x4/boardsource3x4.overlay @@ -1,53 +1,19 @@ /* - * Copyright (c) 2025 The ZMK Contributors + * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ #include -#include "boardsource3x4-layouts.dtsi" - - -&horizontal_physical_layout { - transform = <&horizontal_transform>; -}; -&vertical_physical_layout { - transform = <&vertical_transform>; -}; / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &horizontal_physical_layout; - }; - - horizontal_transform: horizontal_transform { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <3>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) - >; - }; - - vertical_transform: vertical_transform { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <3>; - map = < - RC(0,3) RC(1,3) RC(2,3) - RC(0,2) RC(1,2) RC(2,2) - RC(0,1) RC(1,1) RC(2,1) - RC(0,0) RC(1,0) RC(2,0) - >; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.zmk.yml b/app/boards/shields/boardsource3x4/boardsource3x4.zmk.yml index eee7fa40..fee27965 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.zmk.yml +++ b/app/boards/shields/boardsource3x4/boardsource3x4.zmk.yml @@ -6,4 +6,3 @@ url: https://boardsource.xyz/store/5ecc2008eee64242946c98c1 requires: [pro_micro] features: - keys - - studio diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.keymap b/app/boards/shields/boardsource5x12/boardsource5x12.keymap index 3be2ae97..cb851c35 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.keymap +++ b/app/boards/shields/boardsource5x12/boardsource5x12.keymap @@ -15,13 +15,12 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BSPC | // | TAB | Q | W | E | R | T | Y | U | I | O | P | \ | // | SHIFT | A | S | D | F | G | H | J | K | L | ; | ' | // | CTRL | Z | X | C | V | B | N | M | , | . | / | ENTER | - // |ADJUST | LCTL | LALT | LGUI | LOWR | SPACE| SPACE | RAIS | LEFT | DOWN | UARW | RARW | + // |ADJUST | LCTL | LALT | LGUI | LOWR | SPACE| SPACE | RAIS | LARW | DARW | UARW | RARW | bindings = < @@ -34,7 +33,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------- // | ESC | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | DEL | @@ -51,7 +49,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------ // | ESC | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL | @@ -68,7 +65,6 @@ }; adjust_layer { - display-name = "Adjust Layer"; // ------------------------------------------------------------------------------------------ // |tog(4)| F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // | | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |LALT(PRTSN)| @@ -85,7 +81,6 @@ }; flock_layer { - display-name = "Flock Layer"; // ---------------------------------------------------------------------------------------------- // |tog(4) | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | | // |out tog|BT_SEL 0|BT_SEL 1|BT_SEL 2|BT_SEL 3|BT_SEL 4|BT_PRV|BT_NXT|BT_CLR| | | | @@ -101,4 +96,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.overlay b/app/boards/shields/boardsource5x12/boardsource5x12.overlay index 2e2c22d8..080a2392 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.overlay +++ b/app/boards/shields/boardsource5x12/boardsource5x12.overlay @@ -6,31 +6,14 @@ #include -#include - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &layout_ortho_5x12_all1u; - }; - - matrix_transform_50_all1u: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) - >; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -56,8 +39,4 @@ , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; }; -}; - -&layout_ortho_5x12_all1u { - transform = <&matrix_transform_50_all1u>; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.zmk.yml b/app/boards/shields/boardsource5x12/boardsource5x12.zmk.yml index 83e6b4b1..6987e27a 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.zmk.yml +++ b/app/boards/shields/boardsource5x12/boardsource5x12.zmk.yml @@ -6,4 +6,3 @@ url: https://boardsource.xyz/store/5ecb802c86879c9a0c22db61 requires: [pro_micro] features: - keys - - studio diff --git a/app/boards/shields/chalice/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/chalice/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/chalice/boards/nice_nano.overlay index 424a617b..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay similarity index 97% rename from app/boards/shields/eternal_keypad/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/chalice/boards/nice_nano_v2.overlay index 424a617b..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/chalice/chalice.conf b/app/boards/shields/chalice/chalice.conf index 6ca70f41..da642256 100644 --- a/app/boards/shields/chalice/chalice.conf +++ b/app/boards/shields/chalice/chalice.conf @@ -1,2 +1,3 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y \ No newline at end of file diff --git a/app/boards/shields/chalice/chalice.keymap b/app/boards/shields/chalice/chalice.keymap index 92864046..c72e3ee1 100644 --- a/app/boards/shields/chalice/chalice.keymap +++ b/app/boards/shields/chalice/chalice.keymap @@ -15,7 +15,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC @@ -27,7 +26,6 @@ }; function_layer { - display-name = "Function Layer"; bindings = < &bootloader &out OUT_TOG &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans diff --git a/app/boards/shields/chalice/chalice.overlay b/app/boards/shields/chalice/chalice.overlay index 8631d735..6778588b 100644 --- a/app/boards/shields/chalice/chalice.overlay +++ b/app/boards/shields/chalice/chalice.overlay @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; @@ -44,8 +44,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index 883aaa29..40e9a39f 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -26,7 +26,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; - wakeup-source; + label = "KSCAN"; input-gpios = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/clog/clog.keymap b/app/boards/shields/clog/clog.keymap index fb696d09..885404f7 100644 --- a/app/boards/shields/clog/clog.keymap +++ b/app/boards/shields/clog/clog.keymap @@ -15,7 +15,7 @@ &mt { flavor = "tap-preferred"; - tapping-term-ms = <140>; + tapping_term_ms = <140>; }; / { @@ -75,7 +75,6 @@ compatible = "zmk,keymap"; MAIN_layer { - display-name = "Main Layer"; bindings = < &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp Q &kp A &kp S &kp D < SYM F &kp G &kp H < SYM J &kp K &kp L &kp SQT &kp P @@ -85,7 +84,6 @@ }; SYM_layer { - display-name = "Sym Layer"; bindings = < &kp N7 &kp N8 &kp N9 &kp STAR &kp DLLR &kp LBRC &kp RBRC &kp HASH &kp AMPS &kp EXCL &kp N1 &kp N2 &kp N3 &kp EQUAL &kp LT &kp LPAR &kp RPAR &kp GT &kp PIPE &none @@ -95,7 +93,6 @@ }; NAV_layer { - display-name = "Nav Layer"; bindings = < &kp C_VOL_DN &kp C_VOL_UP &kp C_NEXT &kp C_PP &none &kp F7 &kp F8 &kp F9 &kp C_PREV &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp LC(TAB) &kp PSCRN &kp F1 &kp F2 &kp F3 &kp F10 &kp F12 @@ -105,7 +102,6 @@ }; BT_layer { - display-name = "BT Layer"; bindings = < &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none diff --git a/app/boards/shields/clueboard_california/clueboard_california.keymap b/app/boards/shields/clueboard_california/clueboard_california.keymap index 0aec8c10..9af22fa1 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.keymap +++ b/app/boards/shields/clueboard_california/clueboard_california.keymap @@ -12,7 +12,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp N9 &kp N8 &kp N7 &kp N6 @@ -23,4 +22,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/clueboard_california/clueboard_california.overlay b/app/boards/shields/clueboard_california/clueboard_california.overlay index 8cea791e..dfa5d9cf 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.overlay +++ b/app/boards/shields/clueboard_california/clueboard_california.overlay @@ -12,6 +12,8 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/contra/contra.keymap b/app/boards/shields/contra/contra.keymap index ccb18901..77b431b6 100644 --- a/app/boards/shields/contra/contra.keymap +++ b/app/boards/shields/contra/contra.keymap @@ -17,7 +17,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT @@ -27,7 +26,6 @@ }; num_mods { - display-name = "Num Mods"; bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp TAB &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PG_UP &kp LBKT &kp RBKT &kp BSLH @@ -37,7 +35,6 @@ }; bt_control { - display-name = "Bt Control"; bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans @@ -46,4 +43,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/contra/contra.overlay b/app/boards/shields/contra/contra.overlay index e304ea77..21e19425 100644 --- a/app/boards/shields/contra/contra.overlay +++ b/app/boards/shields/contra/contra.overlay @@ -4,32 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include - -#include - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &layout_ortho_4x12_all1u; - }; - - matrix_transform_40_all1u: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - >; }; kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -54,8 +36,4 @@ , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; }; -}; - -&layout_ortho_4x12_all1u { - transform = <&matrix_transform_40_all1u>; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/contra/contra.zmk.yml b/app/boards/shields/contra/contra.zmk.yml index db289833..da3a9447 100644 --- a/app/boards/shields/contra/contra.zmk.yml +++ b/app/boards/shields/contra/contra.zmk.yml @@ -6,4 +6,3 @@ url: https://github.com/ai03-2725/Contra requires: [pro_micro] features: - keys - - studio diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index 27d50df3..07dd07e9 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -21,6 +21,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -28,7 +31,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/elephant42/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/corne/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/elephant42/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/corne/boards/nice_nano.overlay index 424a617b..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/corne/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay similarity index 97% rename from app/boards/shields/corne/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/corne/boards/nice_nano_v2.overlay index 424a617b..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/corne/corne.conf b/app/boards/shields/corne/corne.conf index b10586cc..974243c8 100644 --- a/app/boards/shields/corne/corne.conf +++ b/app/boards/shields/corne/corne.conf @@ -1,5 +1,6 @@ # Uncomment the following lines to enable the Corne RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # Uncomment the following line to enable the Corne OLED Display # CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index e1dcc058..0e9eddf9 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -6,22 +6,11 @@ #include -#include -#include - -&foostan_corne_6col_layout { - transform = <&default_transform>; -}; - -&foostan_corne_5col_layout { - transform = <&five_column_transform>; -}; - / { chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,physical-layout = &foostan_corne_6col_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -47,7 +36,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | -// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | +// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) @@ -58,7 +47,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -79,6 +68,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -88,7 +78,6 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/corne/corne.keymap b/app/boards/shields/corne/corne.keymap index fa6d4744..0555cf41 100644 --- a/app/boards/shields/corne/corne.keymap +++ b/app/boards/shields/corne/corne.keymap @@ -13,9 +13,8 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ----------------------------------------------------------------------------------------- -// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | GUI | LWR | SPC | | ENT | RSE | ALT | @@ -27,9 +26,8 @@ >; }; lower_layer { - display-name = "Lower Layer"; // ----------------------------------------------------------------------------------------- -// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC | +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | SHFT | | | | | | | | | | | | | // | GUI | | SPC | | ENT | | ALT | @@ -42,16 +40,15 @@ }; raise_layer { - display-name = "Raise Layer"; // ----------------------------------------------------------------------------------------- -// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC | +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | GUI | | SPC | | ENT | | ALT | bindings = < - &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp BSPC - &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE - &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC + &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE + &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; diff --git a/app/boards/shields/corne/corne.zmk.yml b/app/boards/shields/corne/corne.zmk.yml index 1afc0218..1e8a5fbb 100644 --- a/app/boards/shields/corne/corne.zmk.yml +++ b/app/boards/shields/corne/corne.zmk.yml @@ -9,7 +9,6 @@ features: - keys - display - underglow - - studio siblings: - corne_left - corne_right diff --git a/app/boards/shields/cradio/cradio.dtsi b/app/boards/shields/cradio/cradio.dtsi index c2947e55..57dcfd4b 100644 --- a/app/boards/shields/cradio/cradio.dtsi +++ b/app/boards/shields/cradio/cradio.dtsi @@ -5,15 +5,12 @@ */ #include -#include - -&cuddlykeyboards_ferris_layout { - transform = <&default_transform>; -}; / { + chosen { zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -30,8 +27,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; - wakeup-source; - + label = "KSCAN"; input-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index 6463cd6e..47bf0422 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -12,6 +12,7 @@ / { behaviors { ht: hold_tap { + label = "hold_tap"; compatible = "zmk,behavior-hold-tap"; #binding-cells = <2>; flavor = "tap-preferred"; @@ -33,7 +34,6 @@ keymap { compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ @@ -51,14 +51,13 @@ }; right_layer { - display-name = "Right Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │ &kp INS &kp N1 &kp N2 &kp N3 &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &kp COLON //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //│ DELETE │ 4 │ 5 │ 6 │ │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │ - &kp DEL &kp N4 &kp N5 &kp N6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp SEMI + &kp DEL &kp N4 &kp N5 &kp N6 &trans &kp LARW &kp DARW &kp UARW &kp RARW &kp SEMI //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //│ CAPS │ 7 │ 8 │ 9 │ 0 │ │ │ │ │ │ │ &caps_word &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans @@ -69,7 +68,6 @@ }; left_layer { - display-name = "Left Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │ @@ -87,7 +85,6 @@ }; tri_layer { - display-name = "Tri Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ diff --git a/app/boards/shields/cradio/cradio.zmk.yml b/app/boards/shields/cradio/cradio.zmk.yml index 5ccfef0a..76cf1ab2 100644 --- a/app/boards/shields/cradio/cradio.zmk.yml +++ b/app/boards/shields/cradio/cradio.zmk.yml @@ -7,7 +7,6 @@ requires: [pro_micro] exposes: [i2c_oled] features: - keys - - studio siblings: - cradio_left - cradio_right diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index 5316465b..f963ba84 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -13,24 +13,22 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ----------------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTRL | LALT | LGUI | LOWR | SPACE | RAIS | LEFT | DOWN | UP | RIGHT | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | bindings = < &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; }; lower { - display-name = "Lower"; bindings = < &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE @@ -42,7 +40,6 @@ }; raise { - display-name = "Raise"; bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH @@ -54,7 +51,6 @@ }; control { - display-name = "Control"; bindings = < &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/crbn/crbn.overlay b/app/boards/shields/crbn/crbn.overlay index 977bfadc..817a83d0 100644 --- a/app/boards/shields/crbn/crbn.overlay +++ b/app/boards/shields/crbn/crbn.overlay @@ -6,30 +6,14 @@ #include -#include - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &layout_ortho_4x12_all1u; - }; - - matrix_transform_40_all1u: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - >; }; kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -57,19 +41,15 @@ encoder: encoder { compatible = "alps,ec11"; + label = "ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - steps = <80>; + resolution = <2>; status = "okay"; }; - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder>; - triggers-per-rotation = <20>; }; }; - -&layout_ortho_4x12_all1u { - transform = <&matrix_transform_40_all1u>; -}; diff --git a/app/boards/shields/crbn/crbn.zmk.yml b/app/boards/shields/crbn/crbn.zmk.yml index 47c328a3..baa73ea0 100644 --- a/app/boards/shields/crbn/crbn.zmk.yml +++ b/app/boards/shields/crbn/crbn.zmk.yml @@ -7,4 +7,3 @@ requires: [pro_micro] features: - keys - encoder - - studio diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index be2f108c..74ecc407 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -14,7 +14,6 @@ compatible = "zmk,keymap"; default { - display-name = "Default"; // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Q | W | E | R | T | | Y | U | I | O | P | // A | S | D | F | G | | H | J | K | L | ; | @@ -28,7 +27,6 @@ >; }; numbers { - display-name = "Numbers"; // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | // TAB | BT_PRV | BT_NXT | VOL-| VOL+| | < | v | ∧ | > | ' | @@ -42,7 +40,6 @@ >; }; symbols { - display-name = "Symbols"; // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | // CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | diff --git a/app/boards/shields/eek/eek.overlay b/app/boards/shields/eek/eek.overlay index 28aab7ef..f53c6b5b 100644 --- a/app/boards/shields/eek/eek.overlay +++ b/app/boards/shields/eek/eek.overlay @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -26,8 +26,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index dc10e980..70a312c1 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/elephant42.conf b/app/boards/shields/elephant42/elephant42.conf index 3a123f34..1b41763f 100644 --- a/app/boards/shields/elephant42/elephant42.conf +++ b/app/boards/shields/elephant42/elephant42.conf @@ -1,5 +1,6 @@ # Uncomment the following lines to enable the Elephant42 RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # Uncomment the following line to enable the Elephant42 OLED Display -# CONFIG_ZMK_DISPLAY=y +# CONFIG_ZMK_DISPLAY=y \ No newline at end of file diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index d72aa9a8..b0e9a32e 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -26,7 +26,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -45,6 +45,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -54,7 +55,6 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; \ No newline at end of file diff --git a/app/boards/shields/elephant42/elephant42.keymap b/app/boards/shields/elephant42/elephant42.keymap index db9a3bd6..62484728 100644 --- a/app/boards/shields/elephant42/elephant42.keymap +++ b/app/boards/shields/elephant42/elephant42.keymap @@ -18,7 +18,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL &mt LCTRL TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT @@ -28,7 +27,6 @@ }; lower { - display-name = "Lower"; bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp C_PLAY_PAUSE &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans @@ -37,7 +35,6 @@ >; }; raise { - display-name = "Raise"; bindings = < &kp TILDE &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp C_PLAY_PAUSE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp BSLH @@ -47,7 +44,6 @@ }; adjust { - display-name = "Adjust"; bindings = < &trans &bt BT_NXT &bt BT_PRV &trans &trans &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans @@ -56,4 +52,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/ergodash/ergodash.dtsi b/app/boards/shields/ergodash/ergodash.dtsi index b6ef7fc4..d109fa66 100644 --- a/app/boards/shields/ergodash/ergodash.dtsi +++ b/app/boards/shields/ergodash/ergodash.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -35,7 +35,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,13) RC(4,12 kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index 45b71296..e384e504 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -18,7 +18,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; /* QWERTY * .----------------------------------------------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 | PScr | @@ -41,7 +40,6 @@ >; }; lower_layer { - display-name = "Lower Layer"; /* .----------------------------------------------------------------------------------------------------------------------. * | F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 | * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| @@ -63,7 +61,6 @@ >; }; raise_layer { - display-name = "Raise Layer"; /* .----------------------------------------------------------------------------------------------------------------------. * | | BT 0 | BT 1 | BT 2 | BT 3 | | BTCL | | | | | | | | | * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.conf b/app/boards/shields/eternal_keypad/eternal_keypad.conf index 5f7c33bc..65fa2955 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.conf +++ b/app/boards/shields/eternal_keypad/eternal_keypad.conf @@ -6,3 +6,4 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.dtsi b/app/boards/shields/eternal_keypad/eternal_keypad.dtsi index 1274e3dd..6319d9e0 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.dtsi +++ b/app/boards/shields/eternal_keypad/eternal_keypad.dtsi @@ -9,12 +9,12 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap index 51171228..da06d274 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -17,14 +17,13 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; keymap { compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp N7 @@ -35,7 +34,6 @@ }; arrow_layer { - display-name = "Arrow Layer"; bindings = < &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD @@ -46,7 +44,6 @@ }; function_layer { - display-name = "Function Layer"; bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap index 80eb4af9..81710032 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -17,14 +17,13 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; keymap { compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp N7 @@ -35,7 +34,6 @@ }; arrow_layer { - display-name = "Arrow Layer"; bindings = < &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD @@ -46,7 +44,6 @@ }; function_layer { - display-name = "Function Layer"; bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 diff --git a/app/boards/shields/fourier/fourier.dtsi b/app/boards/shields/fourier/fourier.dtsi index f486e0a4..0902d687 100644 --- a/app/boards/shields/fourier/fourier.dtsi +++ b/app/boards/shields/fourier/fourier.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; /* @@ -30,7 +30,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) /**/ RC(3,6) RC(3,9 kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/fourier/fourier.keymap b/app/boards/shields/fourier/fourier.keymap index 17b1f81e..f0912bf1 100644 --- a/app/boards/shields/fourier/fourier.keymap +++ b/app/boards/shields/fourier/fourier.keymap @@ -14,14 +14,13 @@ compatible = "zmk,keymap"; // ---------------------------------------------- ---------------------------------------------- -// | ESC | Q | W | E | R | T | | Y | U | I | O | P | | BSPC | +// | ESC | Q | W | E | R | T | | Y | U | I | O | P | | BKSP | // | TAB | A | S | D | F | G | | H | J | K | L | ' | ENTER | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | RSHFT | // | LCTRL | LALT| LGUI | SPACE | | SPACE/L1 | L2 | RGUI | RALT |RCTRL| // ------------------------------------------- ----------------------------------------------- default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T /**/ &kp Y &kp U &kp I &kp O &kp P &none &kp BACKSPACE &kp TAB &kp A &kp S &kp D &kp F &kp G /**/ &kp H &kp J &kp K &kp L &kp SQT &kp ENTER @@ -38,7 +37,6 @@ // ------------------------------------------- ----------------------------------------------- symbols_layer { - display-name = "Symbols Layer"; bindings = < &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 /**/ &kp N7 &kp N8 &kp N9 &kp N0 &kp PSCRN &none &kp DEL &kp GRAVE &none &kp LEFT &kp UP &kp RIGHT &kp C_VOL_UP /**/ &kp LBKT &kp RBKT &kp MINUS &kp EQUAL &kp SEMI &kp BACKSLASH @@ -55,7 +53,6 @@ // ------------------------------------------- ----------------------------------------------- fn_layer { - display-name = "Fn Layer"; bindings = < &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 /**/ &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &none &kp F12 &kp CAPS &none &kp HOME &kp PG_UP &kp END &none /**/ &none &none &none &none &none &none diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/helix/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/helix/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/helix/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/helix/helix.conf b/app/boards/shields/helix/helix.conf index d8cb2f2e..a8e57338 100644 --- a/app/boards/shields/helix/helix.conf +++ b/app/boards/shields/helix/helix.conf @@ -3,3 +3,4 @@ # Enables RGB functionality (Uncomment lines below to enable.) # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y \ No newline at end of file diff --git a/app/boards/shields/helix/helix.dtsi b/app/boards/shields/helix/helix.dtsi index 8566ffc6..bbaec636 100644 --- a/app/boards/shields/helix/helix.dtsi +++ b/app/boards/shields/helix/helix.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -32,7 +32,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9 kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/helix/helix.keymap b/app/boards/shields/helix/helix.keymap index 867ebc67..80678fe6 100644 --- a/app/boards/shields/helix/helix.keymap +++ b/app/boards/shields/helix/helix.keymap @@ -25,7 +25,6 @@ As such, those are in use within the default layer at this time.*/ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | @@ -41,7 +40,6 @@ As such, those are in use within the default layer at this time.*/ >; }; lower_layer { - display-name = "Lower Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | | | | | | | | | | | | | // | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | @@ -57,7 +55,6 @@ As such, those are in use within the default layer at this time.*/ >; }; raise_layer { - display-name = "Raise Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | @@ -73,7 +70,6 @@ As such, those are in use within the default layer at this time.*/ >; }; adjust_layer { - display-name = "Adjust Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | EP TOG | // | BT CLR | BT SEL0 | BT SEL1 | BT SEL2 | BGT SEL3 | BT SEL4 | | RGB EFF+ | RGB HUE+ | RGB SAT+ | RGB SPD+ | RGB BRI+ | RGB TOG | @@ -89,4 +85,4 @@ As such, those are in use within the default layer at this time.*/ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/hummingbird/hummingbird-layouts.dtsi b/app/boards/shields/hummingbird/hummingbird-layouts.dtsi deleted file mode 100644 index bfae8224..00000000 --- a/app/boards/shields/hummingbird/hummingbird-layouts.dtsi +++ /dev/null @@ -1,41 +0,0 @@ -#include - -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 75 0 0 0> - , <&key_physical_attrs 100 100 100 25 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 25 0 0 0> - , <&key_physical_attrs 100 100 400 75 0 0 0> - , <&key_physical_attrs 100 100 600 75 0 0 0> - , <&key_physical_attrs 100 100 700 25 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 25 0 0 0> - , <&key_physical_attrs 100 100 1000 75 0 0 0> - , <&key_physical_attrs 100 100 0 175 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 400 175 0 0 0> - , <&key_physical_attrs 100 100 600 175 0 0 0> - , <&key_physical_attrs 100 100 700 125 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 125 0 0 0> - , <&key_physical_attrs 100 100 1000 175 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 700 225 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 225 0 0 0> - , <&key_physical_attrs 100 100 325 350 0 0 0> - , <&key_physical_attrs 100 100 425 375 0 0 0> - , <&key_physical_attrs 100 100 575 375 0 0 0> - , <&key_physical_attrs 100 100 675 350 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/boards/shields/hummingbird/hummingbird.keymap b/app/boards/shields/hummingbird/hummingbird.keymap index a50e541a..990d7909 100644 --- a/app/boards/shields/hummingbird/hummingbird.keymap +++ b/app/boards/shields/hummingbird/hummingbird.keymap @@ -13,14 +13,15 @@ #define SYM_L 3 // Using layer taps on thumbs, having quick tap as well helps w/ repeating space/backspace -< { quick-tap-ms = <200>; }; +< { quick_tap_ms = <200>; }; / { behaviors { hm: homerow_mods { compatible = "zmk,behavior-hold-tap"; + label = "homerow mods"; #binding-cells = <2>; - tapping-term-ms = <225>; + tapping_term_ms = <225>; flavor = "tap-preferred"; bindings = <&kp>, <&kp>; }; @@ -56,27 +57,26 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp Q &kp W &kp E &kp R &kp T &kp H &kp U &kp I &kp O &kp P - &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp N &hm RSHFT J &hm RCTRL K &hm LALT L &hm RGUI SQT + &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp N &hm RSHFT J &hm RCTRL K &hm LALT L &hm RGUI QUOT &kp X &kp C &kp V &kp M &kp COMMA &kp DOT - < NAV_L TAB &kp RET < NUM_L SPACE < SYM_L BSPC + < NAV_L TAB &kp RET < NUM_L SPACE < SYM_L BKSP >; }; nav_layer { - display-name = "Nav"; + label = "Nav"; bindings = < - &trans &trans &trans &trans &trans &trans &kp HOME &kp UP &kp PG_UP &trans - &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp RIGHT &trans + &trans &trans &trans &trans &trans &trans &kp HOME &kp UARW &kp PG_UP &trans + &trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp RARW &trans &trans &trans &trans &kp END &trans &kp PG_DN &trans &trans &kp ESC &kp DEL >; }; num_layer { - display-name = "Num"; + label = "Num"; bindings = < &kp LBKT &kp N7 &kp N8 &kp N9 &kp RBKT &trans &trans &trans &trans &trans &kp SEMI &kp N4 &kp N5 &kp N6 &kp EQUAL &trans &trans &trans &trans &trans @@ -86,7 +86,7 @@ }; sym_layer { - display-name = "Sym"; + label = "Sym"; bindings = < &kp LBRC &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp RBRC &trans &trans &trans &trans &trans &kp COLON &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp PLUS &trans &trans &trans &trans &trans diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 2efc263b..1b40acba 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -5,19 +5,16 @@ */ #include -#include "hummingbird-layouts.dtsi" - -&physical_layout0 { - transform = <&matrix_transform0>; -}; / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; + zmk,matrix_transform = &default_transform; + /delete-property/ zephyr,console; + /delete-property/ zephyr,shell-uart; }; - matrix_transform0: keymap_transform_0 { + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <7>; rows = <6>; @@ -32,8 +29,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "row2col"; col-gpios @@ -53,4 +49,8 @@ , <&xiao_d 5 GPIO_ACTIVE_HIGH> ; }; + }; + +&xiao_spi { status = "disabled"; }; +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/shields/hummingbird/hummingbird.zmk.yml b/app/boards/shields/hummingbird/hummingbird.zmk.yml index e9508a85..ee3a8bc8 100644 --- a/app/boards/shields/hummingbird/hummingbird.zmk.yml +++ b/app/boards/shields/hummingbird/hummingbird.zmk.yml @@ -6,4 +6,3 @@ url: https://github.com/PJE66/hummingbird requires: [seeed_xiao] features: - keys - - studio diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 8ddbd359..a0caf1ad 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -32,7 +32,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/iris/iris.keymap b/app/boards/shields/iris/iris.keymap index affe1cc6..209c2277 100644 --- a/app/boards/shields/iris/iris.keymap +++ b/app/boards/shields/iris/iris.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | @@ -30,7 +29,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -38,16 +36,15 @@ // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans -&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 -&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp TILDE -&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE +&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans >; }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 4045b6b3..8e772791 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -6,26 +6,10 @@ #include -#include -#include -#include - -&kgoh_jian_full_layout { - transform = <&default_transform>; -}; - -&kgoh_jian_6col_layout { - transform = <&crkbd_transform>; -}; - -&kgoh_jian_5col_layout { - transform = <&five_column_transform>; -}; - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &kgoh_jian_full_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -72,13 +56,13 @@ RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) - RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) + RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) >; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/jian/jian.keymap b/app/boards/shields/jian/jian.keymap index 72d4bde8..e8f7dcc8 100644 --- a/app/boards/shields/jian/jian.keymap +++ b/app/boards/shields/jian/jian.keymap @@ -7,83 +7,70 @@ #include #include #include -#include #define DEF 0 #define LWR 1 #define RSE 2 #define ADJ 3 -< { quick-tap-ms = <200>; }; -&mt { quick-tap-ms = <200>; }; +< { quick_tap_ms = <200>; }; +&mt { quick_tap_ms = <200>; }; / { - conditional_layers { - compatible = "zmk,conditional-layers"; - tri_layer { - if-layers = ; - then-layer = ; - }; - }; - keymap { compatible = "zmk,keymap"; default_layer { - display-name = "MAIN"; // ----------------------------------------------------------------------------------------- // | GUI | ~ | Q | W | E | R | T | | Y | U | I | O | P | [ | GUI/] | // | CTRL | A | S | D | F | G | | H | J | K | L | ; |CTRL/'| -// | LALT | Z | X | C | V | B | | N | M | , | . | / |RALT/\| -// | RSE | SPC | LWR | | LWR | BSPC | RSE | +// | LALT | Z | X | C | V | B | | N | M | , | . | / | RALT | +// | RSE | SPC | LWR | | LWR | BKSP | RSE | bindings = < &kp LWIN &kp GRAVE &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RWIN RBKT &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &mt RCTRL SQT &kp LALT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RALT BSLH - < RSE TAB &mt LSHFT SPACE < LWR RET < LWR ESC &mt RSHFT BSPC < RSE DEL + < RSE TAB &mt LSHFT SPACE < LWR RET < LWR ESC &mt RSHFT BSPC < RSE DEL >; }; lower_layer { - display-name = "SYM"; // ----------------------------------------------------------------------------------------- // | | _ | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // | + | ! | @ | # | $ | % | | ^ | & | * | ( | ) | - | // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | -// | ADJ | | | | | | ADJ | +// | GUI | | SPC | | ENT | | ALT | bindings = < &trans &kp UNDER &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &mt RGUI F12 &mt LCTRL PLUS &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &mt RCTRL MINUS &mt LALT EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans - &trans &trans &trans &trans &trans &trans + < ADJ TAB &trans &trans &trans &trans < ADJ DEL >; }; raise_layer { - display-name = "NUM"; // ----------------------------------------------------------------------------------------- // | | NMLK | / | 7 | 8 | 9 | - | | VOLU| HOME| PRSC| PGUP| SCLK| CLCK| | -// |CTRL/=| * | 4 | 5 | 6 | + | | MUT | LEFT| UP | RGHT| INS | APP | +// | CTRL | * | 4 | 5 | 6 | + | | MUT | LEFT| UP | RGHT| INS | APP | // | | 0 | 1 | 2 | 3 | . | | VOLD| END | DOWN| PGDN| PAUS| | // | | | ADJ | | ADJ | | | bindings = < &trans &kp KP_NUM &kp KP_SLASH &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp C_VOL_UP &kp HOME &kp PSCRN &kp PG_UP &kp SLCK &kp CAPS &trans &mt LCTRL EQUAL &kp KP_MULTIPLY &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &kp C_MUTE &kp LEFT &kp UP &kp RIGHT &kp INS &mt RCTRL K_APP &trans &kp KP_N0 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_DOT &kp C_VOL_DN &kp END &kp DOWN &kp PG_DN &kp PAUSE_BREAK &trans - &trans &trans &trans &trans &trans &trans + &trans &trans < ADJ RET < ADJ ESC &trans &trans >; }; adjust_layer { - display-name = "ADJ"; // ----------------------------------------------------------------------------------------- -// | RST | BLDR | STU | | | | | | | | | | STU | BLDR | RST | +// | RST | BLDR | | | | | | | | | | | | BLDR | RST | // | BTCLR| BT0 | BT1 | BT2 | BT3 | BT4 | | BT4 | BT3 | BT2 | BT1 | BT0 | BTCLR| -// | OUT | | | | | | | | | | | | OUT | +// | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &sys_reset &bootloader &studio_unlock &none &none &none &none &none &none &none &none &studio_unlock &bootloader &sys_reset - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR - &out OUT_TOG &none &none &none &none &none &none &none &none &none &none &out OUT_TOG - &trans &none &trans &trans &none &trans + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR + &none &none &none &none &none &none &none &none &none &none &none &none + &trans &none &trans &trans &none &trans >; }; }; diff --git a/app/boards/shields/jian/jian.zmk.yml b/app/boards/shields/jian/jian.zmk.yml index 094f49d7..84ed69d7 100644 --- a/app/boards/shields/jian/jian.zmk.yml +++ b/app/boards/shields/jian/jian.zmk.yml @@ -6,7 +6,6 @@ url: https://github.com/KGOH/Jian-Info requires: [pro_micro] features: - keys - - studio siblings: - jian_left - jian_right diff --git a/app/boards/shields/jiran/jiran-layouts.dtsi b/app/boards/shields/jiran/jiran-layouts.dtsi deleted file mode 100644 index b56c7725..00000000 --- a/app/boards/shields/jiran/jiran-layouts.dtsi +++ /dev/null @@ -1,103 +0,0 @@ -#include -#include -#include - -&layouts_kgoh_jian_position_map { - ladniy_jiran_full_posmap: full_jiran { - physical-layout = <&ladniy_jiran_full_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 > - , <12 13 14 15 16 17 18 19 20 21 22 23 24 25> - , < 26 27 28 29 30 31 32 33 34 35 36 37 > - , < 38 39 40 41 42 43 44 45 46 47 48 49 > - , < 50 51 52 53 54 55 >; - }; -}; - -&kgoh_jian_full_posmap { - positions - = < 44 45 46 47 48 49 50 51 52 53 54 55 > - , < 0 1 2 3 4 5 6 7 8 9 10 11 12 13> - , < 14 15 16 17 18 19 20 21 22 23 24 25 > - , < 26 27 28 29 30 31 32 33 34 35 36 37 > - , < 38 39 40 41 42 43 >; -}; - -&kgoh_jian_6col_posmap { - positions - = < 42 43 44 45 46 47 48 49 50 51 52 53 > - , <54 0 1 2 3 4 5 6 7 8 9 10 11 55> - , < 12 13 14 15 16 17 18 19 20 21 22 23 > - , < 24 25 26 27 28 29 30 31 32 33 34 35 > - , < 36 37 38 39 40 41 >; -}; - -&kgoh_jian_full_layout { - display-name = "Jian (with pinky)"; -}; - -/ { - ladniy_jiran_full_layout: ladniy_jiran_full_layout { - compatible = "zmk,physical-layout"; - display-name = "Full (with pinky/numbers)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 100 75 0 0 0> - , <&key_physical_attrs 100 100 200 62 0 0 0> - , <&key_physical_attrs 100 100 300 25 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 25 0 0 0> - , <&key_physical_attrs 100 100 600 37 0 0 0> - , <&key_physical_attrs 100 100 1000 37 0 0 0> - , <&key_physical_attrs 100 100 1100 25 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 25 0 0 0> - , <&key_physical_attrs 100 100 1400 62 0 0 0> - , <&key_physical_attrs 100 100 1500 75 0 0 0> - , <&key_physical_attrs 100 100 0 250 0 0 0> - , <&key_physical_attrs 100 100 100 175 0 0 0> - , <&key_physical_attrs 100 100 200 162 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 125 0 0 0> - , <&key_physical_attrs 100 100 600 137 0 0 0> - , <&key_physical_attrs 100 100 1000 137 0 0 0> - , <&key_physical_attrs 100 100 1100 125 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 100 100 1300 125 0 0 0> - , <&key_physical_attrs 100 100 1400 162 0 0 0> - , <&key_physical_attrs 100 100 1500 175 0 0 0> - , <&key_physical_attrs 100 100 1600 250 0 0 0> - , <&key_physical_attrs 100 100 100 275 0 0 0> - , <&key_physical_attrs 100 100 200 262 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 225 0 0 0> - , <&key_physical_attrs 100 100 600 237 0 0 0> - , <&key_physical_attrs 100 100 1000 237 0 0 0> - , <&key_physical_attrs 100 100 1100 225 0 0 0> - , <&key_physical_attrs 100 100 1200 200 0 0 0> - , <&key_physical_attrs 100 100 1300 225 0 0 0> - , <&key_physical_attrs 100 100 1400 262 0 0 0> - , <&key_physical_attrs 100 100 1500 275 0 0 0> - , <&key_physical_attrs 100 100 100 375 0 0 0> - , <&key_physical_attrs 100 100 200 362 0 0 0> - , <&key_physical_attrs 100 100 300 325 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 325 0 0 0> - , <&key_physical_attrs 100 100 600 337 0 0 0> - , <&key_physical_attrs 100 100 1000 337 0 0 0> - , <&key_physical_attrs 100 100 1100 325 0 0 0> - , <&key_physical_attrs 100 100 1200 300 0 0 0> - , <&key_physical_attrs 100 100 1300 325 0 0 0> - , <&key_physical_attrs 100 100 1400 362 0 0 0> - , <&key_physical_attrs 100 100 1500 375 0 0 0> - , <&key_physical_attrs 100 100 500 425 0 0 0> - , <&key_physical_attrs 100 100 600 437 0 0 0> - , <&key_physical_attrs 100 100 700 450 0 0 0> - , <&key_physical_attrs 100 100 900 450 0 0 0> - , <&key_physical_attrs 100 100 1000 437 0 0 0> - , <&key_physical_attrs 100 100 1100 425 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index 0e0bd0a4..b7e74c27 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -6,27 +6,13 @@ #include -#include "jiran-layouts.dtsi" - -&ladniy_jiran_full_layout { - transform = <&jiran_transform>; -}; - -&kgoh_jian_full_layout { - transform = <&jian_transform>; -}; - -&kgoh_jian_6col_layout { - transform = <&crkbd_transform>; -}; - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &ladniy_jiran_full_layout; + zmk,matrix_transform = &default_transform; }; - jiran_transform: keymap_transform_0 { + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <12>; rows = <5>; @@ -81,7 +67,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/jiran/jiran.keymap b/app/boards/shields/jiran/jiran.keymap index 55494d36..6dcd733c 100644 --- a/app/boards/shields/jiran/jiran.keymap +++ b/app/boards/shields/jiran/jiran.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp LGUI &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RGUI RBKT @@ -24,14 +23,13 @@ }; lower_layer { - display-name = "Lower Layer"; bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp EQUAL - &kp F11 &kp TAB &bt BT_CLR &kp HOME &sys_reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &studio_unlock &kp HOME &kp INS &kp DEL &kp F12 + &kp F11 &kp TAB &bt BT_CLR &kp HOME &sys_reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &sys_reset &kp HOME &kp INS &kp DEL &kp F12 &kp LSHIFT &bt BT_NXT &kp LEFT &kp UP &kp RIGHT &kp C_MUTE &kp C_MUTE &kp LEFT &kp UP &kp RIGHT &kp PSCRN &mt RSHIFT SLCK &kp LCTRL &bt BT_PRV &kp END &kp DOWN &kp PG_DN &kp C_VOL_DN &kp C_VOL_DN &kp PG_DN &kp DOWN &kp END &kp PAUSE_BREAK &mt RCTRL KP_NUM &trans &kp SPACE &kp LALT &mt RALT RET &kp BSPC &trans >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/jiran/jiran.zmk.yml b/app/boards/shields/jiran/jiran.zmk.yml index 928042dd..1e21df7c 100644 --- a/app/boards/shields/jiran/jiran.zmk.yml +++ b/app/boards/shields/jiran/jiran.zmk.yml @@ -6,7 +6,6 @@ url: https://github.com/Ladniy/jiran requires: [pro_micro] features: - keys - - studio siblings: - jiran_left - jiran_right diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index d2c06723..668c5513 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -6,7 +6,7 @@ #include "jiran.dtsi" -&jiran_transform { +&default_transform { col-offset = <6>; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index ba332226..04beb792 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -22,6 +22,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -29,7 +32,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/jorne/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/jorne/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/jorne/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/jorne/jorne-layouts.dtsi b/app/boards/shields/jorne/jorne-layouts.dtsi deleted file mode 100644 index 0a525897..00000000 --- a/app/boards/shields/jorne/jorne-layouts.dtsi +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include - -&layouts_foostan_corne_position_map { - joric_jorne_full_posmap: full { - physical-layout = <&joric_jorne_full_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13> - , < 14 15 16 17 18 19 20 21 22 23 24 25 > - , < 26 27 28 29 30 31 32 33 34 35 36 37 > - , < 38 39 40 41 42 43 >; - }; -}; - -&foostan_corne_6col_posmap { - positions - = <42 0 1 2 3 4 5 6 7 8 9 10 11 43> - , < 12 13 14 15 16 17 18 19 20 21 22 23 > - , < 24 25 26 27 28 29 30 31 32 33 34 35 > - , < 36 37 38 39 40 41 >; -}; - -&foostan_corne_5col_posmap { - positions - = <36 37 0 1 2 3 4 5 6 7 8 9 38 39> - , < 40 10 11 12 13 14 15 16 17 18 19 41 > - , < 42 20 21 22 23 24 25 26 27 28 29 43 > - , < 30 31 32 33 34 35 >; -}; - -/ { - joric_jorne_full_layout: joric_jorne_full_layout { - compatible = "zmk,physical-layout"; - display-name = "Full (with pinky)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 112 0 0 0> - , <&key_physical_attrs 100 100 100 37 0 0 0> - , <&key_physical_attrs 100 100 200 37 0 0 0> - , <&key_physical_attrs 100 100 300 12 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 12 0 0 0> - , <&key_physical_attrs 100 100 600 24 0 0 0> - , <&key_physical_attrs 100 100 900 24 0 0 0> - , <&key_physical_attrs 100 100 1000 12 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 12 0 0 0> - , <&key_physical_attrs 100 100 1300 37 0 0 0> - , <&key_physical_attrs 100 100 1400 37 0 0 0> - , <&key_physical_attrs 100 100 1500 112 0 0 0> - , <&key_physical_attrs 100 100 100 137 0 0 0> - , <&key_physical_attrs 100 100 200 137 0 0 0> - , <&key_physical_attrs 100 100 300 112 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 112 0 0 0> - , <&key_physical_attrs 100 100 600 124 0 0 0> - , <&key_physical_attrs 100 100 900 124 0 0 0> - , <&key_physical_attrs 100 100 1000 112 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 1200 112 0 0 0> - , <&key_physical_attrs 100 100 1300 137 0 0 0> - , <&key_physical_attrs 100 100 1400 137 0 0 0> - , <&key_physical_attrs 100 100 100 237 0 0 0> - , <&key_physical_attrs 100 100 200 237 0 0 0> - , <&key_physical_attrs 100 100 300 212 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 212 0 0 0> - , <&key_physical_attrs 100 100 600 224 0 0 0> - , <&key_physical_attrs 100 100 900 224 0 0 0> - , <&key_physical_attrs 100 100 1000 212 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 1200 212 0 0 0> - , <&key_physical_attrs 100 100 1300 237 0 0 0> - , <&key_physical_attrs 100 100 1400 237 0 0 0> - , <&key_physical_attrs 100 100 450 312 0 0 0> - , <&key_physical_attrs 100 100 550 312 1200 550 412> - , <&key_physical_attrs 100 150 648 283 2400 648 433> - , <&key_physical_attrs 100 150 852 283 (-2400) 952 433> - , <&key_physical_attrs 100 100 950 312 (-1200) 1050 412> - , <&key_physical_attrs 100 100 1050 312 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/jorne/jorne.conf b/app/boards/shields/jorne/jorne.conf index c94389a2..c4e62fc0 100644 --- a/app/boards/shields/jorne/jorne.conf +++ b/app/boards/shields/jorne/jorne.conf @@ -1,5 +1,6 @@ # Uncomment the following lines to enable the Jorne RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # Uncomment the following line to enable the Jorne OLED Display # CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index d76c87dc..1d12b85c 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -6,28 +6,14 @@ #include -#include "jorne-layouts.dtsi" - -&joric_jorne_full_layout { - transform = <&jorne_transform>; -}; - -&foostan_corne_6col_layout { - transform = <&crkbd_transform>; -}; - -&foostan_corne_5col_layout { - transform = <&five_column_transform>; -}; - / { chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,physical-layout = &joric_jorne_full_layout; + zmk,matrix_transform = &default_transform; }; - jorne_transform: keymap_transform_0 { + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <12>; rows = <4>; @@ -71,13 +57,13 @@ RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) >; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -98,6 +84,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -107,7 +94,6 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/jorne/jorne.keymap b/app/boards/shields/jorne/jorne.keymap index 72d4bde8..2a109fe8 100644 --- a/app/boards/shields/jorne/jorne.keymap +++ b/app/boards/shields/jorne/jorne.keymap @@ -7,83 +7,67 @@ #include #include #include -#include #define DEF 0 #define LWR 1 #define RSE 2 #define ADJ 3 -< { quick-tap-ms = <200>; }; -&mt { quick-tap-ms = <200>; }; - / { - conditional_layers { - compatible = "zmk,conditional-layers"; - tri_layer { - if-layers = ; - then-layer = ; - }; - }; - keymap { compatible = "zmk,keymap"; default_layer { - display-name = "MAIN"; // ----------------------------------------------------------------------------------------- // | GUI | ~ | Q | W | E | R | T | | Y | U | I | O | P | [ | GUI/] | // | CTRL | A | S | D | F | G | | H | J | K | L | ; |CTRL/'| -// | LALT | Z | X | C | V | B | | N | M | , | . | / |RALT/\| -// | RSE | SPC | LWR | | LWR | BSPC | RSE | +// | LALT | Z | X | C | V | B | | N | M | , | . | / | RALT | +// | RSE | SPC | LWR | | LWR | BKSP | RSE | bindings = < &kp LWIN &kp GRAVE &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RWIN RBKT &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &mt RCTRL SQT - &kp LALT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RALT BSLH - < RSE TAB &mt LSHFT SPACE < LWR RET < LWR ESC &mt RSHFT BSPC < RSE DEL + &kp LALT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp BSLH + < RSE TAB &mt LSHFT SPACE < LWR RET < LWR ESC &mt RSHFT BSPC < RSE DEL >; }; lower_layer { - display-name = "SYM"; // ----------------------------------------------------------------------------------------- // | | _ | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // | + | ! | @ | # | $ | % | | ^ | & | * | ( | ) | - | // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | -// | ADJ | | | | | | ADJ | +// | GUI | | SPC | | ENT | | ALT | bindings = < &trans &kp UNDER &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &mt RGUI F12 &mt LCTRL PLUS &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &mt RCTRL MINUS &mt LALT EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans - &trans &trans &trans &trans &trans &trans + < ADJ TAB &trans &trans &trans &trans < ADJ DEL >; }; raise_layer { - display-name = "NUM"; // ----------------------------------------------------------------------------------------- // | | NMLK | / | 7 | 8 | 9 | - | | VOLU| HOME| PRSC| PGUP| SCLK| CLCK| | -// |CTRL/=| * | 4 | 5 | 6 | + | | MUT | LEFT| UP | RGHT| INS | APP | +// | CTRL | * | 4 | 5 | 6 | + | | MUT | LEFT| UP | RGHT| INS | APP | // | | 0 | 1 | 2 | 3 | . | | VOLD| END | DOWN| PGDN| PAUS| | // | | | ADJ | | ADJ | | | bindings = < &trans &kp KP_NUM &kp KP_SLASH &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp C_VOL_UP &kp HOME &kp PSCRN &kp PG_UP &kp SLCK &kp CAPS &trans &mt LCTRL EQUAL &kp KP_MULTIPLY &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &kp C_MUTE &kp LEFT &kp UP &kp RIGHT &kp INS &mt RCTRL K_APP &trans &kp KP_N0 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_DOT &kp C_VOL_DN &kp END &kp DOWN &kp PG_DN &kp PAUSE_BREAK &trans - &trans &trans &trans &trans &trans &trans + &trans &trans < ADJ RET < ADJ ESC &trans &trans >; }; adjust_layer { - display-name = "ADJ"; // ----------------------------------------------------------------------------------------- -// | RST | BLDR | STU | | | | | | | | | | STU | BLDR | RST | +// | RST | BLDR | | | | | | | | | | | | BLDR | RST | // | BTCLR| BT0 | BT1 | BT2 | BT3 | BT4 | | BT4 | BT3 | BT2 | BT1 | BT0 | BTCLR| -// | OUT | | | | | | | | | | | | OUT | +// | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &sys_reset &bootloader &studio_unlock &none &none &none &none &none &none &none &none &studio_unlock &bootloader &sys_reset - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR - &out OUT_TOG &none &none &none &none &none &none &none &none &none &none &out OUT_TOG - &trans &none &trans &trans &none &trans + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR + &none &none &none &none &none &none &none &none &none &none &none &none + &trans &none &trans &trans &none &trans >; }; }; diff --git a/app/boards/shields/jorne/jorne.zmk.yml b/app/boards/shields/jorne/jorne.zmk.yml index c2c63057..16efe2ae 100644 --- a/app/boards/shields/jorne/jorne.zmk.yml +++ b/app/boards/shields/jorne/jorne.zmk.yml @@ -9,7 +9,6 @@ features: - keys - display - underglow - - studio siblings: - jorne_left - jorne_right diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 6c4b3329..604f4816 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -6,7 +6,7 @@ #include "jorne.dtsi" -&jorne_transform { +&default_transform { col-offset = <6>; }; diff --git a/app/boards/shields/knob_goblin/Kconfig.defconfig b/app/boards/shields/knob_goblin/Kconfig.defconfig index 3f08e287..d8d468ed 100644 --- a/app/boards/shields/knob_goblin/Kconfig.defconfig +++ b/app/boards/shields/knob_goblin/Kconfig.defconfig @@ -14,6 +14,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -21,7 +24,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/knob_goblin/knob_goblin.conf b/app/boards/shields/knob_goblin/knob_goblin.conf index 23673a47..2eefae4d 100644 --- a/app/boards/shields/knob_goblin/knob_goblin.conf +++ b/app/boards/shields/knob_goblin/knob_goblin.conf @@ -6,4 +6,4 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y # Uncomment the following line to enable the Knob Goblin OLED Display -# CONFIG_ZMK_DISPLAY=y +CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/knob_goblin/knob_goblin.keymap b/app/boards/shields/knob_goblin/knob_goblin.keymap index 1879c235..8e4a7e66 100644 --- a/app/boards/shields/knob_goblin/knob_goblin.keymap +++ b/app/boards/shields/knob_goblin/knob_goblin.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &trans &kp EQUAL &kp KP_SLASH &kp KP_MULTIPLY &kp KP_MINUS @@ -27,7 +26,6 @@ }; num_layer { - display-name = "Num Layer"; bindings = < &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &kp HOME &trans &kp PAGE_UP &trans diff --git a/app/boards/shields/knob_goblin/knob_goblin.overlay b/app/boards/shields/knob_goblin/knob_goblin.overlay index c42482db..03051ce5 100644 --- a/app/boards/shields/knob_goblin/knob_goblin.overlay +++ b/app/boards/shields/knob_goblin/knob_goblin.overlay @@ -14,8 +14,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -37,6 +36,7 @@ top_encoder: encoder_top { compatible = "alps,ec11"; + label = "TOP_ENCODER"; a-gpios = <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; steps = <80>; @@ -45,6 +45,7 @@ bottom_encoder: encoder_bottom { compatible = "alps,ec11"; + label = "BOTTOM_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; steps = <80>; @@ -65,6 +66,7 @@ oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -74,7 +76,6 @@ segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 36e02963..2d162736 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -22,6 +22,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -29,7 +32,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/kyria/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/kyria/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/kyria/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/kyria/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay similarity index 97% rename from app/boards/shields/kyria/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay rename to app/boards/shields/kyria/boards/nrfmicro_11.overlay index dba8377e..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay similarity index 97% rename from app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay rename to app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index dba8377e..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay similarity index 97% rename from app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay rename to app/boards/shields/kyria/boards/nrfmicro_13.overlay index dba8377e..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/kyria/kyria-layouts.dtsi b/app/boards/shields/kyria/kyria-layouts.dtsi deleted file mode 100644 index 4c0c37e7..00000000 --- a/app/boards/shields/kyria/kyria-layouts.dtsi +++ /dev/null @@ -1,137 +0,0 @@ -#include - -/ { - splitkb_kyria_6col_layout: splitkb_kyria_6col_layout { - compatible = "zmk,physical-layout"; - display-name = "6 Column"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 75 0 0 0> - , <&key_physical_attrs 100 100 100 75 0 0 0> - , <&key_physical_attrs 100 100 200 25 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 25 0 0 0> - , <&key_physical_attrs 100 100 500 37 0 0 0> - , <&key_physical_attrs 100 100 1100 37 0 0 0> - , <&key_physical_attrs 100 100 1200 25 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 25 0 0 0> - , <&key_physical_attrs 100 100 1500 75 0 0 0> - , <&key_physical_attrs 100 100 1600 75 0 0 0> - , <&key_physical_attrs 100 100 0 175 0 0 0> - , <&key_physical_attrs 100 100 100 175 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 125 0 0 0> - , <&key_physical_attrs 100 100 500 137 0 0 0> - , <&key_physical_attrs 100 100 1100 137 0 0 0> - , <&key_physical_attrs 100 100 1200 125 0 0 0> - , <&key_physical_attrs 100 100 1300 100 0 0 0> - , <&key_physical_attrs 100 100 1400 125 0 0 0> - , <&key_physical_attrs 100 100 1500 175 0 0 0> - , <&key_physical_attrs 100 100 1600 175 0 0 0> - , <&key_physical_attrs 100 100 0 275 0 0 0> - , <&key_physical_attrs 100 100 100 275 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 225 0 0 0> - , <&key_physical_attrs 100 100 500 237 0 0 0> - , <&key_physical_attrs 100 100 350 225 3000 400 792> - , <&key_physical_attrs 100 100 350 225 4500 400 792> - , <&key_physical_attrs 100 100 1250 225 (-4500) 1300 792> - , <&key_physical_attrs 100 100 1250 225 (-3000) 1300 792> - , <&key_physical_attrs 100 100 1100 237 0 0 0> - , <&key_physical_attrs 100 100 1200 225 0 0 0> - , <&key_physical_attrs 100 100 1300 200 0 0 0> - , <&key_physical_attrs 100 100 1400 225 0 0 0> - , <&key_physical_attrs 100 100 1500 275 0 0 0> - , <&key_physical_attrs 100 100 1600 275 0 0 0> - , <&key_physical_attrs 100 100 250 325 0 0 0> - , <&key_physical_attrs 100 100 350 325 0 0 0> - , <&key_physical_attrs 100 100 350 325 1500 400 792> - , <&key_physical_attrs 100 100 350 325 3000 400 792> - , <&key_physical_attrs 100 100 350 325 4500 400 792> - , <&key_physical_attrs 100 100 1250 325 (-4500) 1300 792> - , <&key_physical_attrs 100 100 1250 325 (-3000) 1300 792> - , <&key_physical_attrs 100 100 1250 325 (-1500) 1300 792> - , <&key_physical_attrs 100 100 1250 325 0 0 0> - , <&key_physical_attrs 100 100 1350 325 0 0 0> - ; - }; - - splitkb_kyria_5col_layout: splitkb_kyria_5col_layout { - compatible = "zmk,physical-layout"; - display-name = "5 Column"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 75 0 0 0> - , <&key_physical_attrs 100 100 100 25 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 25 0 0 0> - , <&key_physical_attrs 100 100 400 37 0 0 0> - , <&key_physical_attrs 100 100 1000 37 0 0 0> - , <&key_physical_attrs 100 100 1100 25 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 25 0 0 0> - , <&key_physical_attrs 100 100 1400 75 0 0 0> - , <&key_physical_attrs 100 100 0 175 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 400 137 0 0 0> - , <&key_physical_attrs 100 100 1000 137 0 0 0> - , <&key_physical_attrs 100 100 1100 125 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 100 100 1300 125 0 0 0> - , <&key_physical_attrs 100 100 1400 175 0 0 0> - , <&key_physical_attrs 100 100 0 275 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 400 237 0 0 0> - , <&key_physical_attrs 100 100 250 225 3000 300 792> - , <&key_physical_attrs 100 100 250 225 4500 300 792> - , <&key_physical_attrs 100 100 1150 225 (-4500) 1200 792> - , <&key_physical_attrs 100 100 1150 225 (-3000) 1200 792> - , <&key_physical_attrs 100 100 1000 237 0 0 0> - , <&key_physical_attrs 100 100 1100 225 0 0 0> - , <&key_physical_attrs 100 100 1200 200 0 0 0> - , <&key_physical_attrs 100 100 1300 225 0 0 0> - , <&key_physical_attrs 100 100 1400 275 0 0 0> - , <&key_physical_attrs 100 100 150 325 0 0 0> - , <&key_physical_attrs 100 100 250 325 0 0 0> - , <&key_physical_attrs 100 100 250 325 1500 300 792> - , <&key_physical_attrs 100 100 250 325 3000 300 792> - , <&key_physical_attrs 100 100 250 325 4500 300 792> - , <&key_physical_attrs 100 100 1150 325 (-4500) 1200 792> - , <&key_physical_attrs 100 100 1150 325 (-3000) 1200 792> - , <&key_physical_attrs 100 100 1150 325 (-1500) 1200 792> - , <&key_physical_attrs 100 100 1150 325 0 0 0> - , <&key_physical_attrs 100 100 1250 325 0 0 0> - ; - }; - - splitkb_kyria_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - - twelve { - physical-layout = <&splitkb_kyria_6col_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39> - , < 40 41 42 43 44 45 46 47 48 49 >; - }; - - ten { - physical-layout = <&splitkb_kyria_5col_layout>; - positions - = <44 0 1 2 3 4 5 6 7 8 9 47> - , <45 10 11 12 13 14 15 16 17 18 19 48> - , <46 20 21 22 23 24 25 26 27 28 29 30 31 32 33 49> - , < 34 35 36 37 38 39 40 41 42 43 >; - }; - }; -}; diff --git a/app/boards/shields/kyria/kyria.conf b/app/boards/shields/kyria/kyria.conf index bb2b843d..7a0b5b6c 100644 --- a/app/boards/shields/kyria/kyria.conf +++ b/app/boards/shields/kyria/kyria.conf @@ -7,3 +7,4 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index 72814a9e..b98240e4 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -6,15 +6,11 @@ #include "kyria_common.dtsi" -&splitkb_kyria_6col_layout { - transform = <&default_transform>; -}; - -&splitkb_kyria_5col_layout { - transform = <&five_column_transform>; -}; - / { + chosen { + zmk,matrix_transform = &default_transform; + }; + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <16>; diff --git a/app/boards/shields/kyria/kyria.keymap b/app/boards/shields/kyria/kyria.keymap index fd601b89..a11c1325 100644 --- a/app/boards/shields/kyria/kyria.keymap +++ b/app/boards/shields/kyria/kyria.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | @@ -29,7 +28,6 @@ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; function_layer { - display-name = "Function Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | | // | | | |BTSEL3|BTSEL4| | | | | | | | | diff --git a/app/boards/shields/kyria/kyria.zmk.yml b/app/boards/shields/kyria/kyria.zmk.yml index ae63f5e7..95e6c3b7 100644 --- a/app/boards/shields/kyria/kyria.zmk.yml +++ b/app/boards/shields/kyria/kyria.zmk.yml @@ -10,7 +10,6 @@ features: - display - encoder - underglow - - studio siblings: - kyria_left - kyria_right diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index f2d7b9be..1056794d 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -6,30 +6,30 @@ #include -#include "kyria-layouts.dtsi" - / { chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,physical-layout = &splitkb_kyria_6col_layout; + zmk,matrix_transform = &default_transform; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; }; left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; steps = <80>; status = "disabled"; }; right_encoder: encoder_right { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; steps = <80>; status = "disabled"; }; @@ -49,6 +49,7 @@ oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <64>; segment-offset = <0>; @@ -56,6 +57,5 @@ display-offset = <0>; multiplex-ratio = <63>; prechargep = <0x22>; - inversion-on; }; }; diff --git a/app/boards/shields/kyria/kyria_rev2.conf b/app/boards/shields/kyria/kyria_rev2.conf index bb2b843d..7a0b5b6c 100644 --- a/app/boards/shields/kyria/kyria_rev2.conf +++ b/app/boards/shields/kyria/kyria_rev2.conf @@ -7,3 +7,4 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index c1c46bd1..e61131bf 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -6,15 +6,11 @@ #include "kyria_common.dtsi" -&splitkb_kyria_6col_layout { - transform = <&default_transform>; -}; - -&splitkb_kyria_5col_layout { - transform = <&five_column_transform>; -}; - / { + chosen { + zmk,matrix_transform = &default_transform; + }; + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <16>; diff --git a/app/boards/shields/kyria/kyria_rev2.keymap b/app/boards/shields/kyria/kyria_rev2.keymap index fd601b89..a11c1325 100644 --- a/app/boards/shields/kyria/kyria_rev2.keymap +++ b/app/boards/shields/kyria/kyria_rev2.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | @@ -29,7 +28,6 @@ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; function_layer { - display-name = "Function Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | | // | | | |BTSEL3|BTSEL4| | | | | | | | | diff --git a/app/boards/shields/kyria/kyria_rev3.conf b/app/boards/shields/kyria/kyria_rev3.conf index bb2b843d..7a0b5b6c 100644 --- a/app/boards/shields/kyria/kyria_rev3.conf +++ b/app/boards/shields/kyria/kyria_rev3.conf @@ -7,3 +7,4 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi index 33395871..0cf91c60 100644 --- a/app/boards/shields/kyria/kyria_rev3.dtsi +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -6,15 +6,11 @@ #include "kyria_common.dtsi" -&splitkb_kyria_6col_layout { - transform = <&default_transform>; -}; - -&splitkb_kyria_5col_layout { - status = "disabled"; -}; - / { + chosen { + zmk,matrix_transform = &default_transform; + }; + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <14>; @@ -33,11 +29,13 @@ }; &left_encoder { + resolution = <2>; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { + resolution = <2>; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap index aea8baf6..ac2fc044 100644 --- a/app/boards/shields/kyria/kyria_rev3.keymap +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -21,7 +21,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | @@ -37,7 +36,6 @@ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; function_layer { - display-name = "Function Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | | // | | | |BTSEL3|BTSEL4| | | | | | | | | diff --git a/app/boards/shields/kyria/kyria_rev3.zmk.yml b/app/boards/shields/kyria/kyria_rev3.zmk.yml index 9bb66e09..bf84c82c 100644 --- a/app/boards/shields/kyria/kyria_rev3.zmk.yml +++ b/app/boards/shields/kyria/kyria_rev3.zmk.yml @@ -10,7 +10,6 @@ features: - display - encoder - underglow - - studio siblings: - kyria_rev3_left - kyria_rev3_right diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index a3d95f63..046bd49a 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -34,6 +34,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -41,7 +44,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index c9c189b0..27d5e872 100644 --- a/app/boards/shields/leeloo/README.md +++ b/app/boards/shields/leeloo/README.md @@ -47,29 +47,29 @@ Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup) Build commands for the default keymap of Leeloo v1: ``` -west build -d build/left -p -b nice_nano -- -DSHIELD=leeloo_left -west build -d build/right -p -b nice_nano -- -DSHIELD=leeloo_right +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right ``` Build commands for the default keymap of Leeloo v2: ``` -west build -d build/left_v2 -p -b nice_nano -- -DSHIELD=leeloo_rev2_left -west build -d build/right_v2 -p -b nice_nano -- -DSHIELD=leeloo_rev2_right +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right ``` Build commands for your custom keymap of Leeloo v1: ``` -west build -d build/right -p -b nice_nano -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" -west build -d build/left -p -b nice_nano -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" ``` Build commands for your custom keymap of Leeloo v2: ``` -west build -d build/right_v2 -p -b nice_nano -- -DSHIELD=leeloo_rev2_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" -west build -d build/left_v2 -p -b nice_nano -- -DSHIELD=leeloo_rev2_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" ``` ## Building Leeloo's ZMK Firmware with nice!view Displays @@ -101,22 +101,22 @@ Save your changes and close the file. Build commands for the default keymap of Leeloo v1: ``` -west build -d build/left -p -b nice_nano -- -DSHIELD="leeloo_left nice_view_adapter nice_view" -west build -d build/right -p -b nice_nano -- -DSHIELD="leeloo_right nice_view_adapter nice_view" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_left nice_view_adapter nice_view" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_right nice_view_adapter nice_view" ``` Build commands for the default keymap of Leeloo v2: ``` -west build -d build/left_v2 -p -b nice_nano -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" -west build -d build/right_v2 -p -b nice_nano -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" ``` Build commands for your custom keymap of Leeloo v2: ``` -west build -d build/left -p -b nice_nano -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" -west build -d build/right -p -b nice_nano -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" ``` # Support diff --git a/app/boards/shields/leeloo/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..5c451b73 --- /dev/null +++ b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <37>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.keymap b/app/boards/shields/leeloo/leeloo.keymap index 79a1ce0e..bdbf8988 100644 --- a/app/boards/shields/leeloo/leeloo.keymap +++ b/app/boards/shields/leeloo/leeloo.keymap @@ -25,10 +25,10 @@ compatible = "zmk,keymap"; default_layer { - display-name = " QWERTY"; + label = " QWERTY"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH -&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp LGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL @@ -38,7 +38,7 @@ }; lower_layer { - display-name = " Lower"; + label = " Lower"; bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12 @@ -51,7 +51,7 @@ }; raise_layer { - display-name = " Raise"; + label = " Raise"; bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader @@ -64,4 +64,4 @@ }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_common.dtsi b/app/boards/shields/leeloo/leeloo_common.dtsi index 8ae5b064..ef775cfb 100644 --- a/app/boards/shields/leeloo/leeloo_common.dtsi +++ b/app/boards/shields/leeloo/leeloo_common.dtsi @@ -9,7 +9,7 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -32,7 +32,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; @@ -47,6 +47,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) left_encoder: left_encoder { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <120>; @@ -55,13 +56,14 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) right_encoder: right_encoder { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <120>; status = "disabled"; }; - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; triggers-per-rotation = <30>; @@ -75,6 +77,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -84,7 +87,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/leeloo/leeloo_rev2.conf b/app/boards/shields/leeloo/leeloo_rev2.conf index 35b12c2d..8c1cf3ee 100644 --- a/app/boards/shields/leeloo/leeloo_rev2.conf +++ b/app/boards/shields/leeloo/leeloo_rev2.conf @@ -14,6 +14,9 @@ # Uncomment the following line to enable per-key lighting # CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +# CONFIG_WS2812_STRIP=y + # Keep OLED or nice!view Displays on even when toggling off LEDs # Change to y if you wish to toggle Displays on and off with LEDs # CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n @@ -37,4 +40,4 @@ # Uncomment if you are experiencing connectivity issues; this # configuration item boosts the BLE transmit power. -# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y +# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.keymap b/app/boards/shields/leeloo/leeloo_rev2.keymap index 59d72866..a66205b6 100644 --- a/app/boards/shields/leeloo/leeloo_rev2.keymap +++ b/app/boards/shields/leeloo/leeloo_rev2.keymap @@ -37,10 +37,10 @@ compatible = "zmk,keymap"; default_layer { - display-name = " QWERTY"; + label = " QWERTY"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH -&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp RGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL @@ -50,7 +50,7 @@ }; lower_layer { - display-name = " Lower"; + label = " Lower"; bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12 @@ -63,7 +63,7 @@ }; raise_layer { - display-name = " Raise"; + label = " Raise"; bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader @@ -76,4 +76,4 @@ RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &tr }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/Kconfig.defconfig b/app/boards/shields/leeloo_micro/Kconfig.defconfig index 8af3214d..26256120 100644 --- a/app/boards/shields/leeloo_micro/Kconfig.defconfig +++ b/app/boards/shields/leeloo_micro/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/leeloo_micro/README.md b/app/boards/shields/leeloo_micro/README.md index 3471a35b..c1827f82 100644 --- a/app/boards/shields/leeloo_micro/README.md +++ b/app/boards/shields/leeloo_micro/README.md @@ -30,15 +30,15 @@ Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup) Build commands for the default keymap of Leeloo-Micro: ``` -west build -d build/left -p -b nice_nano -- -DSHIELD=leeloo_micro_left -west build -d build/right -p -b nice_nano -- -DSHIELD=leeloo_micro_right +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right ``` Build commands for your custom keymap of Leeloo-Micro: ``` -west build -d build/right -p -b nice_nano -- -DSHIELD=leeloo_micro_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" -west build -d build/left -p -b nice_nano -- -DSHIELD=leeloo_micro_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" ``` ## Building Leeloo-Micro's ZMK Firmware with nice!view Displays @@ -70,15 +70,15 @@ Save your changes and close the file. Build commands for the default keymap of Leeloo-Micro: ``` -west build -d build/left -p -b nice_nano -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" -west build -d build/right -p -b nice_nano -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" ``` Build commands for your custom keymap of Leeloo-Micro: ``` -west build -d build/left -p -b nice_nano -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" -west build -d build/right -p -b nice_nano -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" ``` # Support diff --git a/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..be5dc54e --- /dev/null +++ b/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <20>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.conf b/app/boards/shields/leeloo_micro/leeloo_micro.conf index deba268a..02c1d605 100644 --- a/app/boards/shields/leeloo_micro/leeloo_micro.conf +++ b/app/boards/shields/leeloo_micro/leeloo_micro.conf @@ -14,6 +14,9 @@ # Uncomment the following line to enable per-key lighting # CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +# CONFIG_WS2812_STRIP=y + # Keep OLED or nice!view Displays on even when toggling off LEDs # Change to y if you wish to toggle Displays on and off with LEDs # CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n @@ -32,4 +35,4 @@ # Uncomment these two lines to add support for encoders # CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.dtsi b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi index f2339653..ab68a615 100644 --- a/app/boards/shields/leeloo_micro/leeloo_micro.dtsi +++ b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi @@ -9,7 +9,7 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -31,7 +31,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; @@ -45,6 +45,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) left_encoder: left_encoder { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "disabled"; @@ -53,13 +54,14 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) right_encoder: right_encoder { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "disabled"; steps = <60>; }; - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; triggers-per-rotation = <30>; @@ -73,6 +75,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -82,7 +85,6 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.keymap b/app/boards/shields/leeloo_micro/leeloo_micro.keymap index e6821991..8526f5ac 100644 --- a/app/boards/shields/leeloo_micro/leeloo_micro.keymap +++ b/app/boards/shields/leeloo_micro/leeloo_micro.keymap @@ -73,11 +73,11 @@ compatible = "zmk,keymap"; default_layer { - display-name = " QWERTY"; + label = " QWERTY"; bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI -&mt LSHFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH +&mt LSFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSFT FSLH &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &mo QC_B >; @@ -85,10 +85,10 @@ }; lower_layer { - display-name = " Lower"; + label = " Lower"; bindings = < &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 -&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp SQT +&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp QUOT &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp RSHFT &trans &trans &trans &trans &trans &trans &trans &trans >; @@ -97,11 +97,11 @@ }; raise_layer { - display-name = " Raise"; + label = " Raise"; bindings = < &kp TAB &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &kp BSLH &kp CAPS &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp GRAVE -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSHFT TILDE +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSFT TILDE &trans &trans &trans &trans &trans &trans &kp DEL &trans >; @@ -109,7 +109,7 @@ }; adjust_layer { - display-name = " Adjust"; + label = " Adjust"; bindings = < &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &trans &trans &trans &trans @@ -122,7 +122,7 @@ }; numpad_layer { - display-name = " NumPad"; + label = " NumPad"; bindings = < &trans &none &none &none &none &kp SLASH &kp N7 &kp N8 &kp N9 &kp MINUS @@ -135,7 +135,7 @@ RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &no }; ble_layer { - display-name = " BLE"; + label = " BLE"; bindings = < &bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 &bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index 169a6ad7..e77a9c22 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -22,6 +22,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -29,7 +32,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/lily58/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/lily58/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/lily58/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 195ab2b7..eb427a58 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -6,13 +6,11 @@ #include -#include - / { chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,physical-layout = &kata0510_lily58_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -35,7 +33,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -50,6 +48,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -62,16 +61,13 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) }; }; -&kata0510_lily58_layout { - transform = <&default_transform>; -}; - &pro_micro_i2c { status = "okay"; oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -81,7 +77,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/lily58/lily58.keymap b/app/boards/shields/lily58/lily58.keymap index 502f7be3..7df3277f 100644 --- a/app/boards/shields/lily58/lily58.keymap +++ b/app/boards/shields/lily58/lily58.keymap @@ -14,7 +14,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | @@ -33,7 +32,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -41,10 +39,10 @@ // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans -&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 -&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp TILDE -&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE +&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans >; @@ -52,7 +50,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | diff --git a/app/boards/shields/lily58/lily58.zmk.yml b/app/boards/shields/lily58/lily58.zmk.yml index b5be126a..65069a13 100644 --- a/app/boards/shields/lily58/lily58.zmk.yml +++ b/app/boards/shields/lily58/lily58.zmk.yml @@ -8,7 +8,6 @@ exposes: [i2c_oled] features: - keys - display - - studio siblings: - lily58_left - lily58_right diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 984095c7..62695c20 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/lotus58/lotus58-layouts.dtsi b/app/boards/shields/lotus58/lotus58-layouts.dtsi deleted file mode 100644 index 397cfc51..00000000 --- a/app/boards/shields/lotus58/lotus58-layouts.dtsi +++ /dev/null @@ -1,71 +0,0 @@ -#include - -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 50 0 0 0> - , <&key_physical_attrs 100 100 100 37 0 0 0> - , <&key_physical_attrs 100 100 200 12 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 12 0 0 0> - , <&key_physical_attrs 100 100 500 25 0 0 0> - , <&key_physical_attrs 100 100 1050 25 0 0 0> - , <&key_physical_attrs 100 100 1150 12 0 0 0> - , <&key_physical_attrs 100 100 1250 0 0 0 0> - , <&key_physical_attrs 100 100 1350 12 0 0 0> - , <&key_physical_attrs 100 100 1450 37 0 0 0> - , <&key_physical_attrs 100 100 1550 50 0 0 0> - , <&key_physical_attrs 100 100 0 150 0 0 0> - , <&key_physical_attrs 100 100 100 137 0 0 0> - , <&key_physical_attrs 100 100 200 112 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 112 0 0 0> - , <&key_physical_attrs 100 100 500 125 0 0 0> - , <&key_physical_attrs 100 100 1050 125 0 0 0> - , <&key_physical_attrs 100 100 1150 112 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 100 100 1350 112 0 0 0> - , <&key_physical_attrs 100 100 1450 137 0 0 0> - , <&key_physical_attrs 100 100 1550 150 0 0 0> - , <&key_physical_attrs 100 100 0 250 0 0 0> - , <&key_physical_attrs 100 100 100 237 0 0 0> - , <&key_physical_attrs 100 100 200 212 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 212 0 0 0> - , <&key_physical_attrs 100 100 500 225 0 0 0> - , <&key_physical_attrs 100 100 625 75 0 0 0> - , <&key_physical_attrs 100 100 925 75 0 0 0> - , <&key_physical_attrs 100 100 1050 225 0 0 0> - , <&key_physical_attrs 100 100 1150 212 0 0 0> - , <&key_physical_attrs 100 100 1250 200 0 0 0> - , <&key_physical_attrs 100 100 1350 212 0 0 0> - , <&key_physical_attrs 100 100 1450 237 0 0 0> - , <&key_physical_attrs 100 100 1550 250 0 0 0> - , <&key_physical_attrs 100 100 0 350 0 0 0> - , <&key_physical_attrs 100 100 100 337 0 0 0> - , <&key_physical_attrs 100 100 200 312 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 312 0 0 0> - , <&key_physical_attrs 100 100 500 325 0 0 0> - , <&key_physical_attrs 100 100 625 275 0 0 0> - , <&key_physical_attrs 100 100 925 275 0 0 0> - , <&key_physical_attrs 100 100 1050 325 0 0 0> - , <&key_physical_attrs 100 100 1150 312 0 0 0> - , <&key_physical_attrs 100 100 1250 300 0 0 0> - , <&key_physical_attrs 100 100 1350 312 0 0 0> - , <&key_physical_attrs 100 100 1450 337 0 0 0> - , <&key_physical_attrs 100 100 1550 350 0 0 0> - , <&key_physical_attrs 100 100 250 412 0 0 0> - , <&key_physical_attrs 100 100 350 415 0 0 0> - , <&key_physical_attrs 100 100 450 425 0 0 0> - , <&key_physical_attrs 100 150 575 400 3000 625 475> - , <&key_physical_attrs 100 150 975 400 (-3000) 1025 475> - , <&key_physical_attrs 100 100 1100 425 0 0 0> - , <&key_physical_attrs 100 100 1200 415 0 0 0> - , <&key_physical_attrs 100 100 1300 415 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/lotus58/lotus58.dtsi b/app/boards/shields/lotus58/lotus58.dtsi index 87c2670f..8b1c66f9 100644 --- a/app/boards/shields/lotus58/lotus58.dtsi +++ b/app/boards/shields/lotus58/lotus58.dtsi @@ -6,19 +6,17 @@ #include -#include "lotus58-layouts.dtsi" - / { chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <16>; - rows = <5>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | SW30 | | SW30 | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | @@ -35,7 +33,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -49,6 +47,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -57,6 +56,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 right_encoder: encoder_right { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -70,16 +70,13 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 }; }; -&physical_layout0 { - transform = <&default_transform>; -}; - &pro_micro_i2c { status = "okay"; oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -89,7 +86,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index 21a76955..fae463c9 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -23,18 +23,21 @@ behaviors { fofunc: four_ffour { compatible = "zmk,behavior-mod-morph"; + label = "FOUR_FUNCFOUR"; #binding-cells = <0>; bindings = <&kp N4>, <&kp F4>; mods = <(MOD_LALT|MOD_RALT)>; }; sleft: s_left { compatible = "zmk,behavior-mod-morph"; + label = "S_LEFT"; #binding-cells = <0>; bindings = <&kp S>, <&kp LEFT>; mods = <(MOD_LGUI|MOD_RGUI)>; }; fright: f_right { compatible = "zmk,behavior-mod-morph"; + label = "R_RIGHT"; #binding-cells = <0>; bindings = <&kp F>, <&kp RIGHT>; mods = <(MOD_LGUI|MOD_RGUI)>; @@ -45,7 +48,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // 0| ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | 11 // 12| TAB | Q | W | E | R | T | | Y | U | I | O | P | [ | 23 @@ -64,7 +66,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | ` | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | // | | ! | HOME| ^ | END | % | | VOL^ | PGUP | INS | ^ | PSCR | - | @@ -83,7 +84,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // |BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | |OUTTOG|OUTUSB| OUTBT | | RESET | FLASH | // | | INS | PSCR | GUI | RESET | | | PGUP | | ^ | | | | diff --git a/app/boards/shields/lotus58/lotus58.zmk.yml b/app/boards/shields/lotus58/lotus58.zmk.yml index 65323c2f..5cabbd0e 100644 --- a/app/boards/shields/lotus58/lotus58.zmk.yml +++ b/app/boards/shields/lotus58/lotus58.zmk.yml @@ -9,7 +9,6 @@ features: - keys - display - encoder - - studio siblings: - lotus58_left - lotus58_right diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index 7fa07bbb..8daa6b7c 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -13,9 +13,8 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------ -// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | +// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | @@ -31,7 +30,6 @@ }; fn_layer { - display-name = "Fn Layer"; bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader &trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset diff --git a/app/boards/shields/m60/m60.overlay b/app/boards/shields/m60/m60.overlay index 15690f52..a2ab2593 100644 --- a/app/boards/shields/m60/m60.overlay +++ b/app/boards/shields/m60/m60.overlay @@ -6,17 +6,15 @@ #include -#include - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &layout_60_ansi; + zmk,matrix_transform = &default_transform; }; kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -60,6 +58,3 @@ RC(6,5) RC(6,6) RC(6,7) RC(7,0) RC(7 }; }; -&layout_60_ansi { - transform = <&default_transform>; -}; diff --git a/app/boards/shields/m60/m60.zmk.yml b/app/boards/shields/m60/m60.zmk.yml index 294769df..8050df45 100644 --- a/app/boards/shields/m60/m60.zmk.yml +++ b/app/boards/shields/m60/m60.zmk.yml @@ -6,4 +6,3 @@ url: https://makerdiary.com/pages/m60-mechanical-keyboard requires: [makerdiary_nrf52840_m2] features: - keys - - studio diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 3737b83f..e355c641 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/microdox/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/microdox/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/microdox/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/microdox/microdox.conf b/app/boards/shields/microdox/microdox.conf index b5df29aa..0d38398c 100644 --- a/app/boards/shields/microdox/microdox.conf +++ b/app/boards/shields/microdox/microdox.conf @@ -1,5 +1,6 @@ # Uncomment the following lines to enable the Microdox RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # Uncomment the following line to enable the Microdox OLED Display # CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index 65c670f0..57247e68 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -9,7 +9,7 @@ / { kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/microdox/microdox.keymap b/app/boards/shields/microdox/microdox.keymap index 2ebc7a48..c9298ff8 100644 --- a/app/boards/shields/microdox/microdox.keymap +++ b/app/boards/shields/microdox/microdox.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ----------------------------------------------------------------------------------------- // | Q | W | E | R | T | | Y | U | I | O | P | // | A | S | D | F | G | | H | J | K | L | ; | @@ -27,10 +26,9 @@ >; }; nav_layer { - display-name = "Nav Layer"; // ----------------------------------------------------------------------------------------- // |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL | -// | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BSPC | +// | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BKSP | // | BT2 | | | | | | \ | ENT | | | | // | | | | | | | | bindings = < @@ -42,16 +40,15 @@ }; sym_layer { - display-name = "Sym Layer"; // ----------------------------------------------------------------------------------------- // | ! | @ | # | $ | % | | ^ | & | * | ( | ) | // | | | | | | | - | = | { | } | "|" | // | | | | | | | _ | + | [ | ] | \ | // | GUI | | SPC | | ENT | | ALT | bindings = < - &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR - &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp PIPE - &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp BSLH + &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR + &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp PIPE + &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp BSLH &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -59,7 +56,6 @@ // This layer is unreachable until "tri layer state" is sorted out. // Leaving it here for completeness. num_layer { - display-name = "Num Layer"; // ----------------------------------------------------------------------------------------- // | | | | | | | A | 7 | 8 | 9 | D | // | | | | | | | B | 4 | 5 | 6 | E | diff --git a/app/boards/shields/microdox/microdox_common.dtsi b/app/boards/shields/microdox/microdox_common.dtsi index ed190fcb..0460e012 100644 --- a/app/boards/shields/microdox/microdox_common.dtsi +++ b/app/boards/shields/microdox/microdox_common.dtsi @@ -10,7 +10,7 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; @@ -38,6 +38,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -45,7 +46,6 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) display-offset = <0>; multiplex-ratio = <31>; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/microdox/microdox_v2.conf b/app/boards/shields/microdox/microdox_v2.conf index b5df29aa..0d38398c 100644 --- a/app/boards/shields/microdox/microdox_v2.conf +++ b/app/boards/shields/microdox/microdox_v2.conf @@ -1,5 +1,6 @@ # Uncomment the following lines to enable the Microdox RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # Uncomment the following line to enable the Microdox OLED Display # CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/microdox/microdox_v2.dtsi b/app/boards/shields/microdox/microdox_v2.dtsi index 95aaf79d..93fa4445 100644 --- a/app/boards/shields/microdox/microdox_v2.dtsi +++ b/app/boards/shields/microdox/microdox_v2.dtsi @@ -9,7 +9,7 @@ / { kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; }; }; diff --git a/app/boards/shields/minivan_studio_tester/Kconfig.defconfig b/app/boards/shields/minivan_studio_tester/Kconfig.defconfig deleted file mode 100644 index d6dd3d50..00000000 --- a/app/boards/shields/minivan_studio_tester/Kconfig.defconfig +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if SHIELD_MINIVAN_STUDIO_TESTER - -config ZMK_KEYBOARD_NAME - default "MiniVan Tester" - -endif diff --git a/app/boards/shields/minivan_studio_tester/Kconfig.shield b/app/boards/shields/minivan_studio_tester/Kconfig.shield deleted file mode 100644 index 787d46f8..00000000 --- a/app/boards/shields/minivan_studio_tester/Kconfig.shield +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config SHIELD_MINIVAN_STUDIO_TESTER - def_bool $(shields_list_contains,minivan_studio_tester) - select ZMK_STUDIO - select UART_NATIVE_POSIX_PORT_1_ENABLE - select CBPRINTF_LIBC_SUBSTS - select ZMK_STUDIO_TRANSPORT_UART diff --git a/app/boards/shields/minivan_studio_tester/minivan_studio_tester.conf b/app/boards/shields/minivan_studio_tester/minivan_studio_tester.conf deleted file mode 100644 index a771e5f7..00000000 --- a/app/boards/shields/minivan_studio_tester/minivan_studio_tester.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_ZMK_STUDIO_LOCKING=n \ No newline at end of file diff --git a/app/boards/shields/minivan_studio_tester/minivan_studio_tester.keymap b/app/boards/shields/minivan_studio_tester/minivan_studio_tester.keymap deleted file mode 100644 index a9a77260..00000000 --- a/app/boards/shields/minivan_studio_tester/minivan_studio_tester.keymap +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define ZMK_BEHAVIORS_KEEP_ALL - -#include -#include - -#define NAV_L 1 -#define NUM_L 2 -#define MED_L 3 -#define FUN_L 4 - -/ { - keymap { - compatible = "zmk,keymap"; - - base_layer { - display-name = "Base"; - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BKSP - &gresc &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp QUOT - &kp LGUI &kp LALT &mo NAV_L &kp LEFT_SHIFT &kp SPACE &mo NUM_L &kp LALT &kp RCTL - >; - }; - - nav_layer { - display-name = "Nav"; - bindings = < -&trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp TILDE &trans &trans &kp DEL -&trans &trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp UARW &kp RARW &trans -&trans &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &trans -&trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - - num_layer { - display-name = "Num"; - bindings = < -&trans &trans &kp N7 &kp N8 &kp N9 &kp RBKT &trans &trans &trans &trans &trans &trans -&trans &kp MINUS &kp N4 &kp N5 &kp N6 &kp EQUAL &trans &trans &trans &trans &trans &trans -&kp PLUS &kp N1 &kp N2 &kp N3 &kp N0 &trans &trans &trans &trans &trans &trans &trans -&trans &trans &trans &trans &trans &kp ESC &trans &trans - >; - }; - - med_layer { - display-name = "Sym"; - bindings = < -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - }; -}; diff --git a/app/boards/shields/minivan_studio_tester/minivan_studio_tester.overlay b/app/boards/shields/minivan_studio_tester/minivan_studio_tester.overlay deleted file mode 100644 index c1ec25d7..00000000 --- a/app/boards/shields/minivan_studio_tester/minivan_studio_tester.overlay +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -&kscan { - /delete-property/ exit-after; - events = <>; -}; - -&uart1 { status = "okay"; }; - -/ { - chosen { - zmk,physical-layout = &standard_layout; - zmk,studio-rpc-uart = &uart1; - }; - - standard_transform: standard_transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <12>; - - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0) - RC(6,0) RC(6,1) RC(6,3) RC(6,4) RC(6,5) RC(7,3) RC(7,2) RC(7,0) - >; - }; - - arrows_transform: arrows_transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <12>; - - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0) - RC(6,0) RC(6,1) RC(6,3) RC(6,4) RC(6,5) RC(7,3) RC(7,2) RC(7,1) RC(7,0) - >; - }; - - southpaw_transform: southpaw_transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <12>; - - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0) - RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) RC(7,3) RC(7,2) RC(7,0) - >; - }; - - jetvan_transform: jetvan_transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <12>; - - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0) - RC(6,0) RC(6,1) RC(6,2) RC(6,4) RC(7,3) RC(7,2) RC(7,0) - >; - }; - - standard_layout: standard_layout { - compatible = "zmk,physical-layout"; - display-name = "Standard"; - - transform = <&standard_transform>; - kscan = <&kscan>; - - keys - = <&key_physical_attrs 100 100 000 000 0 0 0> - , <&key_physical_attrs 100 100 100 000 0 0 0> - , <&key_physical_attrs 100 100 200 000 0 0 0> - , <&key_physical_attrs 100 100 300 000 0 0 0> - , <&key_physical_attrs 100 100 400 000 0 0 0> - , <&key_physical_attrs 100 100 500 000 0 0 0> - , <&key_physical_attrs 100 100 600 000 0 0 0> - , <&key_physical_attrs 100 100 700 000 0 0 0> - , <&key_physical_attrs 100 100 800 000 0 0 0> - , <&key_physical_attrs 100 100 900 000 0 0 0> - , <&key_physical_attrs 100 100 1000 000 0 0 0> - , <&key_physical_attrs 175 100 1100 000 0 0 0> - - , <&key_physical_attrs 125 100 000 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - , <&key_physical_attrs 100 100 1025 100 0 0 0> - , <&key_physical_attrs 150 100 1125 100 0 0 0> - - , <&key_physical_attrs 175 100 000 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - - , <&key_physical_attrs 125 100 000 300 0 0 0> - , <&key_physical_attrs 150 100 125 300 0 0 0> - , <&key_physical_attrs 125 100 275 300 0 0 0> - , <&key_physical_attrs 225 100 400 300 0 0 0> - , <&key_physical_attrs 200 100 625 300 0 0 0> - , <&key_physical_attrs 125 100 825 300 0 0 0> - , <&key_physical_attrs 150 100 950 300 0 0 0> - , <&key_physical_attrs 175 100 1100 300 0 0 0> - ; - }; - - southpaw_layout: southpaw_layout { - compatible = "zmk,physical-layout"; - display-name = "Southpaw"; - - transform = <&southpaw_transform>; - kscan = <&kscan>; - - keys - = <&key_physical_attrs 100 100 000 000 0 0 0> - , <&key_physical_attrs 100 100 100 000 0 0 0> - , <&key_physical_attrs 100 100 200 000 0 0 0> - , <&key_physical_attrs 100 100 300 000 0 0 0> - , <&key_physical_attrs 100 100 400 000 0 0 0> - , <&key_physical_attrs 100 100 500 000 0 0 0> - , <&key_physical_attrs 100 100 600 000 0 0 0> - , <&key_physical_attrs 100 100 700 000 0 0 0> - , <&key_physical_attrs 100 100 800 000 0 0 0> - , <&key_physical_attrs 100 100 900 000 0 0 0> - , <&key_physical_attrs 100 100 1000 000 0 0 0> - , <&key_physical_attrs 175 100 1100 000 0 0 0> - - , <&key_physical_attrs 125 100 000 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - , <&key_physical_attrs 100 100 1025 100 0 0 0> - , <&key_physical_attrs 150 100 1125 100 0 0 0> - - , <&key_physical_attrs 175 100 000 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - - , <&key_physical_attrs 100 100 000 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 225 100 400 300 0 0 0> - , <&key_physical_attrs 200 100 625 300 0 0 0> - , <&key_physical_attrs 125 100 825 300 0 0 0> - , <&key_physical_attrs 150 100 950 300 0 0 0> - , <&key_physical_attrs 175 100 1100 300 0 0 0> - ; - }; - - arrows_layout: arrows_layout { - compatible = "zmk,physical-layout"; - display-name = "Arrows"; - - transform = <&arrows_transform>; - kscan = <&kscan>; - - keys - = <&key_physical_attrs 100 100 000 000 0 0 0> - , <&key_physical_attrs 100 100 100 000 0 0 0> - , <&key_physical_attrs 100 100 200 000 0 0 0> - , <&key_physical_attrs 100 100 300 000 0 0 0> - , <&key_physical_attrs 100 100 400 000 0 0 0> - , <&key_physical_attrs 100 100 500 000 0 0 0> - , <&key_physical_attrs 100 100 600 000 0 0 0> - , <&key_physical_attrs 100 100 700 000 0 0 0> - , <&key_physical_attrs 100 100 800 000 0 0 0> - , <&key_physical_attrs 100 100 900 000 0 0 0> - , <&key_physical_attrs 100 100 1000 000 0 0 0> - , <&key_physical_attrs 175 100 1100 000 0 0 0> - - , <&key_physical_attrs 125 100 000 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - , <&key_physical_attrs 100 100 1025 100 0 0 0> - , <&key_physical_attrs 150 100 1125 100 0 0 0> - - , <&key_physical_attrs 175 100 000 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - - , <&key_physical_attrs 125 100 000 300 0 0 0> - , <&key_physical_attrs 150 100 125 300 0 0 0> - , <&key_physical_attrs 125 100 275 300 0 0 0> - , <&key_physical_attrs 225 100 400 300 0 0 0> - , <&key_physical_attrs 200 100 625 300 0 0 0> - , <&key_physical_attrs 150 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 975 300 0 0 0> - , <&key_physical_attrs 100 100 1075 300 0 0 0> - , <&key_physical_attrs 100 100 1175 300 0 0 0> - ; - }; - - jetvan_layout: jetvan_layout { - compatible = "zmk,physical-layout"; - display-name = "JetVan"; - - transform = <&jetvan_transform>; - kscan = <&kscan>; - - keys - = <&key_physical_attrs 100 100 000 000 0 0 0> - , <&key_physical_attrs 100 100 100 000 0 0 0> - , <&key_physical_attrs 100 100 200 000 0 0 0> - , <&key_physical_attrs 100 100 300 000 0 0 0> - , <&key_physical_attrs 100 100 400 000 0 0 0> - , <&key_physical_attrs 100 100 500 000 0 0 0> - , <&key_physical_attrs 100 100 600 000 0 0 0> - , <&key_physical_attrs 100 100 700 000 0 0 0> - , <&key_physical_attrs 100 100 800 000 0 0 0> - , <&key_physical_attrs 100 100 900 000 0 0 0> - , <&key_physical_attrs 100 100 1000 000 0 0 0> - , <&key_physical_attrs 175 100 1100 000 0 0 0> - - , <&key_physical_attrs 125 100 000 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - , <&key_physical_attrs 100 100 1025 100 0 0 0> - , <&key_physical_attrs 150 100 1125 100 0 0 0> - - , <&key_physical_attrs 175 100 000 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - - , <&key_physical_attrs 125 100 000 300 0 0 0> - , <&key_physical_attrs 100 100 125 300 0 0 0> - , <&key_physical_attrs 125 100 225 300 0 0 0> - , <&key_physical_attrs 625 100 350 300 0 0 0> - , <&key_physical_attrs 100 100 975 300 0 0 0> - , <&key_physical_attrs 100 100 1075 300 0 0 0> - , <&key_physical_attrs 100 100 1175 300 0 0 0> - ; - }; - - pos_map { - compatible = "zmk,physical-layout-position-map"; - std { - physical-layout = <&standard_layout>; - positions - = < 36 37 38 39 40 41 42 43 44 >; - }; - - arrows { - physical-layout = <&arrows_layout>; - positions - = < 36 37 38 39 40 42 43 44 41>; - }; - - southpaw { - physical-layout = <&southpaw_layout>; - positions - = < 36 37 39 40 41 42 43 44 38>; - }; - - jetvan { - physical-layout = <&jetvan_layout>; - positions - = < 36 37 38 43 39 40 41 42 44>; - }; - - }; -}; diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 9d80a139..80e65351 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -14,6 +14,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -21,7 +24,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/murphpad/boards/nice_nano.conf b/app/boards/shields/murphpad/boards/nice_nano.conf new file mode 100644 index 00000000..dda71c13 --- /dev/null +++ b/app/boards/shields/murphpad/boards/nice_nano.conf @@ -0,0 +1,3 @@ +# Uncomment both to enable underglow +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/murphpad/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay similarity index 91% rename from app/boards/shields/murphpad/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/murphpad/boards/nice_nano.overlay index 21bb17b0..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -25,13 +25,14 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of SMD LED footprints on PCB */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..ac6c51d5 --- /dev/null +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/murphpad/murphpad-layout.dtsi b/app/boards/shields/murphpad/murphpad-layout.dtsi deleted file mode 100644 index 0ea18d8a..00000000 --- a/app/boards/shields/murphpad/murphpad-layout.dtsi +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - chosen { - zmk,physical-layout = &all_1u_layout; - }; - - all_1u_layout: keymap_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - transform = <&all_1u_transform>; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 0 275 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 400 400 0 0 0> - , <&key_physical_attrs 100 100 0 500 0 0 0> - , <&key_physical_attrs 100 100 100 500 0 0 0> - , <&key_physical_attrs 100 100 200 500 0 0 0> - , <&key_physical_attrs 100 100 300 500 0 0 0> - , <&key_physical_attrs 100 100 400 500 0 0 0> - , <&key_physical_attrs 100 100 100 700 0 0 0> - , <&key_physical_attrs 100 100 200 700 0 0 0> - , <&key_physical_attrs 100 100 300 700 0 0 0> - ; - - }; - - right_numpad_layout: keymap_layout_1 { - compatible = "zmk,physical-layout"; - display-name = "Right Numpad"; - - transform = <&right_numpad_transform>; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 200 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 0 275 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 200 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 400 400 0 0 0> - , <&key_physical_attrs 100 100 0 500 0 0 0> - , <&key_physical_attrs 100 100 200 500 0 0 0> - , <&key_physical_attrs 200 100 300 500 0 0 0> - , <&key_physical_attrs 100 100 100 700 0 0 0> - , <&key_physical_attrs 100 100 200 700 0 0 0> - , <&key_physical_attrs 100 100 300 700 0 0 0> - ; - - }; - - left_numpad_layout: keymap_layout_2 { - compatible = "zmk,physical-layout"; - display-name = "Left Numpad"; - - transform = <&left_numpad_transform>; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 200 400 200 0 0 0> - , <&key_physical_attrs 100 100 0 275 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 200 400 400 0 0 0> - , <&key_physical_attrs 100 100 0 500 0 0 0> - , <&key_physical_attrs 200 100 100 500 0 0 0> - , <&key_physical_attrs 100 100 300 500 0 0 0> - , <&key_physical_attrs 100 100 100 700 0 0 0> - , <&key_physical_attrs 100 100 200 700 0 0 0> - , <&key_physical_attrs 100 100 300 700 0 0 0> - ; - }; - - position_map { - compatible = "zmk,physical-layout-position-map"; - all_1u_map { - physical-layout = <&all_1u_layout>; - positions - = <11 21 23 25 22 17 18 19 20 13 14 15 8 9 10 27> - , <28 29 16 26 24> - ; - }; - - right_numpad_map { - physical-layout = <&right_numpad_layout>; - positions - = < 8 17 23 22 21 16 18 19 20 13 14 15 9 10 11 24> - , <25 26 27 28 29> - ; - }; - - left_numpad_map { - physical-layout = <&left_numpad_layout>; - positions - = <11 20 22 23 21 16 17 18 19 13 14 15 8 9 10 24> - , <25 26 27 28 29> - ; - }; - }; -}; diff --git a/app/boards/shields/murphpad/murphpad.conf b/app/boards/shields/murphpad/murphpad.conf index c954a946..bdcd4255 100644 --- a/app/boards/shields/murphpad/murphpad.conf +++ b/app/boards/shields/murphpad/murphpad.conf @@ -1,14 +1,9 @@ -# To enable logging, use the snippet per the documentation. -# Delaying log output may help catch issues close to startup. Uncomment and adjust if necessary (default is 1000ms) -#CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS=3000 +# Uncomment to turn on logging, and set ZMK logging to debug output +# CONFIG_ZMK_USB_LOGGING=y -# Uncomment both to enable encoder(s) +# Uncomment both to enable encoder CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y # Uncomment to enable OLED -#CONFIG_ZMK_DISPLAY=y - -# Uncomment both to enable underglow -# Note that this will only work if an implementation exists for your board; check under the shield folder for board-specific overlays. -#CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_DISPLAY=y \ No newline at end of file diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index d82670a8..74a852a8 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -7,16 +7,16 @@ #include #include #include -#include #include + #define TIMEOUT 300 -&middle_left_encoder { +&encoder_1 { status = "okay"; }; -&top_right_encoder { +&encoder_2 { status = "okay"; }; @@ -25,59 +25,62 @@ compatible = "zmk,combos"; combo_btclr { timeout-ms = ; - key-positions = <0 4>; + key-positions = <1 6>; bindings = <&bt BT_CLR>; }; combo_reset { timeout-ms = ; - key-positions = <0 2>; + key-positions = <1 3>; bindings = <&sys_reset>; }; combo_bootloader { timeout-ms = ; - key-positions = <0 1>; + key-positions = <1 2>; bindings = <&bootloader>; }; combo_bt_nxt { timeout-ms = ; - key-positions = <0 3>; + key-positions = <1 4>; bindings = <&bt BT_NXT>; }; }; - keymap: keymap { + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1 &encoder_2>; + triggers-per-rotation = <20>; + }; + + + keymap0: keymap { compatible = "zmk,keymap"; default_layer { - display-name = "default"; + label = "default layer"; bindings = < - &kp F1 &kp F2 &kp F3 &kp F4 - &kp KP_NUM &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS - &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS - &kp C_MUTE &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans - &mo 1 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER - &kp BSPC &kp KP_N0 &trans &kp KP_DOT &trans - - &bt BT_CLR &rgb_ug RGB_TOG &rgb_ug RGB_EFF + &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) + &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS + &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS + &kp C_MUTE &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans + &mo 1 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER + &kp BSPC &kp KP_N0 &trans &kp KP_DOT &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; fn_layer { - display-name = "fn"; + label = "fn layer"; bindings = < - &out OUT_TOG &bt BT_PRV &bt BT_NXT &trans - &trans &trans &trans &trans - &rgb_ug RGB_HUD &rgb_ug RGB_SPI &rgb_ug RGB_HUI &trans - &bt BT_CLR &rgb_ug RGB_EFR &rgb_ug RGB_TOG &rgb_ug RGB_EFF &trans - &trans &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_BRI &trans - &kp DEL &rgb_ug RGB_SAD &trans &rgb_ug RGB_SAI &trans - - &trans &trans &trans + &trans &trans &trans &trans &trans + &trans &kp KP_NUM &trans &trans &trans + &trans &trans &trans &trans &trans + &bt BT_CLR &trans &trans &trans &trans + &trans &trans &trans &trans &trans + &kp DEL &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp PG_UP PG_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index 4a45c30c..f175c55e 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -6,107 +6,52 @@ #include -#include "murphpad-layout.dtsi" - / { chosen { zephyr,display = &oled; - zmk,kscan = &kscan; - zmk,physical-layouts = &all_1u_layout; + zmk,kscan = &kscan0; }; - kscan: kscan { + kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios - = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; col-gpios = <&pro_micro 9 GPIO_ACTIVE_HIGH> , <&pro_micro 6 GPIO_ACTIVE_HIGH> , <&pro_micro 5 GPIO_ACTIVE_HIGH> , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> ; }; - all_1u_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <5>; - rows = <6>; - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) - RC(1,1) RC(1,2) RC(1,3) RC(1,4) - RC(2,1) RC(2,2) RC(2,3) RC(2,4) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) - RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) - - RC(0,0) RC(1,0) RC(2,0) - >; - }; - - right_numpad_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <5>; - rows = <6>; - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) - RC(1,1) RC(1,2) RC(1,3) RC(1,4) - RC(2,1) RC(2,2) RC(2,3) RC(2,4) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) - RC(5,0) RC(5,2) RC(5,4) - - RC(0,0) RC(1,0) RC(2,0) - >; - }; - - left_numpad_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <5>; - rows = <6>; - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) - RC(1,1) RC(1,2) RC(1,3) RC(1,4) - RC(2,1) RC(2,2) RC(2,3) RC(2,4) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) - RC(5,0) RC(5,1) RC(5,3) - - RC(0,0) RC(1,0) RC(2,0) - >; - }; - - middle_left_encoder: encoder_1: encoder_1 { + encoder_1: encoder_1 { compatible = "alps,ec11"; + label = "Encoder 1"; a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; steps = <80>; status = "disabled"; }; - top_right_encoder: encoder_2: encoder_2 { + encoder_2: encoder_2 { compatible = "alps,ec11"; + label = "Encoder 2"; a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; steps = <80>; status = "disabled"; }; - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&middle_left_encoder &top_right_encoder>; - triggers-per-rotation = <20>; - }; - }; &pro_micro_i2c { @@ -115,6 +60,7 @@ oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -124,7 +70,6 @@ segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap index 42494199..1c212cd4 100644 --- a/app/boards/shields/naked60/naked60.keymap +++ b/app/boards/shields/naked60/naked60.keymap @@ -15,13 +15,12 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ---------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 |-------|-------| 6 | 7 | 8 | 9 | 0 | BSPC | // | TAB | Q | W | E | R | T |-------|-------| Y | U | I | O | P | \ | // | SHIFT | A | S | D | F | G |-------|-------| H | J | K | L | ; | ' | // | CTRL | Z | X | C | V | B |-------|-------| N | M | , | . | / | ENTER | - // |-------|ADJUST| LCTL | LALT | LGUI | LOWR | SPACE | SPACE | RAIS | LEFT | DOWN | UARW | RARW |-------| + // |-------|ADJUST| LCTL | LALT | LGUI | LOWR | SPACE | SPACE | RAIS | LARW | DARW | UARW | RARW |-------| bindings = < @@ -34,7 +33,6 @@ }; lower { - display-name = "Lower"; // ---------------------------------------------------------------------------------------------------------- // | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 | // | ~ | ! | @ | # | $ | % |-------|-------| ^ | & | * | ( | ) | DEL | @@ -51,7 +49,6 @@ }; raise { - display-name = "Raise"; // ---------------------------------------------------------------------------------------------------------- // | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 | // | ~ | 1 | 2 | 3 | 4 | 5 |-------|-------| 6 | 7 | 8 | 9 | 0 | DEL | @@ -68,7 +65,6 @@ }; adjust { - display-name = "Adjust"; // ---------------------------------------------------------------------------------------------------------- // |tog(4)| F2 | F3 | F4 | F5 | F6 |------|------| F7 | F8 | F9 | F10 | F11 | F12 | // | | NA | NA | NA | NA | NA |------|------| NA | NA | NA | NA | NA |LALT(PRTSN)| @@ -85,7 +81,6 @@ }; flock { - display-name = "Flock"; // ---------------------------------------------------------------------------------------------------------- // |tog(4) | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | | // |out tog|BT_SEL 0|BT_SEL 1|BT_SEL 2|BT_SEL 3|BT_SEL 4|-------|-------|BT_PRV|BT_NXT|BT_CLR| | | | @@ -101,4 +96,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/naked60/naked60.overlay b/app/boards/shields/naked60/naked60.overlay index 4e36bc76..2260a4af 100644 --- a/app/boards/shields/naked60/naked60.overlay +++ b/app/boards/shields/naked60/naked60.overlay @@ -11,7 +11,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index 3915ff0f..19bddec7 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -14,6 +14,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -21,7 +24,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/nibble/README.md b/app/boards/shields/nibble/README.md index a6d2add5..42646f97 100644 --- a/app/boards/shields/nibble/README.md +++ b/app/boards/shields/nibble/README.md @@ -8,6 +8,7 @@ If you built your nibble without the LEDs _and_ are using a nice!nano board, you ``` CONFIG_ZMK_RGB_UNDERGLOW=n +CONFIG_WS2812_STRIP=n ``` ## Encoder Notes diff --git a/app/boards/shields/nibble/boards/nice_nano.conf b/app/boards/shields/nibble/boards/nice_nano.conf index d1b76b84..14bed3d0 100644 --- a/app/boards/shields/nibble/boards/nice_nano.conf +++ b/app/boards/shields/nibble/boards/nice_nano.conf @@ -1,2 +1,4 @@ # Enable underglow CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +CONFIG_WS2812_STRIP=y \ No newline at end of file diff --git a/app/boards/shields/nibble/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/nibble/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/nibble/boards/nice_nano.overlay index 3849a8fb..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..45c55263 --- /dev/null +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index f1b7512e..4cb6f5b0 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -9,7 +9,7 @@ #include / { - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1>; triggers-per-rotation = <20>; @@ -19,7 +19,7 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default"; + label = "Default"; sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; @@ -32,7 +32,7 @@ >; }; function_layer { - display-name = "Function"; + label = "Function"; sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index 59db2d8d..43be6c76 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -10,11 +10,12 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; encoder_1: encoder_1 { compatible = "alps,ec11"; + label = "Encoder 1"; a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; steps = <80>; @@ -23,6 +24,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-demux"; + label = "KSCAN"; polling-interval-msec = <25>; input-gpios = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -60,6 +62,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -67,7 +70,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) display-offset = <0>; multiplex-ratio = <31>; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 0b2b7be3..53edc1cc 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -3,13 +3,10 @@ if SHIELD_NICE_VIEW -config LS0XX_VCOM_THREAD_PRIO - default 11 - config LV_Z_VDB_SIZE default 100 -config LV_DPI_DEF +config LV_Z_DPI default 161 config LV_Z_BITS_PER_PIXEL @@ -27,17 +24,13 @@ choice ZMK_DISPLAY_STATUS_SCREEN default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM endchoice -config LV_Z_MEM_POOL_SIZE - default 8192 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM - default 5120 if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN - config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM imply NICE_VIEW_WIDGET_STATUS config NICE_VIEW_WIDGET_STATUS bool "Custom nice!view status widget" select LV_FONT_MONTSERRAT_16 - select LV_USE_IMAGE + select LV_USE_IMG select LV_USE_CANVAS config NICE_VIEW_WIDGET_INVERTED diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md index 0d0c04db..00abfbfa 100644 --- a/app/boards/shields/nice_view/README.md +++ b/app/boards/shields/nice_view/README.md @@ -4,21 +4,9 @@ The nice!view is a low-power, high refresh rate display meant to replace I2C OLE This shield requires that an `&nice_view_spi` labeled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. -## Custom widget - -The nice!view shield includes a custom vertical widget. - -Profile indicators show the status of the first five BLE profiles using numbers from 1 to 5. -The number corresponding to the currently selected profile is drawn in a filled disk -and the circle outline around each profile number correspond to the following states: - -- solid outline: connected -- dashed outline: not connected -- no outline: not bound - ## Disable custom widget -To use the built-in ZMK widget instead of the custom nice!view one, add the following item to your `.conf` file: +The nice!view shield includes a custom vertical widget. To use the built-in ZMK one, add the following item to your `.conf` file: ``` CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=y diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index 51408bb3..e6f9158f 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -2,4 +2,3 @@ CONFIG_ZMK_DISPLAY=y # Disable idle blanking CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n -CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=4096 diff --git a/app/boards/shields/nice_view/nice_view.overlay b/app/boards/shields/nice_view/nice_view.overlay index 6eecf693..49ce0f23 100644 --- a/app/boards/shields/nice_view/nice_view.overlay +++ b/app/boards/shields/nice_view/nice_view.overlay @@ -8,12 +8,11 @@ status = "okay"; nice_view: ls0xx@0 { compatible = "sharp,ls0xx"; + label = "DISPLAY"; spi-max-frequency = <1000000>; reg = <0>; width = <160>; height = <68>; - serial-vcom-inversion; - serial-vcom-interval = <33>; }; }; diff --git a/app/boards/shields/nice_view/widgets/art.c b/app/boards/shields/nice_view/widgets/art.c index c91af376..56c89146 100644 --- a/app/boards/shields/nice_view/widgets/art.c +++ b/app/boards/shields/nice_view/widgets/art.c @@ -111,8 +111,9 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BALLOON u }; const lv_img_dsc_t balloon = { - .header.cf = LV_COLOR_FORMAT_I1, - + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .header.always_zero = 0, + .header.reserved = 0, .header.w = 140, .header.h = 68, .data_size = 1232, @@ -218,8 +219,9 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MOUNTAIN }; const lv_img_dsc_t mountain = { - .header.cf = LV_COLOR_FORMAT_I1, - + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .header.always_zero = 0, + .header.reserved = 0, .header.w = 140, .header.h = 68, .data_size = 1232, diff --git a/app/boards/shields/nice_view/widgets/bolt.c b/app/boards/shields/nice_view/widgets/bolt.c index bb5c5aa1..74dcc2b0 100644 --- a/app/boards/shields/nice_view/widgets/bolt.c +++ b/app/boards/shields/nice_view/widgets/bolt.c @@ -35,7 +35,9 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BOLT uint }; const lv_img_dsc_t bolt = { - .header.cf = LV_COLOR_FORMAT_I2, + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, .header.w = 11, .header.h = 18, .data_size = 70, diff --git a/app/boards/shields/nice_view/widgets/peripheral_status.c b/app/boards/shields/nice_view/widgets/peripheral_status.c index 40c338d3..4c0c2263 100644 --- a/app/boards/shields/nice_view/widgets/peripheral_status.c +++ b/app/boards/shields/nice_view/widgets/peripheral_status.c @@ -6,13 +6,14 @@ */ #include -#include +#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include #include +#include "peripheral_status.h" #include #include #include @@ -21,8 +22,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#include "peripheral_status.h" - LV_IMG_DECLARE(balloon); LV_IMG_DECLARE(mountain); @@ -41,17 +40,17 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], const struct status_st init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); // Fill background - canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); // Draw battery draw_battery(canvas, state); // Draw output status - canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, - state->connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); + lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, + state->connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); // Rotate canvas - rotate_canvas(canvas); + rotate_canvas(canvas, cbuf); } static void set_battery_status(struct zmk_widget_status *widget, @@ -71,8 +70,8 @@ static void battery_status_update_cb(struct battery_status_state state) { } static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { - return (struct battery_status_state){ - .level = zmk_battery_state_of_charge(), + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) .usb_present = zmk_usb_is_powered(), #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ @@ -112,11 +111,11 @@ int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) { lv_obj_set_size(widget->obj, 160, 68); lv_obj_t *top = lv_canvas_create(widget->obj); lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0); - lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); lv_obj_t *art = lv_img_create(widget->obj); bool random = sys_rand32_get() & 1; - lv_image_set_src(art, random ? &balloon : &mountain); + lv_img_set_src(art, random ? &balloon : &mountain); lv_obj_align(art, LV_ALIGN_TOP_LEFT, 0, 0); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/shields/nice_view/widgets/status.c b/app/boards/shields/nice_view/widgets/status.c index 179ecb0a..453fd650 100644 --- a/app/boards/shields/nice_view/widgets/status.c +++ b/app/boards/shields/nice_view/widgets/status.c @@ -1,16 +1,16 @@ /* * - * Copyright (c) 2025 The ZMK Contributors + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT * */ #include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include #include #include "status.h" #include @@ -33,12 +33,10 @@ struct output_status_state { int active_profile_index; bool active_profile_connected; bool active_profile_bonded; - bool profiles_connected[NICEVIEW_PROFILE_COUNT]; - bool profiles_bonded[NICEVIEW_PROFILE_COUNT]; }; struct layer_status_state { - zmk_keymap_layer_index_t index; + uint8_t index; const char *label; }; @@ -46,7 +44,7 @@ struct wpm_status_state { uint8_t wpm; }; -static void draw_top(lv_obj_t *widget, const struct status_state *state) { +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 0); lv_draw_label_dsc_t label_dsc; @@ -61,7 +59,7 @@ static void draw_top(lv_obj_t *widget, const struct status_state *state) { init_line_dsc(&line_dsc, LVGL_FOREGROUND, 1); // Fill background - lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); // Draw battery draw_battery(canvas, state); @@ -86,15 +84,15 @@ static void draw_top(lv_obj_t *widget, const struct status_state *state) { break; } - canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text); + lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text); // Draw WPM - canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc); - canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc); + lv_canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc); char wpm_text[6] = {}; snprintf(wpm_text, sizeof(wpm_text), "%d", state->wpm[9]); - canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text); + lv_canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text); int max = 0; int min = 256; @@ -118,13 +116,13 @@ static void draw_top(lv_obj_t *widget, const struct status_state *state) { points[i].x = 2 + i * 7; points[i].y = 60 - (state->wpm[i] - min) * 36 / range; } - canvas_draw_line(canvas, points, 10, &line_dsc); + lv_canvas_draw_line(canvas, points, 10, &line_dsc); // Rotate canvas - rotate_canvas(canvas); + rotate_canvas(canvas, cbuf); } -static void draw_middle(lv_obj_t *widget, const struct status_state *state) { +static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 1); lv_draw_rect_dsc_t rect_black_dsc; @@ -141,44 +139,35 @@ static void draw_middle(lv_obj_t *widget, const struct status_state *state) { init_label_dsc(&label_dsc_black, LVGL_BACKGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER); // Fill background - lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); // Draw circles - int circle_offsets[NICEVIEW_PROFILE_COUNT][2] = { + int circle_offsets[5][2] = { {13, 13}, {55, 13}, {34, 34}, {13, 55}, {55, 55}, }; - for (int i = 0; i < NICEVIEW_PROFILE_COUNT; i++) { + for (int i = 0; i < 5; i++) { bool selected = i == state->active_profile_index; - if (state->profiles_connected[i]) { - canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 360, - &arc_dsc); - } else if (state->profiles_bonded[i]) { - const int segments = 8; - const int gap = 20; - for (int j = 0; j < segments; ++j) - canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, - 360. / segments * j + gap / 2.0, - 360. / segments * (j + 1) - gap / 2.0, &arc_dsc); - } + lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 359, + &arc_dsc); if (selected) { - canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359, - &arc_dsc_filled); + lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359, + &arc_dsc_filled); } char label[2]; snprintf(label, sizeof(label), "%d", i + 1); - canvas_draw_text(canvas, circle_offsets[i][0] - 8, circle_offsets[i][1] - 10, 16, - (selected ? &label_dsc_black : &label_dsc), label); + lv_canvas_draw_text(canvas, circle_offsets[i][0] - 8, circle_offsets[i][1] - 10, 16, + (selected ? &label_dsc_black : &label_dsc), label); } // Rotate canvas - rotate_canvas(canvas); + rotate_canvas(canvas, cbuf); } -static void draw_bottom(lv_obj_t *widget, const struct status_state *state) { +static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 2); lv_draw_rect_dsc_t rect_black_dsc; @@ -187,21 +176,21 @@ static void draw_bottom(lv_obj_t *widget, const struct status_state *state) { init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_14, LV_TEXT_ALIGN_CENTER); // Fill background - lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); // Draw layer - if (state->layer_label == NULL || strlen(state->layer_label) == 0) { - char text[10] = {}; + if (state->layer_label == NULL) { + char text[9] = {}; sprintf(text, "LAYER %i", state->layer_index); - canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); } else { - canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state->layer_label); + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state->layer_label); } // Rotate canvas - rotate_canvas(canvas); + rotate_canvas(canvas, cbuf); } static void set_battery_status(struct zmk_widget_status *widget, @@ -212,7 +201,7 @@ static void set_battery_status(struct zmk_widget_status *widget, widget->state.battery = state.level; - draw_top(widget->obj, &widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); } static void battery_status_update_cb(struct battery_status_state state) { @@ -221,10 +210,8 @@ static void battery_status_update_cb(struct battery_status_state state) { } static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { - const struct zmk_battery_state_changed *ev = as_zmk_battery_state_changed(eh); - - return (struct battery_status_state){ - .level = (ev != NULL) ? ev->state_of_charge : zmk_battery_state_of_charge(), + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) .usb_present = zmk_usb_is_powered(), #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ @@ -245,13 +232,9 @@ static void set_output_status(struct zmk_widget_status *widget, widget->state.active_profile_index = state->active_profile_index; widget->state.active_profile_connected = state->active_profile_connected; widget->state.active_profile_bonded = state->active_profile_bonded; - for (int i = 0; i < NICEVIEW_PROFILE_COUNT; ++i) { - widget->state.profiles_connected[i] = state->profiles_connected[i]; - widget->state.profiles_bonded[i] = state->profiles_bonded[i]; - } - draw_top(widget->obj, &widget->state); - draw_middle(widget->obj, &widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); + draw_middle(widget->obj, widget->cbuf2, &widget->state); } static void output_status_update_cb(struct output_status_state state) { @@ -260,17 +243,12 @@ static void output_status_update_cb(struct output_status_state state) { } static struct output_status_state output_status_get_state(const zmk_event_t *_eh) { - struct output_status_state state = { - .selected_endpoint = zmk_endpoint_get_selected(), + return (struct output_status_state){ + .selected_endpoint = zmk_endpoints_selected(), .active_profile_index = zmk_ble_active_profile_index(), .active_profile_connected = zmk_ble_active_profile_is_connected(), .active_profile_bonded = !zmk_ble_active_profile_is_open(), }; - for (int i = 0; i < MIN(NICEVIEW_PROFILE_COUNT, ZMK_BLE_PROFILE_COUNT); ++i) { - state.profiles_connected[i] = zmk_ble_profile_is_connected(i); - state.profiles_bonded[i] = !zmk_ble_profile_is_open(i); - } - return state; } ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, @@ -288,7 +266,7 @@ static void set_layer_status(struct zmk_widget_status *widget, struct layer_stat widget->state.layer_index = state.index; widget->state.layer_label = state.label; - draw_bottom(widget->obj, &widget->state); + draw_bottom(widget->obj, widget->cbuf3, &widget->state); } static void layer_status_update_cb(struct layer_status_state state) { @@ -297,9 +275,8 @@ static void layer_status_update_cb(struct layer_status_state state) { } static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { - zmk_keymap_layer_index_t index = zmk_keymap_highest_layer_active(); - return (struct layer_status_state){ - .index = index, .label = zmk_keymap_layer_name(zmk_keymap_layer_index_to_id(index))}; + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; } ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, @@ -313,7 +290,7 @@ static void set_wpm_status(struct zmk_widget_status *widget, struct wpm_status_s } widget->state.wpm[9] = state.wpm; - draw_top(widget->obj, &widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); } static void wpm_status_update_cb(struct wpm_status_state state) { @@ -334,13 +311,13 @@ int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) { lv_obj_set_size(widget->obj, 160, 68); lv_obj_t *top = lv_canvas_create(widget->obj); lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0); - lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); lv_obj_t *middle = lv_canvas_create(widget->obj); lv_obj_align(middle, LV_ALIGN_TOP_LEFT, 24, 0); - lv_canvas_set_buffer(middle, widget->cbuf2, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); + lv_canvas_set_buffer(middle, widget->cbuf2, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); lv_obj_t *bottom = lv_canvas_create(widget->obj); lv_obj_align(bottom, LV_ALIGN_TOP_LEFT, -44, 0); - lv_canvas_set_buffer(bottom, widget->cbuf3, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); + lv_canvas_set_buffer(bottom, widget->cbuf3, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); diff --git a/app/boards/shields/nice_view/widgets/status.h b/app/boards/shields/nice_view/widgets/status.h index 66e41e5d..53a22518 100644 --- a/app/boards/shields/nice_view/widgets/status.h +++ b/app/boards/shields/nice_view/widgets/status.h @@ -14,9 +14,9 @@ struct zmk_widget_status { sys_snode_t node; lv_obj_t *obj; - uint8_t cbuf[CANVAS_BUF_SIZE]; - uint8_t cbuf2[CANVAS_BUF_SIZE]; - uint8_t cbuf3[CANVAS_BUF_SIZE]; + lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE]; + lv_color_t cbuf2[CANVAS_SIZE * CANVAS_SIZE]; + lv_color_t cbuf3[CANVAS_SIZE * CANVAS_SIZE]; struct status_state state; }; diff --git a/app/boards/shields/nice_view/widgets/util.c b/app/boards/shields/nice_view/widgets/util.c index 90333910..b4915ab7 100644 --- a/app/boards/shields/nice_view/widgets/util.c +++ b/app/boards/shields/nice_view/widgets/util.c @@ -10,14 +10,18 @@ LV_IMG_DECLARE(bolt); -void rotate_canvas(lv_obj_t *canvas) { - uint8_t *buf = lv_canvas_get_draw_buf(canvas)->data; - static uint8_t buf_copy[CANVAS_BUF_SIZE]; - memcpy(buf_copy, buf, sizeof(buf_copy)); +void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]) { + static lv_color_t cbuf_tmp[CANVAS_SIZE * CANVAS_SIZE]; + memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp)); + lv_img_dsc_t img; + img.data = (void *)cbuf_tmp; + img.header.cf = LV_IMG_CF_TRUE_COLOR; + img.header.w = CANVAS_SIZE; + img.header.h = CANVAS_SIZE; - const uint32_t stride = lv_draw_buf_width_to_stride(CANVAS_SIZE, CANVAS_COLOR_FORMAT); - lv_draw_sw_rotate(buf_copy, buf, CANVAS_SIZE, CANVAS_SIZE, stride, stride, - LV_DISPLAY_ROTATION_270, CANVAS_COLOR_FORMAT); + lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); + lv_canvas_transform(canvas, &img, 900, LV_IMG_ZOOM_NONE, -1, 0, CANVAS_SIZE / 2, + CANVAS_SIZE / 2, true); } void draw_battery(lv_obj_t *canvas, const struct status_state *state) { @@ -26,16 +30,16 @@ void draw_battery(lv_obj_t *canvas, const struct status_state *state) { lv_draw_rect_dsc_t rect_white_dsc; init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); - canvas_draw_rect(canvas, 0, 2, 29, 12, &rect_white_dsc); - canvas_draw_rect(canvas, 1, 3, 27, 10, &rect_black_dsc); - canvas_draw_rect(canvas, 2, 4, (state->battery + 2) / 4, 8, &rect_white_dsc); - canvas_draw_rect(canvas, 30, 5, 3, 6, &rect_white_dsc); - canvas_draw_rect(canvas, 31, 6, 1, 4, &rect_black_dsc); + lv_canvas_draw_rect(canvas, 0, 2, 29, 12, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 1, 3, 27, 10, &rect_black_dsc); + lv_canvas_draw_rect(canvas, 2, 4, (state->battery + 2) / 4, 8, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 30, 5, 3, 6, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 31, 6, 1, 4, &rect_black_dsc); if (state->charging) { - lv_draw_image_dsc_t img_dsc; - lv_draw_image_dsc_init(&img_dsc); - canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); } } @@ -63,68 +67,3 @@ void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width) { arc_dsc->color = color; arc_dsc->width = width; } - -void canvas_draw_line(lv_obj_t *canvas, const lv_point_t points[], uint32_t point_cnt, - lv_draw_line_dsc_t *draw_dsc) { - lv_layer_t layer; - lv_canvas_init_layer(canvas, &layer); - - for (uint32_t i = 1; i < point_cnt; ++i) { - draw_dsc->p1.x = points[i - 1].x; - draw_dsc->p1.y = points[i - 1].y; - draw_dsc->p2.x = points[i].x; - draw_dsc->p2.y = points[i].y; - lv_draw_line(&layer, draw_dsc); - } - - lv_canvas_finish_layer(canvas, &layer); -} -void canvas_draw_rect(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, - lv_draw_rect_dsc_t *draw_dsc) { - lv_layer_t layer; - lv_canvas_init_layer(canvas, &layer); - - lv_area_t coords = {x, y, x + w - 1, y + h - 1}; - lv_draw_rect(&layer, draw_dsc, &coords); - - lv_canvas_finish_layer(canvas, &layer); -} - -void canvas_draw_arc(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t r, - int32_t start_angle, int32_t end_angle, lv_draw_arc_dsc_t *draw_dsc) { - lv_layer_t layer; - lv_canvas_init_layer(canvas, &layer); - - draw_dsc->center.x = x; - draw_dsc->center.y = y; - draw_dsc->radius = r; - draw_dsc->start_angle = start_angle; - draw_dsc->end_angle = end_angle; - lv_draw_arc(&layer, draw_dsc); - - lv_canvas_finish_layer(canvas, &layer); -} - -void canvas_draw_text(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t max_w, - lv_draw_label_dsc_t *draw_dsc, const char *txt) { - lv_layer_t layer; - lv_canvas_init_layer(canvas, &layer); - - draw_dsc->text = txt; - lv_area_t coords = {x, y, x + max_w, y + CANVAS_SIZE}; - lv_draw_label(&layer, draw_dsc, &coords); - - lv_canvas_finish_layer(canvas, &layer); -} - -void canvas_draw_img(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, const lv_image_dsc_t *src, - lv_draw_image_dsc_t *draw_dsc) { - lv_layer_t layer; - lv_canvas_init_layer(canvas, &layer); - - draw_dsc->src = src; - lv_area_t coords = {x, y, x + src->header.w - 1, y + src->header.h - 1}; - lv_draw_image(&layer, draw_dsc, &coords); - - lv_canvas_finish_layer(canvas, &layer); -} \ No newline at end of file diff --git a/app/boards/shields/nice_view/widgets/util.h b/app/boards/shields/nice_view/widgets/util.h index 183d0ec3..fbcb616f 100644 --- a/app/boards/shields/nice_view/widgets/util.h +++ b/app/boards/shields/nice_view/widgets/util.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2025 The ZMK Contributors + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT * */ @@ -8,13 +8,7 @@ #include #include -#define NICEVIEW_PROFILE_COUNT 5 - #define CANVAS_SIZE 68 -#define CANVAS_COLOR_FORMAT LV_COLOR_FORMAT_L8 // smallest type supported by sw_rotate -#define CANVAS_BUF_SIZE \ - LV_CANVAS_BUF_SIZE(CANVAS_SIZE, CANVAS_SIZE, LV_COLOR_FORMAT_GET_BPP(CANVAS_COLOR_FORMAT), \ - LV_DRAW_BUF_STRIDE_ALIGN) #define LVGL_BACKGROUND \ IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_black() : lv_color_white() @@ -29,8 +23,6 @@ struct status_state { int active_profile_index; bool active_profile_connected; bool active_profile_bonded; - bool profiles_connected[NICEVIEW_PROFILE_COUNT]; - bool profiles_bonded[NICEVIEW_PROFILE_COUNT]; uint8_t layer_index; const char *layer_label; uint8_t wpm[10]; @@ -46,21 +38,10 @@ struct battery_status_state { #endif }; -void rotate_canvas(lv_obj_t *canvas); +void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]); void draw_battery(lv_obj_t *canvas, const struct status_state *state); void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font, lv_text_align_t align); void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color); void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width); void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width); - -void canvas_draw_line(lv_obj_t *canvas, const lv_point_t points[], uint32_t point_cnt, - lv_draw_line_dsc_t *draw_dsc); -void canvas_draw_rect(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, - lv_draw_rect_dsc_t *draw_dsc); -void canvas_draw_arc(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t r, - int32_t start_angle, int32_t end_angle, lv_draw_arc_dsc_t *draw_dsc); -void canvas_draw_text(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t max_w, - lv_draw_label_dsc_t *draw_dsc, const char *txt); -void canvas_draw_img(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, const lv_image_dsc_t *src, - lv_draw_image_dsc_t *draw_dsc); diff --git a/app/boards/shields/nice_view_adapter/README.md b/app/boards/shields/nice_view_adapter/README.md index 19812931..fe0a6f07 100644 --- a/app/boards/shields/nice_view_adapter/README.md +++ b/app/boards/shields/nice_view_adapter/README.md @@ -7,5 +7,5 @@ To use this shield, you should add this shield to your list of shields _before_ The nice!view will use the SDA/SCL pins of the OLED, and then the adapter expects a final pin to be "bodged" from your microcontroller to the nice!view CS pin. This adapter assumes that the CS pin bodged is the `&pro_micro 1` pin or "D1", which is the top left pin when looking at the front of the board. If you can't use this pin, you'll need to override the `cs-gpios` for the `&nice_view_spi` bus (in your `zmk-config` keymap for example) or you will want to define your own `&nice_view_spi` bus without using this adapter. ``` -west build -b nice_nano -- -DSHIELD="lily58_left nice_view_adapter nice_view" +west build -b nice_nano_v2 -- -DSHIELD="lily58_left nice_view_adapter nice_view" ``` diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_nrf52840_zmk.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/bluemicro840_nrf52840_zmk.overlay rename to app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_nrf52840_zmk.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/mikoto_nrf52840_zmk.overlay rename to app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/nice_view_adapter/boards/nice_nano.overlay diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..45ba34de --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay rename to app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay rename to app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay rename to app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_nrf52840_zmk.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay similarity index 100% rename from app/boards/shields/nice_view_adapter/boards/puchi_ble_nrf52840_zmk.overlay rename to app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay diff --git a/app/boards/shields/osprette/osprette.keymap b/app/boards/shields/osprette/osprette.keymap index 7afd7ae8..9c9213b6 100644 --- a/app/boards/shields/osprette/osprette.keymap +++ b/app/boards/shields/osprette/osprette.keymap @@ -15,7 +15,7 @@ &mt { flavor = "tap-preferred"; - tapping-term-ms = <140>; + tapping_term_ms = <140>; }; / { @@ -75,7 +75,6 @@ compatible = "zmk,keymap"; MAIN_layer { - display-name = "Main Layer"; bindings = < &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp Q &kp A &kp S &kp D < SYM F &kp G &kp H < SYM J &kp K &kp L &kp SQT &kp P @@ -85,7 +84,6 @@ }; SYM_layer { - display-name = "Sym Layer"; bindings = < &kp N7 &kp N8 &kp N9 &kp STAR &kp DLLR &kp LBRC &kp RBRC &kp HASH &kp AMPS &kp EXCL &kp N1 &kp N2 &kp N3 &kp EQUAL &kp LT &kp LPAR &kp RPAR &kp GT &kp PIPE &none @@ -95,7 +93,6 @@ }; NAV_layer { - display-name = "Nav Layer"; bindings = < &kp C_VOL_DN &kp C_VOL_UP &kp C_NEXT &kp C_PP &none &kp F7 &kp F8 &kp F9 &kp C_PREV &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp LC(TAB) &kp PSCRN &kp F1 &kp F2 &kp F3 &kp F10 &kp F12 @@ -105,7 +102,6 @@ }; BT_layer { - display-name = "BT Layer"; bindings = < &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none diff --git a/app/boards/shields/osprette/osprette.overlay b/app/boards/shields/osprette/osprette.overlay index ed893f47..546df783 100644 --- a/app/boards/shields/osprette/osprette.overlay +++ b/app/boards/shields/osprette/osprette.overlay @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -26,7 +26,7 @@ RC(0,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "row2col"; col-gpios diff --git a/app/boards/shields/pancake/pancake.keymap b/app/boards/shields/pancake/pancake.keymap index a6a4c1a4..e5ca4372 100644 --- a/app/boards/shields/pancake/pancake.keymap +++ b/app/boards/shields/pancake/pancake.keymap @@ -19,7 +19,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT &kp SEMI @@ -29,7 +28,6 @@ }; lower_layer { - display-name = "Lower Layer"; bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &trans &trans @@ -39,7 +37,6 @@ }; raise_layer { - display-name = "Raise Layer"; bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &trans &kp BSLH @@ -49,7 +46,6 @@ }; function_layer { - display-name = "Function Layer"; bindings = < &bootloader &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp F11 &kp F12 &trans diff --git a/app/boards/shields/pancake/pancake.overlay b/app/boards/shields/pancake/pancake.overlay index 0538bf71..6fae463f 100644 --- a/app/boards/shields/pancake/pancake.overlay +++ b/app/boards/shields/pancake/pancake.overlay @@ -11,7 +11,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/pancake/pancake.zmk.yml b/app/boards/shields/pancake/pancake.zmk.yml index 020d26c1..21cc5444 100644 --- a/app/boards/shields/pancake/pancake.zmk.yml +++ b/app/boards/shields/pancake/pancake.zmk.yml @@ -2,7 +2,7 @@ file_format: "1" id: pancake name: Pancake type: shield -url: https://github.com/Spaceboards/SpaceboardsHardware/tree/master/Keyboards/Pancake/V1 +url: https://mkultra.click/pancake-keyboard-kit requires: [pro_micro] features: - keys diff --git a/app/boards/shields/posix_pro_micro/Kconfig.defconfig b/app/boards/shields/posix_pro_micro/Kconfig.defconfig deleted file mode 100644 index 505fe2dd..00000000 --- a/app/boards/shields/posix_pro_micro/Kconfig.defconfig +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if SHIELD_POSIX_PRO_MICRO - -config ZMK_STUDIO - select UART_NATIVE_POSIX_PORT_1_ENABLE - -endif \ No newline at end of file diff --git a/app/boards/shields/posix_pro_micro/Kconfig.shield b/app/boards/shields/posix_pro_micro/Kconfig.shield deleted file mode 100644 index 77704314..00000000 --- a/app/boards/shields/posix_pro_micro/Kconfig.shield +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config SHIELD_POSIX_PRO_MICRO - def_bool $(shields_list_contains,posix_pro_micro) diff --git a/app/boards/shields/posix_pro_micro/posix_pro_micro.overlay b/app/boards/shields/posix_pro_micro/posix_pro_micro.overlay deleted file mode 100644 index e3677f53..00000000 --- a/app/boards/shields/posix_pro_micro/posix_pro_micro.overlay +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ -/* - * Copyright (c) 2020 Pete Johanson - * - * SPDX-License-Identifier: MIT - */ - - /delete-node/ &kscan; - - &uart1 { status = "okay"; }; - - / { - chosen { - zmk,studio-rpc-uart = &uart1; - }; - - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 0 0> /* D0 */ - , <1 0 &gpio0 1 0> /* D1 */ - , <2 0 &gpio0 2 0> /* D2 */ - , <3 0 &gpio0 3 0> /* D3 */ - , <4 0 &gpio0 4 0> /* D4/A6 */ - , <5 0 &gpio0 5 0> /* D5 */ - , <6 0 &gpio0 6 0> /* D6/A7 */ - , <7 0 &gpio0 7 0> /* D7 */ - , <8 0 &gpio0 8 0> /* D8/A8 */ - , <9 0 &gpio0 9 0> /* D9/A9 */ - , <10 0 &gpio0 10 0> /* D10/A10 */ - , <16 0 &gpio0 11 0> /* D16 */ - , <14 0 &gpio0 12 0> /* D14 */ - , <15 0 &gpio0 13 0> /* D15 */ - , <18 0 &gpio0 14 0> /* D18/A0 */ - , <19 0 &gpio0 15 0> /* D19/A1 */ - , <20 0 &gpio0 16 0> /* D20/A2 */ - , <21 0 &gpio0 17 0> /* D21/A3 */ - ; - }; -}; - -pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi0 {}; -pro_micro_serial: &uart0 {}; diff --git a/app/boards/shields/posix_seeed_xiao/Kconfig.defconfig b/app/boards/shields/posix_seeed_xiao/Kconfig.defconfig deleted file mode 100644 index fa45d9d3..00000000 --- a/app/boards/shields/posix_seeed_xiao/Kconfig.defconfig +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if SHIELD_POSIX_SEEED_XIAO - -config ZMK_STUDIO - select UART_NATIVE_POSIX_PORT_1_ENABLE - -endif \ No newline at end of file diff --git a/app/boards/shields/posix_seeed_xiao/Kconfig.shield b/app/boards/shields/posix_seeed_xiao/Kconfig.shield deleted file mode 100644 index 85fca206..00000000 --- a/app/boards/shields/posix_seeed_xiao/Kconfig.shield +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config SHIELD_POSIX_SEEED_XIAO - def_bool $(shields_list_contains,posix_seeed_xiao) diff --git a/app/boards/shields/posix_seeed_xiao/posix_seeed_xiao.overlay b/app/boards/shields/posix_seeed_xiao/posix_seeed_xiao.overlay deleted file mode 100644 index 0e58539f..00000000 --- a/app/boards/shields/posix_seeed_xiao/posix_seeed_xiao.overlay +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - - /delete-node/ &kscan; - - &uart1 { status = "okay"; }; - - / { - chosen { - zmk,studio-rpc-uart = &uart1; - }; - - xiao_d: connector { - compatible = "seeed,xiao-gpio"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 0 0> /* D0 */ - , <1 0 &gpio0 1 0> /* D1 */ - , <2 0 &gpio0 2 0> /* D2 */ - , <3 0 &gpio0 3 0> /* D3 */ - , <4 0 &gpio0 4 0> /* D4 */ - , <5 0 &gpio0 5 0> /* D5 */ - , <6 0 &gpio0 6 0> /* D6 */ - , <7 0 &gpio0 7 0> /* D7 */ - , <8 0 &gpio0 8 0> /* D8 */ - , <9 0 &gpio0 9 0> /* D9 */ - , <10 0 &gpio0 10 0> /* D10 */ - ; - }; -}; - -xiao_i2c: &i2c0 {}; -xiao_spi: &spi0 {}; -xiao_serial: &uart0 {}; \ No newline at end of file diff --git a/app/boards/shields/qaz/qaz-layouts.dtsi b/app/boards/shields/qaz/qaz-layouts.dtsi deleted file mode 100644 index 4080d79e..00000000 --- a/app/boards/shields/qaz/qaz-layouts.dtsi +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - split_big_bar_layout: split_big_bar_layout { - compatible = "zmk,physical-layout"; - display-name = "Split Big Bar"; - transform = <&split_big_bar_transform>; - kscan = <&kscan0>; - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 125 100 900 0 0 0 0> - - , <&key_physical_attrs 125 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 150 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 325 100 200 300 0 0 0> - , <&key_physical_attrs 300 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - ; - }; - - split_bar_layout: split_bar_layout { - compatible = "zmk,physical-layout"; - display-name = "Split Bar"; - transform = <&split_bar_transform>; - kscan = <&kscan0>; - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 125 100 900 0 0 0 0> - - , <&key_physical_attrs 125 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 150 100 875 200 0 0 0> - - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 225 100 300 300 0 0 0> - , <&key_physical_attrs 200 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - ; - }; - - big_bar_layout: big_bar_layout { - compatible = "zmk,physical-layout"; - display-name = "Big Bar"; - transform = <&big_bar_transform>; - kscan = <&kscan0>; - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 125 100 900 0 0 0 0> - - , <&key_physical_attrs 125 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 125 100 0 0 0> - , <&key_physical_attrs 100 100 225 100 0 0 0> - , <&key_physical_attrs 100 100 325 100 0 0 0> - , <&key_physical_attrs 100 100 425 100 0 0 0> - , <&key_physical_attrs 100 100 525 100 0 0 0> - , <&key_physical_attrs 100 100 625 100 0 0 0> - , <&key_physical_attrs 100 100 725 100 0 0 0> - , <&key_physical_attrs 100 100 825 100 0 0 0> - , <&key_physical_attrs 100 100 925 100 0 0 0> - - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 150 100 875 200 0 0 0> - - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 625 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - ; - }; - - position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - - split_big_bar_posmap { - physical-layout = <&split_big_bar_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28> - , <29 30 35 31 36 33 34 32> - ; - }; - - split_bar_posmap { - physical-layout = <&split_bar_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28> - , <29 30 31 32 34 35 36 33> - ; - }; - - big_bar_posmap { - physical-layout = <&big_bar_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28> - , <29 30 35 34 36 32 33 31> - ; - }; - }; -}; \ No newline at end of file diff --git a/app/boards/shields/qaz/qaz.keymap b/app/boards/shields/qaz/qaz.keymap index 72b51100..e6794e7b 100644 --- a/app/boards/shields/qaz/qaz.keymap +++ b/app/boards/shields/qaz/qaz.keymap @@ -16,6 +16,7 @@ behaviors { hm: homerow_mods { compatible = "zmk,behavior-hold-tap"; + label = "homerow mods"; #binding-cells = <2>; tapping-term-ms = <225>; flavor = "tap-preferred"; @@ -29,7 +30,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp H &hm RSHFT J &hm RCTRL K &hm RALT L &hm RGUI RET @@ -38,7 +38,6 @@ >; }; num_sym { - display-name = "Num Sym"; bindings = < &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans &trans &trans &trans &kp EQUAL &kp MINUS @@ -48,7 +47,6 @@ }; nav { - display-name = "Nav"; bindings = < &bt BT_CLR &bt BT_NXT &bt BT_PRV &none &none &none &none &kp UP &none &kp BSPC &trans &trans &trans &trans &none &none &kp LEFT &kp DOWN &kp RIGHT &none @@ -57,4 +55,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/qaz/qaz.overlay b/app/boards/shields/qaz/qaz.overlay index ca4a0bc1..76ee5ba7 100644 --- a/app/boards/shields/qaz/qaz.overlay +++ b/app/boards/shields/qaz/qaz.overlay @@ -1,19 +1,18 @@ /* - * Copyright (c) 2024 The ZMK Contributors + * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ #include -#include "qaz-layouts.dtsi" / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &split_bar_layout; + zmk,matrix_transform = &default_transform; }; - split_bar_transform: split_bar_transform { + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <7>; rows = <6>; @@ -25,34 +24,10 @@ >; }; - split_big_bar_transform: split_big_bar_transform { - compatible = "zmk,matrix-transform"; - columns = <7>; - rows = <6>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(4,3) RC(5,3) - RC(3,0) RC(3,1) RC(3,2) RC(3,5) RC(3,6) RC(4,4) - >; - }; - - big_bar_transform: big_bar_transform { - compatible = "zmk,matrix-transform"; - columns = <7>; - rows = <6>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(4,3) RC(5,3) - RC(3,0) RC(3,1) RC(3,4) RC(3,6) RC(4,4) - >; - }; - kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -74,4 +49,5 @@ , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; }; + }; \ No newline at end of file diff --git a/app/boards/shields/qaz/qaz.zmk.yml b/app/boards/shields/qaz/qaz.zmk.yml index 05b277db..3305e3da 100644 --- a/app/boards/shields/qaz/qaz.zmk.yml +++ b/app/boards/shields/qaz/qaz.zmk.yml @@ -6,4 +6,3 @@ url: https://www.cbkbd.com/product/qaz-keyboard-kit requires: [pro_micro] features: - keys - - studio diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index aadf8d19..f7dc4489 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -10,7 +10,7 @@ chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; /* diff --git a/app/boards/shields/quefrency/quefrency.keymap b/app/boards/shields/quefrency/quefrency.keymap index d22da69d..7d519ad4 100644 --- a/app/boards/shields/quefrency/quefrency.keymap +++ b/app/boards/shields/quefrency/quefrency.keymap @@ -21,7 +21,6 @@ // ------------------------------------------- ------------------------------------------------------ default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 /**/ &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T /**/ &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME @@ -40,7 +39,6 @@ // ------------------------------------------- ------------------------------------------------------ fn_layer { - display-name = "Fn Layer"; bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 /**/ &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &bt BT_CLR &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans /**/ &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/quefrency/quefrency_left.overlay b/app/boards/shields/quefrency/quefrency_left.overlay index a40d47c1..a0f483ef 100644 --- a/app/boards/shields/quefrency/quefrency_left.overlay +++ b/app/boards/shields/quefrency/quefrency_left.overlay @@ -12,8 +12,7 @@ */ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; diff --git a/app/boards/shields/quefrency/quefrency_right.overlay b/app/boards/shields/quefrency/quefrency_right.overlay index ebb9f844..bf97d34b 100644 --- a/app/boards/shields/quefrency/quefrency_right.overlay +++ b/app/boards/shields/quefrency/quefrency_right.overlay @@ -17,8 +17,7 @@ */ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/redox/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/redox/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/redox/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/redox/redox-layouts.dtsi b/app/boards/shields/redox/redox-layouts.dtsi deleted file mode 100644 index c998887f..00000000 --- a/app/boards/shields/redox/redox-layouts.dtsi +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - redox_physical_layout: redox_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 35 0 0 0> - , <&key_physical_attrs 100 100 100 35 0 0 0> - , <&key_physical_attrs 100 100 200 15 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 15 0 0 0> - , <&key_physical_attrs 100 100 500 35 0 0 0> - , <&key_physical_attrs 100 100 1100 35 0 0 0> - , <&key_physical_attrs 100 100 1200 15 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 15 0 0 0> - , <&key_physical_attrs 100 100 1500 35 0 0 0> - , <&key_physical_attrs 100 100 1600 35 0 0 0> - , <&key_physical_attrs 100 100 0 135 0 0 0> - , <&key_physical_attrs 100 100 100 135 0 0 0> - , <&key_physical_attrs 100 100 200 115 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 115 0 0 0> - , <&key_physical_attrs 100 100 500 135 0 0 0> - , <&key_physical_attrs 100 100 600 85 0 0 0> - , <&key_physical_attrs 100 100 1000 85 0 0 0> - , <&key_physical_attrs 100 100 1100 135 0 0 0> - , <&key_physical_attrs 100 100 1200 115 0 0 0> - , <&key_physical_attrs 100 100 1300 100 0 0 0> - , <&key_physical_attrs 100 100 1400 115 0 0 0> - , <&key_physical_attrs 100 100 1500 135 0 0 0> - , <&key_physical_attrs 100 100 1600 135 0 0 0> - , <&key_physical_attrs 100 100 0 235 0 0 0> - , <&key_physical_attrs 100 100 100 235 0 0 0> - , <&key_physical_attrs 100 100 200 215 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 215 0 0 0> - , <&key_physical_attrs 100 100 500 235 0 0 0> - , <&key_physical_attrs 100 100 600 205 0 0 0> - , <&key_physical_attrs 100 100 1000 205 0 0 0> - , <&key_physical_attrs 100 100 1100 235 0 0 0> - , <&key_physical_attrs 100 100 1200 215 0 0 0> - , <&key_physical_attrs 100 100 1300 200 0 0 0> - , <&key_physical_attrs 100 100 1400 215 0 0 0> - , <&key_physical_attrs 100 100 1500 235 0 0 0> - , <&key_physical_attrs 100 100 1600 235 0 0 0> - , <&key_physical_attrs 100 100 0 335 0 0 0> - , <&key_physical_attrs 100 100 100 335 0 0 0> - , <&key_physical_attrs 100 100 200 315 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 315 0 0 0> - , <&key_physical_attrs 100 100 500 335 0 0 0> - , <&key_physical_attrs 100 100 600 335 3000 550 435> - , <&key_physical_attrs 100 100 700 335 3000 550 435> - , <&key_physical_attrs 100 100 900 335 (-3000) 1150 435> - , <&key_physical_attrs 100 100 1000 335 (-3000) 1150 435> - , <&key_physical_attrs 100 100 1100 335 0 0 0> - , <&key_physical_attrs 100 100 1200 315 0 0 0> - , <&key_physical_attrs 100 100 1300 300 0 0 0> - , <&key_physical_attrs 100 100 1400 315 0 0 0> - , <&key_physical_attrs 100 100 1500 335 0 0 0> - , <&key_physical_attrs 100 100 1600 335 0 0 0> - , <&key_physical_attrs 100 100 0 435 0 0 0> - , <&key_physical_attrs 100 100 100 435 0 0 0> - , <&key_physical_attrs 100 100 200 415 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 450 435 1000 450 435> - , <&key_physical_attrs 100 100 600 435 3000 550 435> - , <&key_physical_attrs 100 100 700 435 3000 550 435> - , <&key_physical_attrs 100 100 900 435 (-3000) 1150 435> - , <&key_physical_attrs 100 100 1000 435 (-3000) 1150 435> - , <&key_physical_attrs 100 100 1150 435 (-1000) 1250 435> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 415 0 0 0> - , <&key_physical_attrs 100 100 1500 435 0 0 0> - , <&key_physical_attrs 100 100 1600 435 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/redox/redox.conf b/app/boards/shields/redox/redox.conf index 25d3e6c4..a1837ef9 100644 --- a/app/boards/shields/redox/redox.conf +++ b/app/boards/shields/redox/redox.conf @@ -1,2 +1,3 @@ # Uncomment the following lines to enable the Redox RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y \ No newline at end of file diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 5fb87773..d2d72d0f 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -5,17 +5,11 @@ */ #include -#include "redox-layouts.dtsi" - - -&redox_physical_layout { - transform = <&default_transform>; -}; / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &redox_physical_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -38,7 +32,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index 02db9175..c88f703b 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -15,9 +15,8 @@ compatible = "zmk,keymap" ; default_layer { - display-name = "Default Layer"; // -------------------------------------------------------------------------------------------------------------------------------- -// | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | BSPC | +// | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | BKSP | // | TAB | Q | W | E | R | T | ( | --- | ) | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | [ | --- | ] | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | PG_UP | PG_DOWN | --- | HOME | END | N | M | , | . | / | SHFT(RET) | @@ -33,7 +32,6 @@ }; lower_layer { - display-name = "Lower Layer"; // -------------------------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL | // | ESC | 1 | 2 | 3 | 4 | 5 | ( | --- | ) | 6 | 7 | 8 | 9 | 0 | DEL | @@ -50,7 +48,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ---------------------------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL | // | ESC | ! | @ | # | $ | % | ( | --- | ) | ^ | & | * | ( | ) | DEL | @@ -67,7 +64,6 @@ }; adjust_layer { - display-name = "Adjust Layer"; // ----------------------------------------------------------------------------------------- // | F1 | F2 | F3 | F4 | F5 | F6 | --- | F7 | F8 | F9 | F10 | F11 | F12 | // | TAB | | | | | | BOOTL | --- | ) | BT1 | BT2 | BT3 | BT4 | BT5 | OUTPUT TGL | diff --git a/app/boards/shields/reviung34/README.md b/app/boards/shields/reviung34/README.md index a01a7e8b..e62c52d6 100644 --- a/app/boards/shields/reviung34/README.md +++ b/app/boards/shields/reviung34/README.md @@ -7,7 +7,7 @@ By default, the 2x1u layout is used. To use to the 1x2u layout, add the followin ``` / { chosen { - zmk,matrix-transform = &single_2u_transform; + zmk,matrix_transform = &single_2u_transform; }; }; ``` diff --git a/app/boards/shields/reviung34/boards/nice_nano_v2.overlay b/app/boards/shields/reviung34/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..b8d21398 --- /dev/null +++ b/app/boards/shields/reviung34/boards/nice_nano_v2.overlay @@ -0,0 +1,48 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <9>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung34/reviung34-layouts.dtsi b/app/boards/shields/reviung34/reviung34-layouts.dtsi deleted file mode 100644 index cc331fee..00000000 --- a/app/boards/shields/reviung34/reviung34-layouts.dtsi +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - reviung34_dual_1u_layout: reviung34_dual_1u_layout { - compatible = "zmk,physical-layout"; - display-name = "Dual 1U (34 keys)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 35 2 1000 85 52> - , <&key_physical_attrs 100 100 136 1 1000 186 51> - , <&key_physical_attrs 100 100 238 0 1000 288 50> - , <&key_physical_attrs 100 100 333 35 1000 383 85> - , <&key_physical_attrs 100 100 429 71 1000 479 121> - , <&key_physical_attrs 100 100 555 71 (-1000) 605 121> - , <&key_physical_attrs 100 100 650 35 (-1000) 700 85> - , <&key_physical_attrs 100 100 746 0 (-1000) 796 50> - , <&key_physical_attrs 100 100 847 1 (-1000) 897 51> - , <&key_physical_attrs 100 100 949 1 (-1000) 999 51> - , <&key_physical_attrs 100 100 17 100 1000 67 150> - , <&key_physical_attrs 100 100 119 99 1000 169 149> - , <&key_physical_attrs 100 100 221 98 1000 271 148> - , <&key_physical_attrs 100 100 316 134 1000 366 184> - , <&key_physical_attrs 100 100 411 169 1000 461 219> - , <&key_physical_attrs 100 100 572 169 (-1000) 622 219> - , <&key_physical_attrs 100 100 668 134 (-1000) 718 184> - , <&key_physical_attrs 100 100 763 98 (-1000) 813 148> - , <&key_physical_attrs 100 100 865 99 (-1000) 915 149> - , <&key_physical_attrs 100 100 966 100 (-1000) 1016 150> - , <&key_physical_attrs 100 100 0 198 1000 50 248> - , <&key_physical_attrs 100 100 102 198 1000 152 248> - , <&key_physical_attrs 100 100 203 197 1000 253 247> - , <&key_physical_attrs 100 100 298 232 1000 348 282> - , <&key_physical_attrs 100 100 394 268 1000 444 318> - , <&key_physical_attrs 100 100 590 268 (-1000) 640 318> - , <&key_physical_attrs 100 100 685 232 (-1000) 735 282> - , <&key_physical_attrs 100 100 780 197 (-1000) 830 247> - , <&key_physical_attrs 100 100 882 198 (-1000) 932 248> - , <&key_physical_attrs 100 100 984 198 (-1000) 1034 248> - , <&key_physical_attrs 100 100 328 370 1500 378 420> - , <&key_physical_attrs 100 100 442 385 0 0 0> - , <&key_physical_attrs 100 100 542 385 0 0 0> - , <&key_physical_attrs 100 100 655 370 (-1500) 705 420> - ; - }; - - reviung34_single_2u_layout: reviung34_single_2u_layout { - compatible = "zmk,physical-layout"; - display-name = "Single 2U (33 keys)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 35 2 1000 85 52> - , <&key_physical_attrs 100 100 136 1 1000 186 51> - , <&key_physical_attrs 100 100 238 0 1000 288 50> - , <&key_physical_attrs 100 100 333 35 1000 383 85> - , <&key_physical_attrs 100 100 429 71 1000 479 121> - , <&key_physical_attrs 100 100 555 71 (-1000) 605 121> - , <&key_physical_attrs 100 100 650 35 (-1000) 700 85> - , <&key_physical_attrs 100 100 746 0 (-1000) 796 50> - , <&key_physical_attrs 100 100 847 1 (-1000) 897 51> - , <&key_physical_attrs 100 100 949 1 (-1000) 999 51> - , <&key_physical_attrs 100 100 17 100 1000 67 150> - , <&key_physical_attrs 100 100 119 99 1000 169 149> - , <&key_physical_attrs 100 100 221 98 1000 271 148> - , <&key_physical_attrs 100 100 316 134 1000 366 184> - , <&key_physical_attrs 100 100 411 169 1000 461 219> - , <&key_physical_attrs 100 100 572 169 (-1000) 622 219> - , <&key_physical_attrs 100 100 668 134 (-1000) 718 184> - , <&key_physical_attrs 100 100 763 98 (-1000) 813 148> - , <&key_physical_attrs 100 100 865 99 (-1000) 915 149> - , <&key_physical_attrs 100 100 966 100 (-1000) 1016 150> - , <&key_physical_attrs 100 100 0 198 1000 50 248> - , <&key_physical_attrs 100 100 102 198 1000 152 248> - , <&key_physical_attrs 100 100 203 197 1000 253 247> - , <&key_physical_attrs 100 100 298 232 1000 348 282> - , <&key_physical_attrs 100 100 394 268 1000 444 318> - , <&key_physical_attrs 100 100 590 268 (-1000) 640 318> - , <&key_physical_attrs 100 100 685 232 (-1000) 735 282> - , <&key_physical_attrs 100 100 780 197 (-1000) 830 247> - , <&key_physical_attrs 100 100 882 198 (-1000) 932 248> - , <&key_physical_attrs 100 100 984 198 (-1000) 1034 248> - , <&key_physical_attrs 100 100 328 370 1500 378 420> - , <&key_physical_attrs 200 100 442 385 0 0 0> - , <&key_physical_attrs 100 100 655 370 (-1500) 705 420> - ; - }; - - reviung34_position_map { - compatible = "zmk,physical-layout-position-map"; - - reviung34_dual_1u_posmap { - physical-layout = <&reviung34_dual_1u_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28 29> - , <30 31 33 32>; - }; - - reviung34_single_2u_posmap { - physical-layout = <&reviung34_single_2u_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28 29> - , <30 31 32>; - }; - }; -}; diff --git a/app/boards/shields/reviung34/reviung34.conf b/app/boards/shields/reviung34/reviung34.conf index 6ca70f41..289f070b 100644 --- a/app/boards/shields/reviung34/reviung34.conf +++ b/app/boards/shields/reviung34/reviung34.conf @@ -1,2 +1,3 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung34/reviung34.keymap b/app/boards/shields/reviung34/reviung34.keymap index f7820d35..eefc510a 100644 --- a/app/boards/shields/reviung34/reviung34.keymap +++ b/app/boards/shields/reviung34/reviung34.keymap @@ -12,11 +12,11 @@ / { chosen { // 34 keys. - zmk,matrix-transform = &dual_1u_transform; + zmk,matrix_transform = &dual_1u_transform; // 33 keys. Center two thumb keys replaced by a single 2u key. Remember to adjust your // keymap accordingly! - // zmk,matrix-transform = &single_2u_transform; + // zmk,matrix_transform = &single_2u_transform; }; }; @@ -25,7 +25,7 @@ compatible = "zmk,keymap"; base { - display-name = "Base"; + label = "Base"; bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI @@ -35,7 +35,7 @@ }; lower { - display-name = "Lower"; + label = "Lower"; bindings = < &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &trans &kp TILDE &kp DQT &kp PIPE &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC @@ -45,7 +45,7 @@ }; upper { - display-name = "Upper"; + label = "Upper"; bindings = < &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp GRAVE &kp SQT &kp BSLH &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT @@ -55,7 +55,7 @@ }; function { - display-name = "Function"; + label = "Function"; bindings = < &kp TAB &trans &kp C_VOL_UP &trans &trans &trans &trans &trans &trans &kp ENTER &kp ESC &kp C_BRI_DN &kp C_VOL_DN &kp C_BRI_UP &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT @@ -65,7 +65,7 @@ }; meta { - display-name = "Meta"; + label = "Meta"; bindings = < &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &none &none &none &none &none &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 diff --git a/app/boards/shields/reviung34/reviung34.overlay b/app/boards/shields/reviung34/reviung34.overlay index 0e800a7d..46d85996 100644 --- a/app/boards/shields/reviung34/reviung34.overlay +++ b/app/boards/shields/reviung34/reviung34.overlay @@ -6,20 +6,10 @@ #include -#include "reviung34-layouts.dtsi" - -&reviung34_dual_1u_layout { - transform = <&dual_1u_transform>; -}; - -&reviung34_single_2u_layout { - transform = <&single_2u_transform>; -}; - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = &reviung34_dual_1u_layout; + zmk,matrix_transform = &dual_1u_transform; }; dual_1u_transform: keymap_transform_0 { @@ -48,8 +38,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(3,7) kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/reviung41/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/reviung41/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/reviung41/boards/nice_nano.overlay index 59180064..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..8590149e --- /dev/null +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung41/reviung41.conf b/app/boards/shields/reviung41/reviung41.conf index 6ca70f41..289f070b 100644 --- a/app/boards/shields/reviung41/reviung41.conf +++ b/app/boards/shields/reviung41/reviung41.conf @@ -1,2 +1,3 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index 673c76f4..12f15ad4 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -14,9 +14,8 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------- -// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | SHFT(RET) | // | ALT | LWR | SPC | RSE | ALT | @@ -29,7 +28,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------ // | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | // | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | @@ -44,12 +42,11 @@ }; raise_layer { - display-name = "Raise Layer"; // ---------------------------------------------------------------------------- // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 | // | | ESC | GUI | ALT | CAPS| " | | F7 | F8 | F9 | F10 | F11 | F12 | -// | | ADJ | BSPC | | | +// | | ADJ | BKSP | | | bindings = < &trans &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 @@ -59,7 +56,6 @@ }; adjust_layer { - display-name = "Adjust Layer"; // ----------------------------------------------------------------------------------------- // | RGB BRI+ | RGB SAT+ | RGB HUE+ | RGB ANI+ | | RGB TOG | | BT1 | BT2 | BT3 | BT4 | BT5 | BT CLR | // | RGB BRI- | RGB SAT- | RGB HUE- | RGB ANI- | | | | | | | | | | diff --git a/app/boards/shields/reviung41/reviung41.overlay b/app/boards/shields/reviung41/reviung41.overlay index b8a499e9..55900cc9 100644 --- a/app/boards/shields/reviung41/reviung41.overlay +++ b/app/boards/shields/reviung41/reviung41.overlay @@ -6,16 +6,10 @@ #include -#include - ->ips_reviung41_layout { - transform = <&default_transform>; -}; - / { chosen { zmk,kscan = &kscan0; - zmk,physical-layout = >ips_reviung41_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -33,8 +27,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/reviung41/reviung41.zmk.yml b/app/boards/shields/reviung41/reviung41.zmk.yml index ccbc1f41..9783b9d9 100644 --- a/app/boards/shields/reviung41/reviung41.zmk.yml +++ b/app/boards/shields/reviung41/reviung41.zmk.yml @@ -6,4 +6,3 @@ url: https://github.com/gtips/reviung/tree/master/reviung41 requires: [pro_micro] features: - keys - - studio diff --git a/app/boards/shields/reviung5/reviung5.conf b/app/boards/shields/reviung5/reviung5.conf index 78ebd1d1..a8b4a868 100644 --- a/app/boards/shields/reviung5/reviung5.conf +++ b/app/boards/shields/reviung5/reviung5.conf @@ -1,6 +1,3 @@ -# Uncomment the following two lines to add support for encoders +# Encoder support. Uncomment to enable. # CONFIG_EC11=y # CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y - -# Uncomment the following two lines to enable RGB underglow -# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/reviung5/reviung5.keymap b/app/boards/shields/reviung5/reviung5.keymap index 33701677..93669479 100644 --- a/app/boards/shields/reviung5/reviung5.keymap +++ b/app/boards/shields/reviung5/reviung5.keymap @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 The ZMK Contributors + * Copyright (c) 2022 The ZMK Contributors * * SPDX-License-Identifier: MIT */ @@ -8,52 +8,31 @@ #include #include #include -#include #define BASE 0 #define BLE 1 -#define RGB 2 / { - - behaviors { - rgb_encoder: rgb_encoder { - compatible = "zmk,behavior-sensor-rotate"; - #sensor-binding-cells = <0>; - bindings = <&rgb_ug RGB_BRI>, <&rgb_ug RGB_BRD>; - }; - }; - keymap { compatible = "zmk,keymap"; base_layer { - display-name = "BASE"; + label = "BASE"; bindings = < - // ╭─────────┬────────────────┬──────────────────┬────────────┬────────────────╮ - &mo BLE &kp C_PREVIOUS &kp C_PLAY_PAUSE &kp C_NEXT < RGB C_MUTE - // ╰─────────┴────────────────┴──────────────────┴────────────┴────────────────╯ + // ╭─────────────┬──────────────┬──────────────────┬─────────────┬─────────────╮ + &mo BLE &kp C_PREVIOUS &kp C_PLAY_PAUSE &kp C_NEXT &kp C_MUTE + // ╰─────────────┴──────────────┴──────────────────┴─────────────┴─────────────╯ >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; ble_layer { - display-name = "BLE"; + label = "BLE"; bindings = < - // ╭────────┬──────────────┬────────────┬────────────┬────────────╮ - &trans &out OUT_TOG &bt BT_PRV &bt BT_NXT &bt BT_CLR - // ╰────────┴──────────────┴────────────┴────────────┴────────────╯ + // ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ + &trans &out OUT_TOG &bt BT_PRV &bt BT_NXT &bt BT_CLR + // ╰─────────────┴─────────────┴─────────────┴─────────────┴─────────────╯ >; }; - - rgb_layer { - display-name = "RGB"; - bindings = < - // ╭──────────────────┬─────────────────┬─────────────────┬──────────────────────────────────┬────────╮ - &rgb_ug RGB_TOG &rgb_ug RGB_EFR &rgb_ug RGB_EFF &rgb_ug RGB_COLOR_HSB(307,89,98) &trans - // ╰──────────────────┴─────────────────┴─────────────────┴──────────────────────────────────┴────────╯ - >; - sensor-bindings = <&rgb_encoder>; - }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/reviung5/reviung5.overlay b/app/boards/shields/reviung5/reviung5.overlay index 0abd3a06..8b885245 100644 --- a/app/boards/shields/reviung5/reviung5.overlay +++ b/app/boards/shields/reviung5/reviung5.overlay @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -22,7 +22,7 @@ kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -40,6 +40,7 @@ encoder: encoder { compatible = "alps,ec11"; + label = "encoder"; a-gpios = <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; diff --git a/app/boards/shields/reviung5/reviung5.zmk.yml b/app/boards/shields/reviung5/reviung5.zmk.yml index bf332f23..9be3811f 100644 --- a/app/boards/shields/reviung5/reviung5.zmk.yml +++ b/app/boards/shields/reviung5/reviung5.zmk.yml @@ -7,4 +7,3 @@ requires: [pro_micro] features: - keys - encoder - - underglow diff --git a/app/boards/shields/reviung53/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/reviung53/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/reviung53/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/reviung53/boards/nice_nano.overlay index 24905ac2..4df91903 100644 --- a/app/boards/shields/reviung53/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/reviung53/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/reviung53/boards/nice_nano_v2.overlay b/app/boards/shields/reviung53/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..4df91903 --- /dev/null +++ b/app/boards/shields/reviung53/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung53/reviung53.conf b/app/boards/shields/reviung53/reviung53.conf index 6ca70f41..289f070b 100644 --- a/app/boards/shields/reviung53/reviung53.conf +++ b/app/boards/shields/reviung53/reviung53.conf @@ -1,2 +1,3 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung53/reviung53.keymap b/app/boards/shields/reviung53/reviung53.keymap index 001c531a..d00ca6b9 100644 --- a/app/boards/shields/reviung53/reviung53.keymap +++ b/app/boards/shields/reviung53/reviung53.keymap @@ -22,10 +22,9 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ---------------------------------------------------------------------------------------- // | | | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | DEL | -// | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | +// | TAB | Q | W | E | R | T | Y | U | I | O | P | BKSP | // | CAPS | A | S | D | F | G | H | J | K | L | ; | RET | // | SHFT | Z | X | C | V | B | N | M | , | . | SHFT(/) | // | CTRL | GUI | ALT | LOWER(SPACE) | RAISE(SPACE)| ALT | GUI | CTRL(\) | @@ -40,7 +39,6 @@ }; lower_layer { - display-name = "Lower Layer"; // -------------------------------------------------------------------------------------------- // | | | | F9 | F10 | F11 | F12 | INS | PAU | SCR | PSCR | | // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | @@ -58,7 +56,6 @@ }; raise_layer { - display-name = "Raise Layer"; // -------------------------------------------------------------------------------------- // | | | | F9 | F10 | F11 | F12 | MUTE | VOL+ | VOL- | PLAY | | // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | @@ -76,7 +73,6 @@ }; adjust_layer { - display-name = "Adjust Layer"; // ------------------------------------------------------------------------------------------------------------------------ // | | | BT CLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | BT CLR | // | RGB BRI+ | RGB SAT+ | RGB HUE+ | RGB ANI+ | | RGB TOG | | | | | | | @@ -94,7 +90,6 @@ }; nav_layer { - display-name = "Nav Layer"; // ------------------------------------------------------------------------------------------------------------------------ // | | | ESC | | | | | | | | | DEL | // | TAB | | UP | | | | | | | | | BSPC | @@ -111,4 +106,4 @@ >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/reviung53/reviung53.overlay b/app/boards/shields/reviung53/reviung53.overlay index fa784478..213b3b81 100644 --- a/app/boards/shields/reviung53/reviung53.overlay +++ b/app/boards/shields/reviung53/reviung53.overlay @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -28,8 +28,7 @@ RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) kscan0: kscan_0 { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - + label = "KSCAN"; diode-direction = "col2row"; col-gpios diff --git a/app/boards/shields/romac/romac.keymap b/app/boards/shields/romac/romac.keymap index 3f656752..e48368a8 100644 --- a/app/boards/shields/romac/romac.keymap +++ b/app/boards/shields/romac/romac.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------- // | 7 | 8 | 9 | // | 4 | 5 | 6 | @@ -29,7 +28,6 @@ }; nav_layer { - display-name = "Nav Layer"; // ----------------------- // | BTNXT | HOME | PGUP | // | BTPRV | END | PGDN | diff --git a/app/boards/shields/romac/romac.overlay b/app/boards/shields/romac/romac.overlay index 8c11a8ac..480d3f84 100644 --- a/app/boards/shields/romac/romac.overlay +++ b/app/boards/shields/romac/romac.overlay @@ -13,7 +13,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/romac_plus/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/romac_plus/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/romac_plus.dtsi b/app/boards/shields/romac_plus/romac_plus.dtsi index a2624258..5324174b 100644 --- a/app/boards/shields/romac_plus/romac_plus.dtsi +++ b/app/boards/shields/romac_plus/romac_plus.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -27,6 +27,7 @@ RC(3,0) RC(3,1) RC(3,2) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -39,6 +40,7 @@ RC(3,0) RC(3,1) RC(3,2) left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; diff --git a/app/boards/shields/romac_plus/romac_plus.keymap b/app/boards/shields/romac_plus/romac_plus.keymap index fd63e78b..039f6eb6 100644 --- a/app/boards/shields/romac_plus/romac_plus.keymap +++ b/app/boards/shields/romac_plus/romac_plus.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // -------------------------- // | 7 | 8 | 9 | // | 4 | 5 | 6 | @@ -31,7 +30,6 @@ }; nav_layer { - display-name = "Nav Layer"; // -------------------------- // | BT_CLR | HOME | PGUP | // | _ | END | PGDN | @@ -48,4 +46,4 @@ sensor-bindings = <&inc_dec_kp A B>; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/romac_plus/romac_plus.overlay b/app/boards/shields/romac_plus/romac_plus.overlay index 39e123c0..2308e284 100644 --- a/app/boards/shields/romac_plus/romac_plus.overlay +++ b/app/boards/shields/romac_plus/romac_plus.overlay @@ -13,7 +13,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; diff --git a/app/boards/shields/settings_reset/settings_reset.conf b/app/boards/shields/settings_reset/settings_reset.conf index d4b2acd8..8052a6cf 100644 --- a/app/boards/shields/settings_reset/settings_reset.conf +++ b/app/boards/shields/settings_reset/settings_reset.conf @@ -1,6 +1 @@ -CONFIG_SETTINGS=y -CONFIG_ZMK_SETTINGS_RESET_ON_START=y -# Disable BLE so splits don't try to re-pair until normal firmware is flashed. -CONFIG_ZMK_BLE=n -# Disable displays so status screens that rely on BLE do not fail the build. -CONFIG_ZMK_DISPLAY=n +CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START=y diff --git a/app/boards/shields/settings_reset/settings_reset.overlay b/app/boards/shields/settings_reset/settings_reset.overlay index 8e129562..48a5f223 100644 --- a/app/boards/shields/settings_reset/settings_reset.overlay +++ b/app/boards/shields/settings_reset/settings_reset.overlay @@ -8,11 +8,12 @@ / { chosen { - zmk,kscan = &settings_reset_kscan; + zmk,kscan = &kscan0; }; - settings_reset_kscan: settings_reset_kscan { + kscan0: kscan { compatible = "zmk,kscan-mock"; + label = "KSCAN"; columns = <1>; rows = <0>; diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index 0338df48..e21111e9 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/snap/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/snap/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/snap/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/snap/boards/nice_nano.overlay index 924151c7..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..1a51eb16 --- /dev/null +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/snap.conf b/app/boards/shields/snap/snap.conf index 64c7602b..e76bccb4 100644 --- a/app/boards/shields/snap/snap.conf +++ b/app/boards/shields/snap/snap.conf @@ -12,5 +12,6 @@ # Uncomment the following lines to enable the RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP=5 -# CONFIG_ZMK_RGB_UNDERGLOW_SPD_START=1 +# CONFIG_ZMK_RGB_UNDERGLOW_SPD_START=1 \ No newline at end of file diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 90eec5ae..7523f35b 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -10,17 +10,19 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan_composite; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; steps = <80>; status = "disabled"; }; right_encoder: encoder_right { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; steps = <80>; status = "disabled"; }; @@ -49,6 +51,7 @@ RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) kscan_composite: kscan { compatible = "zmk,kscan-composite"; + label = "KSCAN"; rows = <6>; columns = <17>; @@ -59,6 +62,7 @@ RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) kscan_demux: kscan_demux { compatible = "zmk,kscan-gpio-demux"; + label = "DEMUX"; polling-interval-msec = <25>; }; }; @@ -69,6 +73,7 @@ RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -76,7 +81,6 @@ RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) display-offset = <0>; multiplex-ratio = <31>; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index b5c6396a..febaff97 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -10,7 +10,7 @@ #include / { - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; triggers-per-rotation = <20>; @@ -20,7 +20,7 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default"; + label = "Default"; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp KP_NUM &kp PAUSE_BREAK @@ -33,7 +33,7 @@ }; function_layer { - display-name = "Function"; + label = "Function"; sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index 27955de2..ad04ae24 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -9,6 +9,7 @@ / { kscan_direct: kscan_direct { compatible = "zmk,kscan-gpio-direct"; + label = "DIRECT"; input-gpios = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> ; @@ -23,7 +24,7 @@ kscan_direct: kscan_direct { direct { kscan = <&kscan_direct>; row-offset = <1>; - col-offset = <8>; + column-offset = <8>; }; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 767ea35a..4e7bf884 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL @@ -43,4 +46,10 @@ endchoice endif # LVGL +if ZMK_RGB_UNDERGLOW + +config WS2812_STRIP + default y +endif + endif diff --git a/app/boards/shields/sofle/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/sofle/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/sofle/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/sofle/boards/nice_nano.overlay index f00f59f4..336be4b0 100644 --- a/app/boards/shields/sofle/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/sofle/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay b/app/boards/shields/sofle/boards/nice_nano_v2.overlay similarity index 97% rename from app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay rename to app/boards/shields/sofle/boards/nice_nano_v2.overlay index f00f59f4..336be4b0 100644 --- a/app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay +++ b/app/boards/shields/sofle/boards/nice_nano_v2.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay b/app/boards/shields/sofle/boards/nrfmicro_11.overlay similarity index 97% rename from app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay rename to app/boards/shields/sofle/boards/nrfmicro_11.overlay index f00f59f4..336be4b0 100644 --- a/app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay +++ b/app/boards/shields/sofle/boards/nrfmicro_11.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/sofle/boards/nrfmicro_13.overlay b/app/boards/shields/sofle/boards/nrfmicro_13.overlay new file mode 100644 index 00000000..336be4b0 --- /dev/null +++ b/app/boards/shields/sofle/boards/nrfmicro_13.overlay @@ -0,0 +1,51 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <36>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = < + LED_COLOR_ID_GREEN + LED_COLOR_ID_RED + LED_COLOR_ID_BLUE + >; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/sofle/sofle.dtsi b/app/boards/shields/sofle/sofle.dtsi index 9527f26b..4917ca32 100644 --- a/app/boards/shields/sofle/sofle.dtsi +++ b/app/boards/shields/sofle/sofle.dtsi @@ -5,16 +5,12 @@ */ #include -#include - -&josefadamcik_sofle_layout { - transform = <&default_transform>; -}; / { chosen { zephyr,display = &oled; zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -37,7 +33,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -51,6 +47,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -59,6 +56,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) right_encoder: encoder_right { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -78,6 +76,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -87,7 +86,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/sofle/sofle.keymap b/app/boards/shields/sofle/sofle.keymap index 8cc1c028..fbb0af7f 100644 --- a/app/boards/shields/sofle/sofle.keymap +++ b/app/boards/shields/sofle/sofle.keymap @@ -30,7 +30,7 @@ compatible = "zmk,keymap"; default_layer { - display-name = "default"; + label = "default"; // ------------------------------------------------------------------------------------------------------------ // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | ESC | Q | W | E | R | T | | Y | U | I | O | P | BKSPC | @@ -49,7 +49,7 @@ }; lower_layer { - display-name = "lower"; + label = "lower"; // TODO: Some binds are waiting for shifted keycode support. // ------------------------------------------------------------------------------------------------------------ // | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | @@ -58,18 +58,18 @@ // | | = | - | + | { | } | | | | [ | ] | ; | : | \ | | // | | | | | | | | | | | | bindings = < -&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 -&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp F12 -&trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp PIPE -&trans &kp EQUAL &kp MINUS &kp PLUS &kp LBRC &kp RBRC &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp COLON &kp BSLH &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp F12 +&trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp PIPE +&trans &kp EQUAL &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp COLON &kp BSLH &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; raise_layer { - display-name = "raise"; + label = "raise"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | | INS | PSCR | GUI | | | | PGUP | | ^ | | | | @@ -78,7 +78,7 @@ // | | | | | | | | | | | | bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans -&trans &kp INS &kp PSCRN &kp K_CMENU &trans &trans &kp PG_UP &trans &kp UP &trans &trans &trans +&trans &kp INS &kp PSCRN &kp K_CMENU &trans &trans &kp PG_UP &trans &kp UP &trans &kp N0 &trans &trans &kp LALT &kp LCTRL &kp LSHFT &trans &kp CLCK &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans @@ -94,7 +94,7 @@ // | | RGB_BRD | RGB_BRI | | | | | | | | | | | // | | | | | | | RGB_TOG | | | | | | | | | // | | | | | | | | | | | | - display-name = "adjust"; + label = "adjust"; bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &none &none &none &none &none &ext_power EP_TOG &rgb_ug RGB_HUD &rgb_ug RGB_HUI &rgb_ug RGB_SAD &rgb_ug RGB_SAI &rgb_ug RGB_EFF &none &none &none &none &none &none diff --git a/app/boards/shields/sofle/sofle.zmk.yml b/app/boards/shields/sofle/sofle.zmk.yml index f08689cb..47b66d67 100644 --- a/app/boards/shields/sofle/sofle.zmk.yml +++ b/app/boards/shields/sofle/sofle.zmk.yml @@ -10,7 +10,6 @@ features: - display - encoder - underglow - - studio siblings: - sofle_left - sofle_right diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index addfb8d1..a28792c7 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -16,6 +16,10 @@ if SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT config ZMK_SPLIT default y +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + config ZMK_DISPLAY if ZMK_DISPLAY @@ -26,6 +30,9 @@ config SSD1306 config I2C default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -33,7 +40,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi index f57cd235..3eefdc6a 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -6,22 +6,11 @@ #include -#include -#include - -&foostan_corne_6col_layout { - transform = <&default_transform>; -}; - -&foostan_corne_5col_layout { - transform = <&five_column_transform>; -}; - / { chosen { zephyr,display = &oled; - zmk,physical-layout = &foostan_corne_6col_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -58,6 +47,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 left_encoder: left_encoder { compatible = "alps,ec11"; + label = "L_ENCODER"; steps = <80>; status = "disabled"; @@ -67,6 +57,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 right_encoder: right_encoder { compatible = "alps,ec11"; + label = "R_ENCODER"; steps = <80>; status = "disabled"; @@ -87,6 +78,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -96,7 +88,6 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap index fa6d4744..0555cf41 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -13,9 +13,8 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ----------------------------------------------------------------------------------------- -// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | GUI | LWR | SPC | | ENT | RSE | ALT | @@ -27,9 +26,8 @@ >; }; lower_layer { - display-name = "Lower Layer"; // ----------------------------------------------------------------------------------------- -// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC | +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | SHFT | | | | | | | | | | | | | // | GUI | | SPC | | ENT | | ALT | @@ -42,16 +40,15 @@ }; raise_layer { - display-name = "Raise Layer"; // ----------------------------------------------------------------------------------------- -// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC | +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | GUI | | SPC | | ENT | | ALT | bindings = < - &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp BSPC - &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE - &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC + &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE + &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml index 242837a4..cc141826 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml @@ -7,7 +7,6 @@ requires: [pro_micro] exposes: [i2c_oled] features: - keys - - studio siblings: - splitkb_aurora_corne_left - splitkb_aurora_corne_right diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index ec40a016..89563f42 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index 7341f072..e05df223 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig index d9bb0eac..6d7a5569 100644 --- a/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig @@ -16,6 +16,10 @@ if SHIELD_SPLITKB_AURORA_HELIX_LEFT || SHIELD_SPLITKB_AURORA_HELIX_RIGHT config ZMK_SPLIT default y +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + if ZMK_DISPLAY config SSD1306 @@ -24,6 +28,9 @@ config SSD1306 config I2C default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL diff --git a/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/splitkb_aurora_helix/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay index 8228d530..8f1629ce 100644 --- a/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay similarity index 97% rename from app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay index 8228d530..8f1629ce 100644 --- a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi index 34781ecd..e580e87d 100644 --- a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi @@ -10,7 +10,7 @@ chosen { zephyr,display = &oled; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -33,6 +33,7 @@ left_encoder: left_encoder { compatible = "alps,ec11"; + label = "L_ENCODER"; steps = <144>; status = "disabled"; @@ -42,6 +43,7 @@ right_encoder: right_encoder { compatible = "alps,ec11"; + label = "R_ENCODER"; steps = <144>; status = "disabled"; @@ -49,7 +51,7 @@ b-gpios = <&pro_micro 14 GPIO_PULL_UP>; }; - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; triggers-per-rotation = <36>; @@ -62,6 +64,7 @@ oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -71,7 +74,6 @@ segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap index cbbb8d81..edec8fec 100644 --- a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap @@ -33,7 +33,6 @@ As such, those are in use within the default layer at this time.*/ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | @@ -49,7 +48,6 @@ As such, those are in use within the default layer at this time.*/ >; }; lower_layer { - display-name = "Lower Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | | | | | | | | | | | | | // | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | @@ -65,7 +63,6 @@ As such, those are in use within the default layer at this time.*/ >; }; raise_layer { - display-name = "Raise Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | @@ -81,7 +78,6 @@ As such, those are in use within the default layer at this time.*/ >; }; adjust_layer { - display-name = "Adjust Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | EP TOG | // | BT CLR | BT SEL0 | BT SEL1 | BT SEL2 | BGT SEL3 | BT SEL4 | | RGB EFF+ | RGB HUE+ | RGB SAT+ | RGB SPD+ | RGB BRI+ | RGB TOG | diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay index 61b663e6..c9830658 100644 --- a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay index 5aee19bd..48572de9 100644 --- a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 9edcf346..e54e2b43 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -16,6 +16,10 @@ if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT config ZMK_SPLIT default y +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + config ZMK_DISPLAY if ZMK_DISPLAY @@ -26,6 +30,9 @@ config SSD1306 config I2C default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -33,7 +40,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index fa6ac6dc..0eafa704 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -26,6 +26,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..6601d27d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi index b270890d..06b3ef39 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -6,13 +6,11 @@ #include -#include - / { chosen { zephyr,display = &oled; - zmk,physical-layout = &kata0510_lily58_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -35,6 +33,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) left_encoder: left_encoder { compatible = "alps,ec11"; + label = "L_ENCODER"; steps = <80>; status = "disabled"; @@ -44,6 +43,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) right_encoder: right_encoder { compatible = "alps,ec11"; + label = "R_ENCODER"; steps = <80>; status = "disabled"; @@ -58,16 +58,13 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) }; }; -&kata0510_lily58_layout { - transform = <&default_transform>; -}; - &pro_micro_i2c { status = "okay"; oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -77,7 +74,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap index 1a18e1df..b8a9103b 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -14,7 +14,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | @@ -33,7 +32,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -52,7 +50,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml index 2e9c5c64..47d49a4c 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml @@ -7,7 +7,6 @@ requires: [pro_micro] exposes: [i2c_oled] features: - keys - - studio siblings: - splitkb_aurora_lily58_left - splitkb_aurora_lily58_right diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 8d56890f..c4f12dda 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "row2col"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index 6b719020..09da298c 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "row2col"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig index 603c35c7..b53c4c8d 100644 --- a/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig @@ -16,6 +16,10 @@ if SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT config ZMK_SPLIT default y +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + if ZMK_DISPLAY config SSD1306 @@ -24,6 +28,9 @@ config SSD1306 config I2C default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi index a40d29ae..798cd84e 100644 --- a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi @@ -6,17 +6,11 @@ #include -#include - -&josefadamcik_sofle_layout { - transform = <&default_transform>; -}; - / { chosen { zephyr,display = &oled; - zmk,physical-layout = &josefadamcik_sofle_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -39,6 +33,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) left_encoder: left_encoder { compatible = "alps,ec11"; + label = "L_ENCODER"; steps = <144>; status = "disabled"; @@ -48,6 +43,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) right_encoder: right_encoder { compatible = "alps,ec11"; + label = "R_ENCODER"; steps = <144>; status = "disabled"; @@ -55,7 +51,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) b-gpios = <&pro_micro 10 GPIO_PULL_UP>; }; - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; triggers-per-rotation = <36>; @@ -68,6 +64,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -77,7 +74,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap index 61cdebd2..23127416 100644 --- a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap @@ -22,7 +22,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | @@ -41,7 +40,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -60,7 +58,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml index 0f54b4b8..d832d3e1 100644 --- a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml @@ -10,7 +10,6 @@ features: - display - encoder - underglow - - studio siblings: - splitkb_aurora_sofle_left - splitkb_aurora_sofle_right diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay index 2a3f485d..1adaf401 100644 --- a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay index 6eb0d113..3249b941 100644 --- a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index c84cf94c..83cb1bf6 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -16,6 +16,10 @@ if SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT config ZMK_SPLIT default y +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + config ZMK_DISPLAY if ZMK_DISPLAY @@ -26,6 +30,9 @@ config SSD1306 config I2C default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -33,7 +40,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_nrf52840_zmk.overlay deleted file mode 100644 index 424a617b..00000000 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_nrf52840_zmk.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..810340f9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi index c00b73f9..c5483af5 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -6,16 +6,11 @@ #include -#include - -&cuddlykeyboards_ferris_layout { - transform = <&default_transform>; -}; - / { + chosen { zephyr,display = &oled; - zmk,physical-layout = &cuddlykeyboards_ferris_layout; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -32,24 +27,28 @@ left_encoder1: left_encoder1 { compatible = "alps,ec11"; + label = "L_ENCODER1"; steps = <80>; status = "disabled"; }; left_encoder2: left_encoder2 { compatible = "alps,ec11"; + label = "L_ENCODER2"; steps = <80>; status = "disabled"; }; right_encoder1: right_encoder1 { compatible = "alps,ec11"; + label = "R_ENCODER1"; steps = <80>; status = "disabled"; }; right_encoder2: right_encoder2 { compatible = "alps,ec11"; + label = "R_ENCODER2"; steps = <80>; status = "disabled"; }; @@ -67,6 +66,7 @@ oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <32>; segment-offset = <0>; @@ -76,7 +76,6 @@ segment-remap; com-invdir; com-sequential; - inversion-on; prechargep = <0x22>; }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 0e719f30..4b57beac 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -11,7 +11,7 @@ &mt { // flavor = "tap-preferred"; - // tapping-term-ms = <200>; + // tapping_term_ms = <200>; }; / { @@ -63,39 +63,35 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT - &mt LSHFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt LSHFT RET - &mo 1 &kp LCTRL &kp SPACE &mo 2 + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT + &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET + &mo 1 &kp LCTL &kp SPC &mo 2 >; }; left_layer { - display-name = "Left Layer"; bindings = < - &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp DEL + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL &mo 1 &kp LGUI &kp RGUI &mo 2 >; }; right_layer { - display-name = "Right Layer"; bindings = < - &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR - &kp HASH &kp QMARK &kp FSLH &kp COLON &kp SEMI &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BSPC - &kp LSHFT &kp KP_PLUS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTRL &kp SPACE &mo 2 + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP + &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTL &kp SPC &mo 2 >; }; tri_layer { - display-name = "Tri Layer"; bindings = < - &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &trans &trans &trans &trans &trans + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml index b0295b56..97d3c53b 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml @@ -7,7 +7,6 @@ requires: [pro_micro] exposes: [i2c_oled] features: - keys - - studio siblings: - splitkb_aurora_sweep_left - splitkb_aurora_sweep_right diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 9c1fd975..f62d24fa 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -13,8 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "row2col"; row-gpios diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index b280b42d..ff1d16d3 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -13,7 +13,8 @@ kscan: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + + label = "KSCAN"; diode-direction = "row2col"; row-gpios diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 1a4f3af1..abc3b7f7 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -9,7 +9,7 @@ / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -34,7 +34,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "row2col"; row-gpios diff --git a/app/boards/shields/splitreus62/splitreus62.keymap b/app/boards/shields/splitreus62/splitreus62.keymap index 2a017881..c7bdb443 100644 --- a/app/boards/shields/splitreus62/splitreus62.keymap +++ b/app/boards/shields/splitreus62/splitreus62.keymap @@ -13,13 +13,12 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT | -// | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BSPC| | RET | SPC | LBKT | RBKT | LBKT | HOME | END | +// | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BKSP| | RET | SPC | LBKT | RBKT | LBKT | HOME | END | bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH diff --git a/app/boards/shields/tester_pro_micro/Kconfig.defconfig b/app/boards/shields/tester_pro_micro/Kconfig.defconfig deleted file mode 100644 index d1103ac1..00000000 --- a/app/boards/shields/tester_pro_micro/Kconfig.defconfig +++ /dev/null @@ -1,12 +0,0 @@ -if SHIELD_TESTER_PRO_MICRO - -config ZMK_KEYBOARD_NAME - default "ZMK Tester" - -config ZMK_BLE - def_bool n - -config SETTINGS - def_bool n - -endif \ No newline at end of file diff --git a/app/boards/shields/tester_pro_micro/Kconfig.shield b/app/boards/shields/tester_pro_micro/Kconfig.shield deleted file mode 100644 index 68afa488..00000000 --- a/app/boards/shields/tester_pro_micro/Kconfig.shield +++ /dev/null @@ -1,2 +0,0 @@ -config SHIELD_TESTER_PRO_MICRO - def_bool $(shields_list_contains,tester_pro_micro) \ No newline at end of file diff --git a/app/boards/shields/tester_pro_micro/tester_pro_micro-layouts.dtsi b/app/boards/shields/tester_pro_micro/tester_pro_micro-layouts.dtsi deleted file mode 100644 index 9892295d..00000000 --- a/app/boards/shields/tester_pro_micro/tester_pro_micro-layouts.dtsi +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - tester_position_map { - compatible = "zmk,physical-layout-position-map"; - complete; - - pinout_map: pinout_positions { - physical-layout = <&physical_layout0>; - positions = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17>; - }; - inline_map: single_row_positions { - physical-layout = <&physical_layout1>; - positions = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17>; - }; - }; - - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Pro Micro Pinout"; - - // Map key positions to the Pro Micro pinout. The coordinate - // deltas jump around a little because some of the Pro Micro - // pins are out of order: D0 is "after" D1 and D16 is "before" - // D14. - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 100 0 0 0> // D0 - , <&key_physical_attrs 100 100 0 0 0 0 0> // D1 - , <&key_physical_attrs 100 100 0 400 0 0 0> // D2 - , <&key_physical_attrs 100 100 0 500 0 0 0> // D3 - , <&key_physical_attrs 100 100 0 600 0 0 0> // D4 - , <&key_physical_attrs 100 100 0 700 0 0 0> // D5 - , <&key_physical_attrs 100 100 0 800 0 0 0> // D6 - , <&key_physical_attrs 100 100 0 900 0 0 0> // D7 - , <&key_physical_attrs 100 100 0 1000 0 0 0> // D8 - , <&key_physical_attrs 100 100 0 1100 0 0 0> // D9 - , <&key_physical_attrs 100 100 600 1100 0 0 0> // D10 - , <&key_physical_attrs 100 100 600 900 0 0 0> // D14 - , <&key_physical_attrs 100 100 600 800 0 0 0> // D15 - , <&key_physical_attrs 100 100 600 1000 0 0 0> // D16 - , <&key_physical_attrs 100 100 600 700 0 0 0> // D18 - , <&key_physical_attrs 100 100 600 600 0 0 0> // D19 - , <&key_physical_attrs 100 100 600 500 0 0 0> // D20 - , <&key_physical_attrs 100 100 600 400 0 0 0> // D21 - ; - }; - - physical_layout1: physical_layout_1 { - compatible = "zmk,physical-layout"; - display-name = "Single Row"; - - // Single row of eighteen "keys", in ascending "Arduino" order. - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 100 100 1600 0 0 0 0> - , <&key_physical_attrs 100 100 1700 0 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap b/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap deleted file mode 100644 index fbda0c49..00000000 --- a/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include - -#define PIN_MACRO(name, pin) \ -/ { \ - macros { \ - name: name { \ - compatible = "zmk,behavior-macro"; \ - wait-ms = <5>; \ - tap-ms = <5>; \ - #binding-cells = <0>; \ - bindings = <&kp P &kp I &kp N &kp SPACE>, pin, <&kp ENTER>; \ - }; \ - }; \ -}; - -PIN_MACRO(pin0, <&kp N0>) -PIN_MACRO(pin1, <&kp N1>) -PIN_MACRO(pin2, <&kp N2>) -PIN_MACRO(pin3, <&kp N3>) -PIN_MACRO(pin4, <&kp N4>) -PIN_MACRO(pin5, <&kp N5>) -PIN_MACRO(pin6, <&kp N6>) -PIN_MACRO(pin7, <&kp N7>) -PIN_MACRO(pin8, <&kp N8>) -PIN_MACRO(pin9, <&kp N9>) -PIN_MACRO(pin10, <&kp N1 &kp N0>) -PIN_MACRO(pin14, <&kp N1 &kp N4>) -PIN_MACRO(pin15, <&kp N1 &kp N5>) -PIN_MACRO(pin16, <&kp N1 &kp N6>) -PIN_MACRO(pin18, <&kp N1 &kp N8>) -PIN_MACRO(pin19, <&kp N1 &kp N9>) -PIN_MACRO(pin20, <&kp N2 &kp N0>) -PIN_MACRO(pin21, <&kp N2 &kp N1>) - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = <&pin0 - &pin1 - &pin2 - &pin3 - &pin4 - &pin5 - &pin6 - &pin7 - &pin8 - &pin9 - &pin10 - &pin14 - &pin15 - &pin16 - &pin18 - &pin19 - &pin20 - &pin21>; - }; - }; -}; diff --git a/app/boards/shields/tester_pro_micro/tester_pro_micro.overlay b/app/boards/shields/tester_pro_micro/tester_pro_micro.overlay deleted file mode 100644 index 779f47e7..00000000 --- a/app/boards/shields/tester_pro_micro/tester_pro_micro.overlay +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include "tester_pro_micro-layouts.dtsi" - -&physical_layout0 { - transform = <&transform0>; -}; - -&physical_layout1 { - transform = <&transform0>; -}; - -/ { - chosen { - zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - wakeup-source; - debounce-press-ms = <10>; - debounce-release-ms = <10>; - input-gpios - = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; - - transform0: keymap_transform { - compatible = "zmk,matrix-transform"; - columns = <18>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) - >; - }; -}; diff --git a/app/boards/shields/tester_pro_micro/tester_pro_micro.zmk.yml b/app/boards/shields/tester_pro_micro/tester_pro_micro.zmk.yml deleted file mode 100644 index 289f47b6..00000000 --- a/app/boards/shields/tester_pro_micro/tester_pro_micro.zmk.yml +++ /dev/null @@ -1,6 +0,0 @@ -file_format: "1" -id: tester_pro_micro -name: TesterProMicro -type: shield -url: https://zmk.dev/docs/troubleshooting/hardware-issues -requires: [pro_micro] diff --git a/app/boards/shields/tester_rpi_pico/Kconfig.defconfig b/app/boards/shields/tester_rpi_pico/Kconfig.defconfig deleted file mode 100644 index 740c6b67..00000000 --- a/app/boards/shields/tester_rpi_pico/Kconfig.defconfig +++ /dev/null @@ -1,12 +0,0 @@ -if SHIELD_TESTER_RPI_PICO - -config ZMK_KEYBOARD_NAME - default "ZMK Tester" - -config ZMK_BLE - def_bool n - -config SETTINGS - def_bool n - -endif \ No newline at end of file diff --git a/app/boards/shields/tester_rpi_pico/Kconfig.shield b/app/boards/shields/tester_rpi_pico/Kconfig.shield deleted file mode 100644 index 19246d18..00000000 --- a/app/boards/shields/tester_rpi_pico/Kconfig.shield +++ /dev/null @@ -1,2 +0,0 @@ -config SHIELD_TESTER_RPI_PICO - def_bool $(shields_list_contains,tester_rpi_pico) \ No newline at end of file diff --git a/app/boards/shields/tester_rpi_pico/tester_rpi_pico-layouts.dtsi b/app/boards/shields/tester_rpi_pico/tester_rpi_pico-layouts.dtsi deleted file mode 100644 index 77eda01e..00000000 --- a/app/boards/shields/tester_rpi_pico/tester_rpi_pico-layouts.dtsi +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - tester_position_map { - compatible = "zmk,physical-layout-position-map"; - complete; - - pinout_map: pinout_positions { - physical-layout = <&physical_layout0>; - positions = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25>; - }; - inline_map: single_row_positions { - physical-layout = <&physical_layout1>; - positions = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25>; - }; - }; - - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Rpi Pico Pinout"; - - kscan = <&kscan0>; - transform = <&matrix_transform0>; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 0 500 0 0 0> - , <&key_physical_attrs 100 100 0 600 0 0 0> - , <&key_physical_attrs 100 100 0 800 0 0 0> - , <&key_physical_attrs 100 100 0 900 0 0 0> - , <&key_physical_attrs 100 100 0 1000 0 0 0> - , <&key_physical_attrs 100 100 0 1100 0 0 0> - , <&key_physical_attrs 100 100 0 1300 0 0 0> - , <&key_physical_attrs 100 100 0 1400 0 0 0> - , <&key_physical_attrs 100 100 0 1500 0 0 0> - , <&key_physical_attrs 100 100 0 1600 0 0 0> - , <&key_physical_attrs 100 100 0 1800 0 0 0> - , <&key_physical_attrs 100 100 0 1900 0 0 0> - , <&key_physical_attrs 100 100 600 1900 0 0 0> - , <&key_physical_attrs 100 100 600 1800 0 0 0> - , <&key_physical_attrs 100 100 600 1600 0 0 0> - , <&key_physical_attrs 100 100 600 1500 0 0 0> - , <&key_physical_attrs 100 100 600 1400 0 0 0> - , <&key_physical_attrs 100 100 600 1300 0 0 0> - , <&key_physical_attrs 100 100 600 1100 0 0 0> - , <&key_physical_attrs 100 100 600 900 0 0 0> - , <&key_physical_attrs 100 100 600 800 0 0 0> - , <&key_physical_attrs 100 100 600 600 0 0 0> - ; - }; - - physical_layout1: physical_layout_1 { - compatible = "zmk,physical-layout"; - display-name = "Single Row"; - - // Single row of eighteen "keys", in ascending "Arduino" order. - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 100 100 1600 0 0 0 0> - , <&key_physical_attrs 100 100 1700 0 0 0 0> - , <&key_physical_attrs 100 100 1800 0 0 0 0> - , <&key_physical_attrs 100 100 1900 0 0 0 0> - , <&key_physical_attrs 100 100 2000 0 0 0 0> - , <&key_physical_attrs 100 100 2100 0 0 0 0> - , <&key_physical_attrs 100 100 2200 0 0 0 0> - , <&key_physical_attrs 100 100 2300 0 0 0 0> - , <&key_physical_attrs 100 100 2400 0 0 0 0> - , <&key_physical_attrs 100 100 2500 0 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap deleted file mode 100644 index 9f263c87..00000000 --- a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include - -#define PIN_MACRO(name, pin) \ -/ { \ - macros { \ - name: name { \ - compatible = "zmk,behavior-macro"; \ - wait-ms = <5>; \ - tap-ms = <5>; \ - #binding-cells = <0>; \ - bindings = <&kp P &kp I &kp N &kp SPACE>, pin, <&kp ENTER>; \ - }; \ - }; \ -}; - -PIN_MACRO(pin0, <&kp N0>) -PIN_MACRO(pin1, <&kp N1>) -PIN_MACRO(pin2, <&kp N2>) -PIN_MACRO(pin3, <&kp N3>) -PIN_MACRO(pin4, <&kp N4>) -PIN_MACRO(pin5, <&kp N5>) -PIN_MACRO(pin6, <&kp N6>) -PIN_MACRO(pin7, <&kp N7>) -PIN_MACRO(pin8, <&kp N8>) -PIN_MACRO(pin9, <&kp N9>) -PIN_MACRO(pin10, <&kp N1 &kp N0>) -PIN_MACRO(pin11, <&kp N1 &kp N1>) -PIN_MACRO(pin12, <&kp N1 &kp N2>) -PIN_MACRO(pin13, <&kp N1 &kp N3>) -PIN_MACRO(pin14, <&kp N1 &kp N4>) -PIN_MACRO(pin15, <&kp N1 &kp N5>) -PIN_MACRO(pin16, <&kp N1 &kp N6>) -PIN_MACRO(pin17, <&kp N1 &kp N7>) -PIN_MACRO(pin18, <&kp N1 &kp N8>) -PIN_MACRO(pin19, <&kp N1 &kp N9>) -PIN_MACRO(pin20, <&kp N2 &kp N0>) -PIN_MACRO(pin21, <&kp N2 &kp N1>) -PIN_MACRO(pin22, <&kp N2 &kp N2>) -PIN_MACRO(pin26, <&kp N2 &kp N6>) -PIN_MACRO(pin27, <&kp N2 &kp N7>) -PIN_MACRO(pin28, <&kp N2 &kp N8>) - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = <&pin0 - &pin1 - &pin2 - &pin3 - &pin4 - &pin5 - &pin6 - &pin7 - &pin8 - &pin9 - &pin10 - &pin11 - &pin12 - &pin13 - &pin14 - &pin15 - &pin16 - &pin17 - &pin18 - &pin19 - &pin20 - &pin21 - &pin22 - &pin26 - &pin27 - &pin28>; - }; - }; -}; diff --git a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay deleted file mode 100644 index 6fcacd70..00000000 --- a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include "tester_rpi_pico-layouts.dtsi" - -&physical_layout0 { - transform = <&transform0>; -}; - -&physical_layout1 { - transform = <&transform0>; -}; - -/ { - chosen { - zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - wakeup-source; - debounce-press-ms = <10>; - debounce-release-ms = <10>; - input-gpios - = <&pico_header 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 17 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 22 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 26 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 27 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pico_header 28 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; - - transform0: keymap_transform { - compatible = "zmk,matrix-transform"; - columns = <26>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) RC(0,18) RC(0,19) - RC(0,20) RC(0,21) RC(0,22) RC(0,23) RC(0,24) RC(0,25) - >; - }; -}; diff --git a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.zmk.yml b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.zmk.yml deleted file mode 100644 index 560eca58..00000000 --- a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.zmk.yml +++ /dev/null @@ -1,6 +0,0 @@ -file_format: "1" -id: tester_rpi_pico -name: TesterRpiPico -type: shield -url: https://zmk.dev/docs/troubleshooting/hardware-issues -requires: [rpi_pico] diff --git a/app/boards/shields/tester_xiao/Kconfig.defconfig b/app/boards/shields/tester_xiao/Kconfig.defconfig deleted file mode 100644 index 15316dce..00000000 --- a/app/boards/shields/tester_xiao/Kconfig.defconfig +++ /dev/null @@ -1,12 +0,0 @@ -if SHIELD_TESTER_XIAO - -config ZMK_KEYBOARD_NAME - default "ZMK Tester" - -config ZMK_BLE - def_bool n - -config SETTINGS - def_bool n - -endif \ No newline at end of file diff --git a/app/boards/shields/tester_xiao/Kconfig.shield b/app/boards/shields/tester_xiao/Kconfig.shield deleted file mode 100644 index 336dfaff..00000000 --- a/app/boards/shields/tester_xiao/Kconfig.shield +++ /dev/null @@ -1,2 +0,0 @@ -config SHIELD_TESTER_XIAO - def_bool $(shields_list_contains,tester_xiao) \ No newline at end of file diff --git a/app/boards/shields/tester_xiao/tester_xiao-layouts.dtsi b/app/boards/shields/tester_xiao/tester_xiao-layouts.dtsi deleted file mode 100644 index 361fb9dd..00000000 --- a/app/boards/shields/tester_xiao/tester_xiao-layouts.dtsi +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -// The tester might not have any physical keys at all, so these -// physical layouts are pretty much imaginary. - -/ { - tester_position_map { - compatible = "zmk,physical-layout-position-map"; - complete; - - pinout_map: pinout_positions { - physical-layout = <&physical_layout0>; - positions = <0 1 2 3 4 5 6 7 8 9 10>; - }; - inline_map: single_row_positions { - physical-layout = <&physical_layout1>; - positions = <0 1 2 3 4 5 6 7 8 9 10>; - }; - }; - - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "XIAO Pinout"; - - // Map key positions to the XIAO pinout. - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 0 500 0 0 0> - , <&key_physical_attrs 100 100 0 600 0 0 0> - , <&key_physical_attrs 100 100 600 600 0 0 0> - , <&key_physical_attrs 100 100 600 500 0 0 0> - , <&key_physical_attrs 100 100 600 400 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - ; - }; - - physical_layout1: physical_layout_1 { - compatible = "zmk,physical-layout"; - display-name = "Single Row"; - - // Single row of eleven "keys". - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - ; - }; -}; diff --git a/app/boards/shields/tester_xiao/tester_xiao.keymap b/app/boards/shields/tester_xiao/tester_xiao.keymap deleted file mode 100644 index 29a5f3db..00000000 --- a/app/boards/shields/tester_xiao/tester_xiao.keymap +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include - -#define PIN_MACRO(name, pin) \ -/ { \ - macros { \ - name: name { \ - compatible = "zmk,behavior-macro"; \ - wait-ms = <5>; \ - tap-ms = <5>; \ - #binding-cells = <0>; \ - bindings = <&kp P &kp I &kp N &kp SPACE>, pin, <&kp ENTER>; \ - }; \ - }; \ -}; - -PIN_MACRO(pin0, <&kp N0>) -PIN_MACRO(pin1, <&kp N1>) -PIN_MACRO(pin2, <&kp N2>) -PIN_MACRO(pin3, <&kp N3>) -PIN_MACRO(pin4, <&kp N4>) -PIN_MACRO(pin5, <&kp N5>) -PIN_MACRO(pin6, <&kp N6>) -PIN_MACRO(pin7, <&kp N7>) -PIN_MACRO(pin8, <&kp N8>) -PIN_MACRO(pin9, <&kp N9>) -PIN_MACRO(pin10, <&kp N1 &kp N0>) - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = <&pin0 - &pin1 - &pin2 - &pin3 - &pin4 - &pin5 - &pin6 - &pin7 - &pin8 - &pin9 - &pin10>; - }; - }; -}; diff --git a/app/boards/shields/tester_xiao/tester_xiao.overlay b/app/boards/shields/tester_xiao/tester_xiao.overlay deleted file mode 100644 index 22a7f747..00000000 --- a/app/boards/shields/tester_xiao/tester_xiao.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "tester_xiao-layouts.dtsi" - -&physical_layout0 { - transform = <&transform0>; -}; - -&physical_layout1 { - transform = <&transform0>; -}; - -/ { - chosen { - zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - wakeup-source; - debounce-press-ms = <10>; - debounce-release-ms = <10>; - input-gpios - = <&xiao_d 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&xiao_d 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; - - transform0: keymap_transform { - compatible = "zmk,matrix-transform"; - columns = <11>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) - >; - }; -}; diff --git a/app/boards/shields/tester_xiao/tester_xiao.zmk.yml b/app/boards/shields/tester_xiao/tester_xiao.zmk.yml deleted file mode 100644 index 77ab90d2..00000000 --- a/app/boards/shields/tester_xiao/tester_xiao.zmk.yml +++ /dev/null @@ -1,6 +0,0 @@ -file_format: "1" -id: tester_xiao -name: TesterXiao -type: shield -url: https://zmk.dev/docs/troubleshooting/hardware-issues -requires: [seeed_xiao] diff --git a/app/boards/shields/tg4x/boards/nice_nano.conf b/app/boards/shields/tg4x/boards/nice_nano.conf index c93ed4de..7b077948 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.conf +++ b/app/boards/shields/tg4x/boards/nice_nano.conf @@ -3,3 +3,5 @@ # Enable underglow CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +CONFIG_WS2812_STRIP=y \ No newline at end of file diff --git a/app/boards/shields/tg4x/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/tg4x/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/tg4x/boards/nice_nano.overlay index 84441899..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..85ab6fbc --- /dev/null +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index 8c272f79..89a478ae 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -12,6 +12,7 @@ behaviors { ht: hold_tap { compatible = "zmk,behavior-hold-tap"; + label = "Hold Tap"; #binding-cells = <2>; tapping-term-ms = <200>; flavor = "tap-preferred"; @@ -23,7 +24,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp SEMI &kp BSPC &ht CAPS TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp APOS &kp RET @@ -33,7 +33,6 @@ }; function_layer { - display-name = "Function Layer"; bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp DEL &none &kp HOME &kp PG_UP &trans &trans &trans &kp LBKT &kp RBKT &kp EQUAL &kp BSLH &kp FSLH &trans @@ -43,7 +42,6 @@ }; other_layer { - display-name = "Other Layer"; bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index ac05e810..c0b1b3bc 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -9,7 +9,7 @@ / { kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; @@ -50,6 +50,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,5) RC(7,1) chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; }; diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index 70bb1d74..393fbef1 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -15,6 +15,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -22,7 +25,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/tidbit/README.md b/app/boards/shields/tidbit/README.md index b5500e12..c68d38b9 100644 --- a/app/boards/shields/tidbit/README.md +++ b/app/boards/shields/tidbit/README.md @@ -1,6 +1,41 @@ -# TIDBIT Compatibility Notes +# Building ZMK for the Tidbit -- The top-left and top-right encoders share the same pins. Install only one, and enable/include EITHER `encoder_1` OR `encoder_1_top_row` in your keymap; not both. -- `encoder_3` cannot be used at the same time as the OLED and/or HT16K33 modules, as it is wired to the same pins. - - While the HT16K33 hardware is supported by Zephyr, functionality may not have been implemented in ZMK for it. -- `encoder_4` cannot be used at the same time as the TRRS jack, as it is wired to the same pins. +Some general notes/commands for building standard tidbit layouts from the assembly documentation. + +## Standard "Non Dense" Build + +``` +west build -p -d build/tidbit/default --board nice_nano -- -DSHIELD=tidbit +``` + +## Dense "19 keys" Build + +``` +west build -p -d build/tidbit/19_key --board nice_nano -- -DSHIELD=tidbit_19key +``` + +## LED Notes + +If you built your tidbit without the LEDs _and_ are using a nice!nano board, you'll need to change the following in your local tidbit config or add them to the end of the file. + +``` +CONFIG_ZMK_RGB_UNDERGLOW=n +CONFIG_WS2812_STRIP=n +``` + +## Encoder Notes + +If you built your tidbit without encoders, you'll need to change the following in your local tidbit config or add them to the end of the file. + +``` +CONFIG_EC11=n +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=n +``` + +## OLED Builds + +If using an OLED screen, you'll need to change the following in your local tidbit config or add them to the end of the file. + +``` +CONFIG_ZMK_DISPLAY=y +``` diff --git a/app/boards/shields/tidbit/boards/nice_nano.conf b/app/boards/shields/tidbit/boards/nice_nano.conf new file mode 100644 index 00000000..14bed3d0 --- /dev/null +++ b/app/boards/shields/tidbit/boards/nice_nano.conf @@ -0,0 +1,4 @@ +# Enable underglow +CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +CONFIG_WS2812_STRIP=y \ No newline at end of file diff --git a/app/boards/shields/tidbit/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay similarity index 97% rename from app/boards/shields/tidbit/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/tidbit/boards/nice_nano.overlay index b0895433..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay similarity index 97% rename from app/boards/shields/two_percent_milk/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/tidbit/boards/nice_nano_v2.overlay index b0895433..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_nrf52840_zmk.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/nrf52_bsim.conf b/app/boards/shields/tidbit/boards/proton_c.conf similarity index 100% rename from app/tests/ble/security/read-hid-after-connect-with-auto-sec/nrf52_bsim.conf rename to app/boards/shields/tidbit/boards/proton_c.conf diff --git a/app/boards/shields/tidbit/tidbit.conf b/app/boards/shields/tidbit/tidbit.conf index bb2d0d9a..2909a855 100644 --- a/app/boards/shields/tidbit/tidbit.conf +++ b/app/boards/shields/tidbit/tidbit.conf @@ -5,9 +5,7 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y -# Uncomment to enable underglow +# Enable underglow #CONFIG_ZMK_RGB_UNDERGLOW=y - -# Uncomment to enable the display -# Note that an I2C OLED cannot be used at the same time as encoder 3. -#CONFIG_ZMK_DISPLAY=y +# Use the STRIP config specific to the LEDs you're using +#CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/tidbit/tidbit.dtsi b/app/boards/shields/tidbit/tidbit.dtsi new file mode 100644 index 00000000..c7af2001 --- /dev/null +++ b/app/boards/shields/tidbit/tidbit.dtsi @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <4>; + rows = <5>; + + map = < + RC(0,1) RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) + >; + }; + + encoder_1_top_row: encoder_1_top_row { + compatible = "alps,ec11"; + label = "Top Row Encoder"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; + }; + + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; + }; + + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; + }; + + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "Encoder 3"; + a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; + }; + + encoder_4: encoder_4 { + compatible = "alps,ec11"; + label = "Encoder 4"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; + }; + + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index dbc9e907..a98a2eaa 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -6,63 +6,41 @@ #include #include -#include #include +#include - -/* Enable ONLY ONE of the &encoder_1 nodes. They are wired to the same pins.*/ -/* -&encoder_1 { +&encoder_1_top_row { status = "okay"; }; -&encoder_1_top_left { - status = "okay"; -}; -*/ - -/* -&encoder_2 { - status = "okay"; -}; - -&encoder_3 { - status = "okay"; -}; -*/ - -&encoder_4 { - status = "okay"; -}; - -/* Add any encoder(s) you have enabled to the sensors node, separated by spaces. */ -&sensors { - sensors = <&encoder_4>; -}; / { + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1_top_row>; + triggers-per-rotation = <20>; + }; + keymap { compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_SLASH + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER - &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER + &none &kp KP_NUMBER_0 &kp KP_DOT &none >; sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; }; func_layer { - display-name = "Func Layer"; bindings = < - &none &sys_reset &bootloader + &none &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &trans + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 &kp C_MUTE &none &none &none >; diff --git a/app/boards/shields/tidbit/tidbit.overlay b/app/boards/shields/tidbit/tidbit.overlay index 0f4e07b8..dc425618 100644 --- a/app/boards/shields/tidbit/tidbit.overlay +++ b/app/boards/shields/tidbit/tidbit.overlay @@ -4,127 +4,4 @@ * SPDX-License-Identifier: MIT */ -#include - -/ { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "row2col"; - wakeup-source; - - row-gpios - = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - - }; - - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <5>; - - map = < - RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) - >; - }; - - numpad_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <5>; - - map = < - RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) RC(4,2) - >; - }; - - encoder_1_top_row: encoder_1_top_row { - compatible = "alps,ec11"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - steps = <80>; - status = "disabled"; - }; - - encoder_1: encoder_1 { - compatible = "alps,ec11"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - steps = <80>; - status = "disabled"; - }; - - encoder_2: encoder_2 { - compatible = "alps,ec11"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - steps = <80>; - status = "disabled"; - }; - - encoder_3: encoder_3 { - compatible = "alps,ec11"; - a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - steps = <80>; - status = "disabled"; - }; - - encoder_4: encoder_4 { - compatible = "alps,ec11"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - steps = <80>; - status = "disabled"; - }; - - sensors: sensors { - compatible = "zmk,keymap-sensors"; - triggers-per-rotation = <20>; - }; - - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; - }; -}; - -&pro_micro_i2c { - status = "okay"; - - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - inversion-on; - prechargep = <0x22>; - }; -}; +#include "tidbit.dtsi" diff --git a/app/boards/shields/tidbit/tidbit_19key.conf b/app/boards/shields/tidbit/tidbit_19key.conf new file mode 100644 index 00000000..2909a855 --- /dev/null +++ b/app/boards/shields/tidbit/tidbit_19key.conf @@ -0,0 +1,11 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Enable Encoders +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Enable underglow +#CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +#CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap new file mode 100644 index 00000000..1be71e7a --- /dev/null +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "tidbit.dtsi" +#include +#include +#include +#include + +&encoder_4 { + status = "okay"; +}; + +/ { + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_4>; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &tog 1 &kp KP_NUMLOCK &kp KP_SLASH + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS + &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER + >; + + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + + func_layer { + bindings = < + &tog 0 &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none + &kp C_MUTE &none &none &none + >; + + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; +}; diff --git a/app/boards/moergo/glove80/glove80_lh.keymap b/app/boards/shields/tidbit/tidbit_19key.overlay similarity index 61% rename from app/boards/moergo/glove80/glove80_lh.keymap rename to app/boards/shields/tidbit/tidbit_19key.overlay index dd4c2d6a..dc46233e 100644 --- a/app/boards/moergo/glove80/glove80_lh.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.overlay @@ -4,4 +4,5 @@ * SPDX-License-Identifier: MIT */ -#include "glove80.keymap" +#include "tidbit.dtsi" +#include "tidbit_19key.keymap" diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay new file mode 100644 index 00000000..75514ac4 --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..75514ac4 --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay similarity index 97% rename from app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay rename to app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index 26079169..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_zmk_1_1_0.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay similarity index 97% rename from app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay rename to app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index e1218ffd..31678980 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_flipped_zmk_1_1_0.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay similarity index 97% rename from app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay rename to app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 26079169..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -25,6 +25,7 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.conf b/app/boards/shields/two_percent_milk/two_percent_milk.conf index 077ebcf6..4baccacf 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.conf +++ b/app/boards/shields/two_percent_milk/two_percent_milk.conf @@ -3,6 +3,7 @@ # Uncomment the following lines to enable RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y # Uncomment the following line to turn on logging, and set ZMK logging to debug output -# CONFIG_ZMK_USB_LOGGING=y +# CONFIG_ZMK_USB_LOGGING=y \ No newline at end of file diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.keymap b/app/boards/shields/two_percent_milk/two_percent_milk.keymap index 1e500237..132793b3 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.keymap +++ b/app/boards/shields/two_percent_milk/two_percent_milk.keymap @@ -13,11 +13,10 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp X &kp Z >; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.overlay b/app/boards/shields/two_percent_milk/two_percent_milk.overlay index 7647f551..8d4a244a 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.overlay +++ b/app/boards/shields/two_percent_milk/two_percent_milk.overlay @@ -11,7 +11,8 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; - wakeup-source; + + label = "KSCAN"; input-gpios = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 1efc3596..dbee82b8 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -22,6 +22,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -29,7 +32,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index 2329ca78..3d914094 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -10,7 +10,7 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -31,7 +31,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -44,6 +44,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) roller_left_encoder: encoder_left_roller { compatible = "alps,ec11"; + label = "ROLLER_LEFT_ENCODER"; a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -52,6 +53,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) dial_left_encoder: encoder_left_dial { compatible = "alps,ec11"; + label = "DIAL_LEFT_ENCODER"; a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -60,6 +62,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) roller_right_encoder: encoder_right_roller { compatible = "alps,ec11"; + label = "ROLLER_RIGHT_ENCODER"; a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -68,13 +71,14 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) dial_right_encoder: encoder_right_dial { compatible = "alps,ec11"; + label = "DIAL_RIGHT_ENCODER"; a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; status = "disabled"; }; - sensors: sensors { + sensors { compatible = "zmk,keymap-sensors"; triggers-per-rotation = <20>; sensors = < @@ -94,6 +98,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <64>; segment-offset = <0>; @@ -101,6 +106,5 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) display-offset = <0>; multiplex-ratio = <63>; prechargep = <0x22>; - inversion-on; }; }; diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 50cabf68..197a34fa 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; /* QWERTY * * ,----------------------------------. ,----------------------------------. @@ -43,7 +42,6 @@ }; navnum_layer { - display-name = "Navnum Layer"; /* NAVNUM * * ,----------------------------------. ,----------------------------------. @@ -73,7 +71,6 @@ }; symbol_layer { - display-name = "Symbol Layer"; /* SYM * * ,----------------------------------. ,----------------------------------. @@ -103,7 +100,6 @@ }; function_layer { - display-name = "Function Layer"; /* FUNC * * ,----------------------------------. ,----------------------------------. diff --git a/app/boards/shields/zmk_uno/Kconfig.defconfig b/app/boards/shields/zmk_uno/Kconfig.defconfig index 9898a6e6..11c63a5a 100644 --- a/app/boards/shields/zmk_uno/Kconfig.defconfig +++ b/app/boards/shields/zmk_uno/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -if SHIELD_ZMK_UNO_BASE +if SHIELD_ZMK_UNO config ZMK_KEYBOARD_NAME default "ZMK Uno" @@ -16,7 +16,8 @@ config SHIELD_SSD1306_128X64 config SHIELD_SSD1306_128X32 select ZMK_DISPLAY -config ZMK_PM_SOFT_OFF - default y if BOARD_NRF52840DK_NRF52840 +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI endif diff --git a/app/boards/shields/zmk_uno/Kconfig.shield b/app/boards/shields/zmk_uno/Kconfig.shield index 0b0b3d73..958915f5 100644 --- a/app/boards/shields/zmk_uno/Kconfig.shield +++ b/app/boards/shields/zmk_uno/Kconfig.shield @@ -1,20 +1,5 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -config SHIELD_ZMK_UNO_BASE - bool - config SHIELD_ZMK_UNO def_bool $(shields_list_contains,zmk_uno) - select SHIELD_ZMK_UNO_BASE - -config SHIELD_ZMK_UNO_SPLIT_LEFT - def_bool $(shields_list_contains,zmk_uno_split_left) - select SHIELD_ZMK_UNO_BASE - select ZMK_SPLIT - select ZMK_SPLIT_ROLE_CENTRAL - -config SHIELD_ZMK_UNO_SPLIT_RIGHT - def_bool $(shields_list_contains,zmk_uno_split_right) - select SHIELD_ZMK_UNO_BASE - select ZMK_SPLIT \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay index d798eca7..5ac7af7c 100644 --- a/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay +++ b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay @@ -12,15 +12,6 @@ bias-pull-up; }; }; - - qdec_sleep: qdec_sleep { - group1 { - psels = , - ; - bias-pull-up; - low-power-enable; - }; - }; }; // Set up the QDEC hardware based driver and give it the same label as the deleted node. @@ -29,38 +20,5 @@ encoder: &qdec0 { led-pre = <0>; steps = <80>; pinctrl-0 = <&qdec_default>; - pinctrl-1 = <&qdec_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-names = "default"; }; - -/ { - behaviors { - hw_soft_off: hw_soft_off { - compatible = "zmk,behavior-soft-off"; - #binding-cells = <0>; - }; - }; - - soft_off_direct_kscan: soft_off_direct_kscan { - compatible = "zmk,kscan-gpio-direct"; - input-keys = <&button0>; - wakeup-source; - }; - - soft_off_sideband_behaviors { - compatible = "zmk,kscan-sideband-behaviors"; - kscan = <&soft_off_direct_kscan>; - soft_off { - row = <0>; - column = <0>; - bindings = <&hw_soft_off>; - }; - }; - - soft_off_wakers { - compatible = "zmk,soft-off-wakeup-sources"; - status = "okay"; - - wakeup-sources = <&soft_off_direct_kscan>; - }; -}; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno-layouts.dtsi b/app/boards/shields/zmk_uno/zmk_uno-layouts.dtsi deleted file mode 100644 index e5b752db..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno-layouts.dtsi +++ /dev/null @@ -1,27 +0,0 @@ -#include - -/ { - matrix_physical_layout: matrix_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Matrix Layout"; - - keys - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - ; - }; - - direct_physical_layout: direct_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Direct Wire Layout"; - - keys - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno.conf b/app/boards/shields/zmk_uno/zmk_uno.conf index 0c46ea98..cf282bac 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.conf +++ b/app/boards/shields/zmk_uno/zmk_uno.conf @@ -4,8 +4,6 @@ CONFIG_LOG=y CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_BLE_PASSKEY_ENTRY=n - # Uncomment for Single color backlight # CONFIG_ZMK_BACKLIGHT=y diff --git a/app/boards/shields/zmk_uno/zmk_uno.dtsi b/app/boards/shields/zmk_uno/zmk_uno.dtsi deleted file mode 100644 index 26451cf9..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno.dtsi +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include "zmk_uno-layouts.dtsi" - - -&arduino_i2c { - status = "okay"; -}; - -nice_view_spi: &arduino_spi { - status = "okay"; - - cs-gpios = <&arduino_header 16 GPIO_ACTIVE_HIGH>; - - // Needed so the nice_view shield will enhance the existing node which falls *first* - // on the bus, properly picking up the first `cs-gpios` specifier. - ls0xx@0 { - reg = <0>; - }; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,backlight = &backlight; - zmk,underglow = &led_strip; - }; - - // Commented out until we add more powerful power domain support - // external_power { - // compatible = "zmk,ext-power-generic"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - // }; - - rgb_power { - compatible = "zmk,ext-power-generic"; - init-delay-ms = <200>; - control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - }; - - backlight: gpioleds { - compatible = "gpio-leds"; - gpio_led_0 { - gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; - }; - }; - - matrix_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; - - map = < - RC(0,0) RC(0,1) - RC(1,0) RC(1,1) - >; - }; - - direct_matrix_transform: direct_matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; - - map = < - RC(0,0) RC(0,1) - RC(0,2) RC(0,3) - >; - }; - - kscan_matrix: kscan_matrix { - compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; - - diode-direction = "col2row"; - - col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; - - row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - - }; - - kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - wakeup-source; - - input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - - }; - - kscan_sp3t_toggle: kscan_sp3t_toggle { - compatible = "zmk,kscan-gpio-direct"; - toggle-mode; - - input-gpios - = <&arduino_header 4 GPIO_ACTIVE_LOW> - , <&arduino_header 3 GPIO_ACTIVE_LOW> - , <&arduino_header 2 GPIO_ACTIVE_LOW> - ; - }; - - encoder: encoder { - steps = <80>; - compatible = "alps,ec11"; - a-gpios = <&arduino_header 15 GPIO_PULL_UP>; - b-gpios = <&arduino_header 14 GPIO_PULL_UP>; - }; -}; - -&matrix_physical_layout { - kscan = <&kscan_matrix>; - transform = <&matrix_transform>; -}; - -&direct_physical_layout { - kscan = <&kscan_direct>; - transform = <&direct_matrix_transform>; -}; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap index 7fe0a044..0e0fc795 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -9,25 +9,51 @@ #include #include #include +#include #include -// Uncomment the following lines if using the "Direct Wire" jumper to switch the matrix to a direct wire. +// Uncomment the following block if using the "Direct Wire" jumper to switch the matrix to a direct wire. -// / { -// chosen { -// zmk,physical-layout = &direct_physical_layout; -// }; -// }; +/* :REMOVE ME + +&kscan_direct_comp { status = "okay"; }; +&kscan_direct { status = "okay"; }; +&kscan_matrix_comp { status = "disabled"; }; +&kscan_matrix { status = "disabled"; }; / { + chosen { + zmk,matrix-transform = &direct_matrix_transform; + zmk,kscan = &kscan_direct_comp; + }; +}; + +REMOVE ME: */ + + +/ { + macros { + ZMK_MACRO(ble_zero, + wait-ms = <1>; + tap-ms = <1>; + bindings = <&out OUT_BLE &bt BT_SEL 0>; + ) + ZMK_MACRO(ble_one, + wait-ms = <1>; + tap-ms = <1>; + bindings = <&out OUT_BLE &bt BT_SEL 1>; + ) + }; + keymap { compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp A &bl BL_TOG &rgb_ug RGB_EFF &bt BT_CLR + + &out OUT_USB &ble_zero &ble_one >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 3516611a..02bb4ad8 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -4,18 +4,181 @@ * SPDX-License-Identifier: MIT */ -#include "zmk_uno.dtsi" +#include +#include -#include -#include -#include +&arduino_i2c { + status = "okay"; +}; + +nice_view_spi: &arduino_spi { + status = "okay"; + + cs-gpios = <&arduino_header 16 GPIO_ACTIVE_HIGH>; + + // Needed so the nice_view shield will enhance the existing node which falls *first* + // on the bus, properly picking up the first `cs-gpios` specifier. + ls0xx@0 { + reg = <0>; + }; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; / { chosen { - zmk,physical-layout = &matrix_physical_layout; + zmk,kscan = &kscan_matrix_comp; + zmk,backlight = &backlight; + zmk,underglow = &led_strip; + zmk,matrix-transform = &matrix_transform; }; - sensors: sensors { + // Commented out until we add more powerful power domain support + // external_power { + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // }; + + rgb_power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + // label = "RGB_POWER"; + init-delay-ms = <200>; + control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + }; + + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; + + matrix_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; + + map = < + RC(0,0) RC(0,1) + RC(1,0) RC(1,1) + RC(2,0) RC(2,1) RC(2,2) + >; + }; + + direct_matrix_transform: direct_matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; + + map = < + RC(0,0) RC(0,1) + RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) + >; + }; + + kscan_matrix_comp: kscan_matrix_comp { + compatible = "zmk,kscan-composite"; + rows = <1>; + columns = <7>; + + label = "KSCAN_MATRIX_COMP"; + + matrix { + kscan = <&kscan_matrix>; + }; + + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <2>; + }; + + }; + + kscan_direct_comp: kscan_direct_comp { + compatible = "zmk,kscan-composite"; + + label = "KSCAN_DIRECT_COMP"; + status = "disabled"; + + matrix { + kscan = <&kscan_direct>; + }; + + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <1>; + }; + + }; + + kscan_matrix: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; + + diode-direction = "col2row"; + + col-gpios + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; + + kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + status = "disabled"; + + input-gpios + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + + }; + + kscan_sp3t_toggle: kscan_sp3t_toggle { + compatible = "zmk,kscan-gpio-direct"; + toggle-mode; + + input-gpios + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; + + encoder: encoder { + label = "ENCODER"; + steps = <80>; + compatible = "alps,ec11"; + a-gpios = <&arduino_header 15 GPIO_PULL_UP>; + b-gpios = <&arduino_header 14 GPIO_PULL_UP>; + }; + sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder>; triggers-per-rotation = <20>; @@ -24,38 +187,4 @@ }; }; - macros { - ZMK_MACRO(ble_zero, - wait-ms = <1>; - tap-ms = <1>; - bindings = <&out OUT_BLE &bt BT_SEL 0>; - ) - ZMK_MACRO(ble_one, - wait-ms = <1>; - tap-ms = <1>; - bindings = <&out OUT_BLE &bt BT_SEL 1>; - ) - }; - - endpoint_sideband_behaviors { - compatible = "zmk,kscan-sideband-behaviors"; - - auto-enable; - kscan = <&kscan_sp3t_toggle>; - - first_toggle_sideband: first_toggle_sideband { - column = <0>; - bindings = <&out OUT_USB>; - }; - - second_toggle_sideband: second_toggle_sideband { - column = <1>; - bindings = <&ble_zero>; - }; - - third_toggle_sideband: third_toggle_sideband { - column = <2>; - bindings = <&ble_one>; - }; - }; }; diff --git a/app/boards/shields/zmk_uno/zmk_uno.zmk.yml b/app/boards/shields/zmk_uno/zmk_uno.zmk.yml index 4893754e..cee108fa 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.zmk.yml +++ b/app/boards/shields/zmk_uno/zmk_uno.zmk.yml @@ -8,4 +8,3 @@ features: - keys - encoder - display - - studio diff --git a/app/boards/shields/zmk_uno/zmk_uno_split-layouts.dtsi b/app/boards/shields/zmk_uno/zmk_uno_split-layouts.dtsi deleted file mode 100644 index 7a0c4934..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split-layouts.dtsi +++ /dev/null @@ -1,37 +0,0 @@ -#include - -/ { - split_matrix_physical_layout: matrix_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Matrix Layout"; - - keys - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - ; - }; - - split_direct_physical_layout: direct_physical_layout { - compatible = "zmk,physical-layout"; - - display-name = "Direct Wire Layout"; - - keys - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - ; - }; - -}; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno_split.dtsi b/app/boards/shields/zmk_uno/zmk_uno_split.dtsi deleted file mode 100644 index a555862b..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split.dtsi +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "zmk_uno.dtsi" -#include "zmk_uno_split-layouts.dtsi" - -left_encoder: &encoder { - status = "disabled"; -}; - -&arduino_serial { - status = "okay"; -}; - -/ { - chosen { - zmk,physical-layout = &split_matrix_physical_layout; - }; - - wired_split { - compatible = "zmk,wired-split"; - device = <&arduino_serial>; - }; - - split_matrix_transform: split_matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <2>; - - map = < - RC(0,0) RC(0,1) - RC(1,0) RC(1,1) - - RC(3,0) RC(3,1) - RC(4,0) RC(4,1) - >; - }; - - split_direct_matrix_transform: split_direct_matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <2>; - columns = <4>; - - map = < - RC(0,0) RC(0,1) - RC(0,2) RC(0,3) - - RC(1,0) RC(1,1) - RC(1,2) RC(1,3) - >; - }; - - right_encoder: right_encoder { - steps = <80>; - status = "disabled"; - compatible = "alps,ec11"; - a-gpios = <&arduino_header 15 GPIO_PULL_UP>; - b-gpios = <&arduino_header 14 GPIO_PULL_UP>; - }; - - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder &right_encoder>; - triggers-per-rotation = <20>; - }; -}; - -&split_matrix_physical_layout { - kscan = <&kscan_matrix>; - transform = <&split_matrix_transform>; -}; - -&split_direct_physical_layout { - kscan = <&kscan_direct>; - transform = <&split_direct_matrix_transform>; -}; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno_split.keymap b/app/boards/shields/zmk_uno/zmk_uno_split.keymap deleted file mode 100644 index 0e479869..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split.keymap +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include -#include - -// Uncomment the following lines if using the "Direct Wire" jumper to switch the matrix to a direct wire. - -// / { -// chosen { -// zmk,physical-layout = &direct_physical_layout; -// }; -// }; - -/ { - - keymap { - compatible = "zmk,keymap"; - - default_layer { - display-name = "Default Layer"; - bindings = < - &kp A &bl BL_TOG - &rgb_ug RGB_EFF &bt BT_CLR - - &kp C &kp D - &kp E &kp F - >; - - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; -}; diff --git a/app/boards/shields/zmk_uno/zmk_uno_split_left.conf b/app/boards/shields/zmk_uno/zmk_uno_split_left.conf deleted file mode 100644 index 0c46ea98..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split_left.conf +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -CONFIG_LOG=y -CONFIG_ZMK_LOG_LEVEL_DBG=y - -CONFIG_ZMK_BLE_PASSKEY_ENTRY=n - -# Uncomment for Single color backlight -# CONFIG_ZMK_BACKLIGHT=y - -# Uncomment for RGB -# CONFIG_ZMK_RGB_UNDERGLOW=y - -# Uncomment for Display -# CONFIG_ZMK_DISPLAY=y - -# Uncomment these two lines to enable encoder support -# CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/zmk_uno/zmk_uno_split_left.overlay b/app/boards/shields/zmk_uno/zmk_uno_split_left.overlay deleted file mode 100644 index 5782e612..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split_left.overlay +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "zmk_uno_split.dtsi" - -&left_encoder { - status = "okay"; -}; diff --git a/app/boards/shields/zmk_uno/zmk_uno_split_right.conf b/app/boards/shields/zmk_uno/zmk_uno_split_right.conf deleted file mode 100644 index 0c46ea98..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split_right.conf +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -CONFIG_LOG=y -CONFIG_ZMK_LOG_LEVEL_DBG=y - -CONFIG_ZMK_BLE_PASSKEY_ENTRY=n - -# Uncomment for Single color backlight -# CONFIG_ZMK_BACKLIGHT=y - -# Uncomment for RGB -# CONFIG_ZMK_RGB_UNDERGLOW=y - -# Uncomment for Display -# CONFIG_ZMK_DISPLAY=y - -# Uncomment these two lines to enable encoder support -# CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/zmk_uno/zmk_uno_split_right.overlay b/app/boards/shields/zmk_uno/zmk_uno_split_right.overlay deleted file mode 100644 index acfad5a2..00000000 --- a/app/boards/shields/zmk_uno/zmk_uno_split_right.overlay +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "zmk_uno_split.dtsi" - -&split_matrix_transform { - row-offset = <3>; -}; - -&split_direct_matrix_transform { - row-offset = <1>; -}; - -&right_encoder { - status = "okay"; -}; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 07ed7dbe..e7538c41 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -24,6 +24,9 @@ config I2C config SSD1306 default y +config SSD1306_REVERSE_MODE + default y + endif # ZMK_DISPLAY if LVGL @@ -31,7 +34,7 @@ if LVGL config LV_Z_VDB_SIZE default 64 -config LV_DPI_DEF +config LV_Z_DPI default 148 config LV_Z_BITS_PER_PIXEL diff --git a/app/boards/shields/zodiark/zodiark.dtsi b/app/boards/shields/zodiark/zodiark.dtsi index aa68e20d..66ebb7b4 100644 --- a/app/boards/shields/zodiark/zodiark.dtsi +++ b/app/boards/shields/zodiark/zodiark.dtsi @@ -10,7 +10,7 @@ chosen { zephyr,display = &oled; zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { @@ -33,7 +33,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; + label = "KSCAN"; diode-direction = "col2row"; row-gpios @@ -47,6 +47,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -55,6 +56,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R right_encoder: encoder_right { compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -74,6 +76,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "DISPLAY"; width = <128>; height = <64>; segment-offset = <0>; @@ -81,6 +84,5 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R display-offset = <0>; multiplex-ratio = <31>; prechargep = <0x22>; - inversion-on; }; }; diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 7ca8d301..82639edc 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSPC | // | TAB | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ | @@ -32,7 +31,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | // | N.LC | 7 | 8 | 9 |PRTSC | SCRLK| | | | PAUSE| | 7 | 8 | 9 | F12 | @@ -51,7 +49,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // |BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | RESET | // | | | | | | | | | | | | | | |BLOADER| diff --git a/app/boards/sparkfun/pro_micro_rp2040/Kconfig.sparkfun_pro_micro_rp2040 b/app/boards/sparkfun/pro_micro_rp2040/Kconfig.sparkfun_pro_micro_rp2040 deleted file mode 100644 index 97f117f1..00000000 --- a/app/boards/sparkfun/pro_micro_rp2040/Kconfig.sparkfun_pro_micro_rp2040 +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_SPARKFUN_PRO_MICRO_RP2040 - select ZMK_BOARD_COMPAT if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK - imply RETAINED_MEM if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK - imply RETENTION if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK - imply RETENTION_BOOT_MODE if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK - - diff --git a/app/boards/sparkfun/pro_micro_rp2040/board.yml b/app/boards/sparkfun/pro_micro_rp2040/board.yml deleted file mode 100644 index 4f3dd49a..00000000 --- a/app/boards/sparkfun/pro_micro_rp2040/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: sparkfun_pro_micro_rp2040 - variants: - - name: zmk - qualifier: rp2040 diff --git a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk.dts b/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk.dts deleted file mode 100644 index 733e2d08..00000000 --- a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk.dts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040.dts> -#include - -&pro_micro_serial { status = "disabled"; }; - -// We override to 2MB for maximum compatibility -&code_partition { - reg = <0x100 (DT_SIZE_M(2) - 0x100 - DT_SIZE_K(512))>; -}; - -&flash0 { - reg = <0x10000000 DT_SIZE_M(2)>; - - partitions { - storage_partition: partition@180000 { - reg = <0x180000 DT_SIZE_K(512)>; - read-only; - }; - }; -}; diff --git a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk_defconfig b/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk_defconfig deleted file mode 100644 index 0c1a531e..00000000 --- a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk_defconfig +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 - -CONFIG_RESET=y - -# Enable clock control by default -CONFIG_CLOCK_CONTROL=y - -# Code partition needed to target the correct flash range -CONFIG_USE_DT_CODE_PARTITION=y - -# Output UF2 by default, native bootloader supports it. -CONFIG_BUILD_OUTPUT_UF2=y - -# USB HID -CONFIG_ZMK_USB=y - -# Settings Support -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/sparkfun_pro_micro_rp2040.conf b/app/boards/sparkfun_pro_micro_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/sparkfun_pro_micro_rp2040.overlay b/app/boards/sparkfun_pro_micro_rp2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi new file mode 100644 index 00000000..3cc76ad3 --- /dev/null +++ b/app/boards/usb_console.dtsi @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; +}; + +&usbd { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + diff --git a/app/boards/weact/blackpill_f401cc/Kconfig.blackpill_f401cc b/app/boards/weact/blackpill_f401cc/Kconfig.blackpill_f401cc deleted file mode 100644 index e4dcaeec..00000000 --- a/app/boards/weact/blackpill_f401cc/Kconfig.blackpill_f401cc +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BLACKPILL_F401CC - select ZMK_BOARD_COMPAT - diff --git a/app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml b/app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml deleted file mode 100644 index 2cf8c281..00000000 --- a/app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml +++ /dev/null @@ -1,9 +0,0 @@ -file_format: "1" -id: blackpill_f401cc//zmk -name: BlackPill F401CC -type: board -arch: arm -outputs: - - usb -url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 -exposes: [blackpill] diff --git a/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk.dts b/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk.dts deleted file mode 100644 index 4704552d..00000000 --- a/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk.dts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/weact/blackpill_f401cc/blackpill_f401cc.dts> - -/ { - blackpill: connector { - compatible = "blackpill"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <2 0 &gpioc 13 0> /* PC13 */ - , <3 0 &gpioc 14 0> /* PC14 */ - , <4 0 &gpioc 15 0> /* PC15 */ - , <10 0 &gpioa 0 0> /* PA0 */ - , <11 0 &gpioa 1 0> /* PA1 */ - , <12 0 &gpioa 2 0> /* PA2 */ - , <13 0 &gpioa 3 0> /* PA3 */ - , <14 0 &gpioa 4 0> /* PA4 */ - , <15 0 &gpioa 5 0> /* PA5 */ - , <16 0 &gpioa 6 0> /* PA6 */ - , <17 0 &gpioa 7 0> /* PA7 */ - , <18 0 &gpiob 0 0> /* PB0 */ - , <19 0 &gpiob 1 0> /* PB1 */ - , <20 0 &gpiob 2 0> /* PB2 */ - , <21 0 &gpiob 10 0> /* PB10 */ - , <25 0 &gpiob 12 0> /* PB12 */ - , <26 0 &gpiob 13 0> /* PB13 */ - , <27 0 &gpiob 14 0> /* PB14 */ - , <28 0 &gpiob 15 0> /* PB15 */ - , <29 0 &gpioa 8 0> /* PA8 */ - , <30 0 &gpioa 9 0> /* PA9 */ - , <31 0 &gpioa 10 0> /* PA10 */ - , <38 0 &gpioa 15 0> /* PA15 */ - , <39 0 &gpiob 3 0> /* PB3 */ - , <40 0 &gpiob 4 0> /* PB4 */ - , <41 0 &gpiob 5 0> /* PB5 */ - , <42 0 &gpiob 6 0> /* PB6 */ - , <43 0 &gpiob 7 0> /* PB7 */ - , <45 0 &gpiob 8 0> /* PB8 */ - , <46 0 &gpiob 9 0> /* PB9 */ - ; - }; -}; - -blackpill_i2c: &i2c1 {}; -blackpill_spi: &spi1 {}; -blackpill_serial: &usart1 {}; diff --git a/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk_defconfig b/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk_defconfig deleted file mode 100644 index c0efb874..00000000 --- a/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk_defconfig +++ /dev/null @@ -1,17 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable HW stack protection -CONFIG_HW_STACK_PROTECTION=y - - -# Enable GPIO -CONFIG_GPIO=y - -# USB HID -CONFIG_ZMK_USB=y - -# Defaults for matrix scanning to avoid interrupt issues -CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f401cc/board.yml b/app/boards/weact/blackpill_f401cc/board.yml deleted file mode 100644 index 7aa1253d..00000000 --- a/app/boards/weact/blackpill_f401cc/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: blackpill_f401cc - variants: - - name: zmk - qualifier: stm32f401xc diff --git a/app/boards/weact/blackpill_f401ce/Kconfig.blackpill_f401ce b/app/boards/weact/blackpill_f401ce/Kconfig.blackpill_f401ce deleted file mode 100644 index 870d8ef6..00000000 --- a/app/boards/weact/blackpill_f401ce/Kconfig.blackpill_f401ce +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BLACKPILL_F401CE - select ZMK_BOARD_COMPAT - diff --git a/app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk_defconfig b/app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk_defconfig deleted file mode 100644 index c0efb874..00000000 --- a/app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk_defconfig +++ /dev/null @@ -1,17 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable HW stack protection -CONFIG_HW_STACK_PROTECTION=y - - -# Enable GPIO -CONFIG_GPIO=y - -# USB HID -CONFIG_ZMK_USB=y - -# Defaults for matrix scanning to avoid interrupt issues -CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f401ce/board.yml b/app/boards/weact/blackpill_f401ce/board.yml deleted file mode 100644 index 85d23de1..00000000 --- a/app/boards/weact/blackpill_f401ce/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: blackpill_f401ce - variants: - - name: zmk - qualifier: stm32f401xe diff --git a/app/boards/weact/blackpill_f411ce/Kconfig.blackpill_f411ce b/app/boards/weact/blackpill_f411ce/Kconfig.blackpill_f411ce deleted file mode 100644 index 5f7a4f89..00000000 --- a/app/boards/weact/blackpill_f411ce/Kconfig.blackpill_f411ce +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_BLACKPILL_F411CE - select ZMK_BOARD_COMPAT - diff --git a/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk_defconfig b/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk_defconfig deleted file mode 100644 index c0efb874..00000000 --- a/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk_defconfig +++ /dev/null @@ -1,17 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# Enable HW stack protection -CONFIG_HW_STACK_PROTECTION=y - - -# Enable GPIO -CONFIG_GPIO=y - -# USB HID -CONFIG_ZMK_USB=y - -# Defaults for matrix scanning to avoid interrupt issues -CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f411ce/board.yml b/app/boards/weact/blackpill_f411ce/board.yml deleted file mode 100644 index d0bb7691..00000000 --- a/app/boards/weact/blackpill_f411ce/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: blackpill_f411ce - variants: - - name: zmk - qualifier: stm32f411xe diff --git a/app/boards/zhiayang/mikoto/Kconfig.mikoto b/app/boards/zhiayang/mikoto/Kconfig.mikoto deleted file mode 100644 index 6e952890..00000000 --- a/app/boards/zhiayang/mikoto/Kconfig.mikoto +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_MIKOTO - select SOC_NRF52840_QIAA - select ZMK_BOARD_COMPAT if BOARD_MIKOTO_NRF52840_ZMK - imply RETAINED_MEM if BOARD_MIKOTO_NRF52840_ZMK - imply RETENTION if BOARD_MIKOTO_NRF52840_ZMK - imply RETENTION_BOOT_MODE if BOARD_MIKOTO_NRF52840_ZMK - imply I2C if BOARD_REVISION="7.2.0" diff --git a/app/boards/zhiayang/mikoto/board.cmake b/app/boards/zhiayang/mikoto/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/boards/zhiayang/mikoto/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/zhiayang/mikoto/board.yml b/app/boards/zhiayang/mikoto/board.yml deleted file mode 100644 index 745ed1c3..00000000 --- a/app/boards/zhiayang/mikoto/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - extend: mikoto - variants: - - name: zmk - qualifier: nrf52840 diff --git a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk.dts b/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk.dts deleted file mode 100644 index 7363967a..00000000 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk.dts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/zhiayang/mikoto/mikoto.dts> -#include - -/ { - chosen { - zmk,battery = &vbatt; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; - - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 1>; - output-ohms = <10000000>; - full-ohms = <(10000000 + 4000000)>; - }; -}; diff --git a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_5_20_0.overlay b/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_5_20_0.overlay deleted file mode 100644 index e5ea4864..00000000 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_5_20_0.overlay +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/zhiayang/mikoto/mikoto-pinctrl.dtsi> -#include <../boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi> diff --git a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_6_1_0.overlay b/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_6_1_0.overlay deleted file mode 100644 index e5ea4864..00000000 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_6_1_0.overlay +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/zhiayang/mikoto/mikoto-pinctrl.dtsi> -#include <../boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi> diff --git a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_7_2_0.overlay b/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_7_2_0.overlay deleted file mode 100644 index 06db3f9c..00000000 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_7_2_0.overlay +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include <../boards/zhiayang/mikoto/mikoto-pinctrl.dtsi> -#include <../boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi> - -&pinctrl { - i2c1_default: i2c1_default { - group1 { - psels = , - ; - bias-pull-up; - }; - }; - - i2c1_sleep: i2c1_sleep { - group1 { - psels = , - ; - low-power-enable; - bias-pull-up; - }; - }; -}; - -&i2c1 { - status = "okay"; - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c1_default>; - pinctrl-1 = <&i2c1_sleep>; - pinctrl-names = "default", "sleep"; - - builtin_fuel_gauge: max17048@36 { - compatible = "zmk,maxim-max17048"; - status = "okay"; - reg = <0x36>; - }; -}; - -/ { - chosen { - zmk,battery = &builtin_fuel_gauge; - }; -}; diff --git a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_7_2_0_defconfig b/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_7_2_0_defconfig deleted file mode 100644 index 8bf92886..00000000 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_7_2_0_defconfig +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_I2C=y -CONFIG_ZMK_MAX17048=y diff --git a/app/boards/zhiayang/mikoto/pre_dt_board.cmake b/app/boards/zhiayang/mikoto/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/boards/zhiayang/mikoto/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake new file mode 100644 index 00000000..ade34199 --- /dev/null +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -0,0 +1,200 @@ +# TODO: Check for env or command line "ZMK_CONFIG" setting. +# * That directory should load +# * defconfigs, +# * .conf file, +# * single overlay, +# * or per board/shield. + +cmake_minimum_required(VERSION 3.15) + +list(APPEND BOARD_ROOT ${APPLICATION_SOURCE_DIR}) +list(APPEND DTS_ROOT ${APPLICATION_SOURCE_DIR}) + +get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE) + +set(user_config_cli_argument ${cached_user_config_value}) # Either new or old +if(user_config_cli_argument STREQUAL CACHED_ZMK_CONFIG) + # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI + unset(user_config_cli_argument) +endif() + +set(user_config_app_cmake_lists ${ZMK_CONFIG}) +if(cached_user_config_value STREQUAL ZMK_CONFIG) + # The app build scripts did not set a default, The ZMK_CONFIG we are + # reading is the cached value from the CLI + unset(user_config_app_cmake_lists) +endif() + +if(CACHED_ZMK_CONFIG) + # Warn the user if it looks like he is trying to change the user_config + # without cleaning first + if(user_config_cli_argument) + if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) + message(WARNING "The build directory must be cleaned pristinely when changing user ZMK config") + endif() + endif() + + set(ZMK_CONFIG ${CACHED_ZMK_CONFIG}) +elseif(user_config_cli_argument) + set(ZMK_CONFIG ${user_config_cli_argument}) + +elseif(DEFINED ENV{ZMK_CONFIG}) + set(ZMK_CONFIG $ENV{ZMK_CONFIG}) + +elseif(user_config_app_cmake_lists) + set(ZMK_CONFIG ${user_config_app_cmake_lists}) +endif() + +# Store the selected user_config in the cache +set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config") + +if (ZMK_CONFIG) + set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") + if(EXISTS ${ZMK_CONFIG}/boards) + message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") + list(APPEND BOARD_ROOT ${ZMK_CONFIG}) + endif() + if(EXISTS ${ZMK_CONFIG}/dts) + message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") + list(APPEND DTS_ROOT ${ZMK_CONFIG}) + endif() +endif() + + +if(DEFINED SHIELD) + string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") +endif() + +foreach(root ${BOARD_ROOT}) + set(shield_dir ${root}/boards/shields) + # Match the Kconfig.shield files in the shield directories to make sure we are + # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield + file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) + unset(SHIELD_LIST) + foreach(shields_refs ${shields_refs_list}) + get_filename_component(shield_path ${shields_refs} DIRECTORY) + file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) + foreach(overlay ${shield_overlays}) + get_filename_component(shield ${overlay} NAME_WE) + list(APPEND SHIELD_LIST ${shield}) + set(SHIELD_DIR_${shield} ${shield_path}) + endforeach() + endforeach() + + if (EXISTS "${root}/boards/${BOARD}.overlay") + list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") + endif() + if (NOT DEFINED BOARD_DIR_NAME) + find_path(BOARD_DIR + NAMES ${BOARD}_defconfig + PATHS ${root}/boards/*/* + NO_DEFAULT_PATH + ) + if(BOARD_DIR) + get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) + list(APPEND KEYMAP_DIRS ${BOARD_DIR}) + endif() + endif() + + if(DEFINED SHIELD) + foreach(s ${SHIELD_AS_LIST}) + if(NOT ${s} IN_LIST SHIELD_LIST) + message(WARNING "Didn't find ${s}") + continue() + endif() + message(STATUS "Adding ${SHIELD_DIR_${s}}") + list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + list(APPEND SHIELD_DIR ${shield_dir_name}) + endforeach() + endif() +endforeach() + +# Give a shield like `kyria_rev2_left` we want to use `kyria_rev2` and `kyria` as candidate names for +# overlay/conf/keymap files. +if(DEFINED SHIELD) + foreach(s ${SHIELD_AS_LIST}) + if (DEFINED $SHIELD_DIR_${s}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + string(REPLACE "_" ";" S_PIECES ${s}) + list(LENGTH S_PIECES S_PIECES_LEN) + while(NOT S_PIECES STREQUAL "") + list(POP_BACK S_PIECES) + list(JOIN S_PIECES "_" s_substr) + if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") + break() + endif() + list(APPEND shield_candidate_names ${s_substr}) + endwhile() + endforeach() +endif() + +if (ZMK_CONFIG) + if (EXISTS ${ZMK_CONFIG}) + message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") + list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") + + if (DEFINED SHIELD) + foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) + if (DEFINED ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") + if (NOT "${shield_dir_name}" STREQUAL "${s}") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") + endif() + list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") + endforeach() + endif() + + # TODO: Board revisions? + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") + + foreach(overlay ${overlay_candidates}) + if (EXISTS "${overlay}") + message(STATUS "ZMK Config devicetree overlay: ${overlay}") + list(APPEND shield_dts_files "${overlay}") + break() + endif() + endforeach() + + foreach(conf ${config_candidates}) + if (EXISTS "${conf}") + message(STATUS "ZMK Config Kconfig: ${conf}") + list(APPEND shield_conf_files "${conf}") + endif() + endforeach() + else() + message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") + endif() +endif() + + +if(NOT KEYMAP_FILE) + foreach(keymap_dir ${KEYMAP_DIRS}) + foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) + if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) + set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + break() + endif() + endforeach() + endforeach() +else() + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) +endif() + +if (NOT KEYMAP_FILE) + message(WARNING "Failed to locate keymap file!") +endif() diff --git a/app/core-coverage.yml b/app/core-coverage.yml index beefb2eb..4a60aad9 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -1,7 +1,7 @@ board: - - nice_nano//zmk - - nrfmicro/nrf52840/zmk - - proton_c//zmk + - nice_nano_v2 + - nrfmicro_13 + - proton_c shield: - corne_left - corne_right @@ -9,63 +9,27 @@ shield: - settings_reset - tidbit include: - - board: bdn9//zmk - - board: nice60//zmk - - board: xiao_ble//zmk + - board: bdn9_rev2 + - board: nice60 + - board: seeeduino_xiao_ble shield: hummingbird - - board: nrf52840_m2//zmk + - board: nrf52840_m2 shield: m60 - - board: planck//zmk - - board: proton_c//zmk + - board: planck_rev6 + - board: proton_c shield: clueboard_california - - board: nice_nano//zmk + - board: nice_nano_v2 shield: kyria_left cmake-args: "-DCONFIG_ZMK_DISPLAY=y" nickname: "display" - - board: nice_nano//zmk - shield: kyria_left - cmake-args: "-DCONFIG_ZMK_POINTING=y" - nickname: "mouse" - - board: sparkfun_pro_micro_rp2040//zmk - shield: reviung41 - cmake-args: "-DSNIPPET='zmk-usb-logging'" - - board: nice_nano//zmk + - board: nice_nano_v2 shield: kyria_right cmake-args: "-DCONFIG_ZMK_DISPLAY=y" nickname: "display" - - board: nice_nano//zmk + - board: nice_nano shield: romac_plus - cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y" + cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" nickname: "underglow" - - board: nice_nano//zmk + - board: nice_nano_v2 shield: lily58_left nice_view_adapter nice_view nickname: "niceview" - - board: bdn9//zmk - snippet: studio-rpc-usb-uart - cmake-args: "-DCONFIG_ZMK_STUDIO=y" - nickname: "stm32-studio" - - board: nice_nano//zmk - shield: reviung41 - snippet: studio-rpc-usb-uart - cmake-args: "-DCONFIG_ZMK_STUDIO=y" - nickname: "nrf52-studio" - - board: nice_nano//zmk - shield: corne_left - snippet: studio-rpc-usb-uart - cmake-args: "-DCONFIG_ZMK_STUDIO=y" - nickname: "split-left-studio" - - board: nice_nano//zmk - shield: corne_right - snippet: studio-rpc-usb-uart - cmake-args: "-DCONFIG_ZMK_STUDIO=y" - nickname: "split-right-studio" - - board: sparkfun_pro_micro_rp2040//zmk - shield: reviung41 - snippet: studio-rpc-usb-uart - cmake-args: "-DCONFIG_ZMK_STUDIO=y" - nickname: "rp2040-studio" - - board: seeeduino_xiao//zmk - shield: hummingbird - snippet: studio-rpc-usb-uart - cmake-args: "-DCONFIG_ZMK_STUDIO=y" - nickname: "samd21-studio" diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index 653b085d..b3502cbb 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -1,9 +1,3 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include #include #include @@ -24,7 +18,4 @@ #include #include #include -#include -#include -#include -#include +#include \ No newline at end of file diff --git a/app/dts/behaviors/backlight.dtsi b/app/dts/behaviors/backlight.dtsi index 9b6162e1..bebd6dfb 100644 --- a/app/dts/behaviors/backlight.dtsi +++ b/app/dts/behaviors/backlight.dtsi @@ -4,18 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(BL) - /omit-if-no-ref/ -#endif - // Behavior can be invoked on peripherals, so name must be <= 8 characters. - bl: bcklight { + /omit-if-no-ref/ bl: behavior_backlight { compatible = "zmk,behavior-backlight"; + label = "BCKLGHT"; #binding-cells = <2>; - display-name = "Backlight"; }; }; }; diff --git a/app/dts/behaviors/bluetooth.dtsi b/app/dts/behaviors/bluetooth.dtsi index 29fed4ce..a49ff4d6 100644 --- a/app/dts/behaviors/bluetooth.dtsi +++ b/app/dts/behaviors/bluetooth.dtsi @@ -4,17 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(BT) - /omit-if-no-ref/ -#endif - bt: bluetooth { + /omit-if-no-ref/ bt: behavior_bluetooth { compatible = "zmk,behavior-bluetooth"; + label = "BLUETOOTH"; #binding-cells = <2>; - display-name = "Bluetooth"; }; }; }; diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index 99354f42..219300dc 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -4,19 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include #include / { behaviors { -#if ZMK_BEHAVIOR_OMIT(CAPS_WORD) - /omit-if-no-ref/ -#endif - caps_word: caps_word { + /omit-if-no-ref/ caps_word: behavior_caps_word { compatible = "zmk,behavior-caps-word"; + label = "CAPS_WORD"; #binding-cells = <0>; continue-list = ; - display-name = "Caps Word"; }; }; }; diff --git a/app/dts/behaviors/ext_power.dtsi b/app/dts/behaviors/ext_power.dtsi index 08113f94..f61170dd 100644 --- a/app/dts/behaviors/ext_power.dtsi +++ b/app/dts/behaviors/ext_power.dtsi @@ -6,11 +6,10 @@ / { behaviors { - // Behavior can be invoked on peripherals, so name must be <= 8 characters. - ext_power: extpower { + ext_power: behavior_ext_power { compatible = "zmk,behavior-ext-power"; + label = "EXTPOWER"; #binding-cells = <1>; - display-name = "External Power"; }; }; }; diff --git a/app/dts/behaviors/gresc.dtsi b/app/dts/behaviors/gresc.dtsi index e3e0935f..fa4c685b 100644 --- a/app/dts/behaviors/gresc.dtsi +++ b/app/dts/behaviors/gresc.dtsi @@ -4,21 +4,16 @@ * SPDX-License-Identifier: MIT */ - -#include #include / { behaviors { -#if ZMK_BEHAVIOR_OMIT(GRESC) - /omit-if-no-ref/ -#endif - gresc: grave_escape { + /omit-if-no-ref/ gresc: grave_escape { compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; #binding-cells = <0>; bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - display-name = "Grave/Escape"; }; }; }; diff --git a/app/dts/behaviors/key_press.dtsi b/app/dts/behaviors/key_press.dtsi index 08adbf79..b0fc2db1 100644 --- a/app/dts/behaviors/key_press.dtsi +++ b/app/dts/behaviors/key_press.dtsi @@ -4,17 +4,13 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(KP) - /omit-if-no-ref/ -#endif - kp: key_press { + /* DEPRECATED: `cp` will be removed in the future */ + /omit-if-no-ref/ cp: kp: behavior_key_press { compatible = "zmk,behavior-key-press"; + label = "KEY_PRESS"; #binding-cells = <1>; - display-name = "Key Press"; }; }; }; diff --git a/app/dts/behaviors/key_repeat.dtsi b/app/dts/behaviors/key_repeat.dtsi index d2144699..795a77f6 100644 --- a/app/dts/behaviors/key_repeat.dtsi +++ b/app/dts/behaviors/key_repeat.dtsi @@ -4,19 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include #include / { behaviors { -#if ZMK_BEHAVIOR_OMIT(KEY_REPEAT) - /omit-if-no-ref/ -#endif - key_repeat: key_repeat { + /omit-if-no-ref/ key_repeat: behavior_key_repeat { compatible = "zmk,behavior-key-repeat"; + label = "KEY_REPEAT"; #binding-cells = <0>; usage-pages = ; - display-name = "Key Repeat"; }; }; }; diff --git a/app/dts/behaviors/key_toggle.dtsi b/app/dts/behaviors/key_toggle.dtsi index cd43c592..df581014 100644 --- a/app/dts/behaviors/key_toggle.dtsi +++ b/app/dts/behaviors/key_toggle.dtsi @@ -4,17 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(KT) - /omit-if-no-ref/ -#endif - kt: key_toggle { + /omit-if-no-ref/ kt: behavior_key_toggle { compatible = "zmk,behavior-key-toggle"; + label = "KEY_TOGGLE"; #binding-cells = <1>; - display-name = "Key Toggle"; }; }; }; diff --git a/app/dts/behaviors/layer_tap.dtsi b/app/dts/behaviors/layer_tap.dtsi index 9c1bea1a..1d92245c 100644 --- a/app/dts/behaviors/layer_tap.dtsi +++ b/app/dts/behaviors/layer_tap.dtsi @@ -4,20 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(LT) - /omit-if-no-ref/ -#endif - lt: layer_tap { + /omit-if-no-ref/ lt: behavior_layer_tap { compatible = "zmk,behavior-hold-tap"; + label = "LAYER_TAP"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <200>; bindings = <&mo>, <&kp>; - display-name = "Layer-Tap"; }; }; }; diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 44bc7ab7..36b4a8d3 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -5,8 +5,10 @@ */ #define MACRO_PLACEHOLDER 0 +#define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ compatible = "zmk,behavior-macro"; \ #binding-cells = <0>; \ __VA_ARGS__ \ @@ -14,6 +16,7 @@ name: name { \ #define ZMK_MACRO1(name,...) \ name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ compatible = "zmk,behavior-macro-one-param"; \ #binding-cells = <1>; \ __VA_ARGS__ \ @@ -21,6 +24,7 @@ name: name { \ #define ZMK_MACRO2(name,...) \ name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ compatible = "zmk,behavior-macro-two-param"; \ #binding-cells = <2>; \ __VA_ARGS__ \ @@ -28,53 +32,63 @@ name: name { \ / { behaviors { - macro_tap: macro_tap { + macro_tap: macro_control_mode_tap { compatible = "zmk,macro-control-mode-tap"; + label = "MAC_TAP"; #binding-cells = <0>; }; - macro_press: macro_press { + macro_press: macro_control_mode_press { compatible = "zmk,macro-control-mode-press"; + label = "MAC_PRESS"; #binding-cells = <0>; }; - macro_release: macro_release { + macro_release: macro_control_mode_release { compatible = "zmk,macro-control-mode-release"; + label = "MAC_REL"; #binding-cells = <0>; }; - macro_tap_time: macro_tap_time { + macro_tap_time: macro_control_tap_time { compatible = "zmk,macro-control-tap-time"; + label = "MAC_TAP_TIME"; #binding-cells = <1>; }; - macro_wait_time: macro_wait_time { + macro_wait_time: macro_control_wait_time { compatible = "zmk,macro-control-wait-time"; + label = "MAC_WAIT_TIME"; #binding-cells = <1>; }; macro_pause_for_release: macro_pause_for_release { compatible = "zmk,macro-pause-for-release"; + label = "MAC_WAIT_REL"; #binding-cells = <0>; }; macro_param_1to1: macro_param_1to1 { compatible = "zmk,macro-param-1to1"; + label = "MAC_PARAM_1TO1"; #binding-cells = <0>; }; macro_param_1to2: macro_param_1to2 { compatible = "zmk,macro-param-1to2"; + label = "MAC_PARAM_1TO2"; #binding-cells = <0>; }; macro_param_2to1: macro_param_2to1 { compatible = "zmk,macro-param-2to1"; + label = "MAC_PARAM_2TO1"; #binding-cells = <0>; }; macro_param_2to2: macro_param_2to2 { compatible = "zmk,macro-param-2to2"; + label = "MAC_PARAM_2TO2"; #binding-cells = <0>; }; }; diff --git a/app/dts/behaviors/mod_tap.dtsi b/app/dts/behaviors/mod_tap.dtsi index b5e52e66..d441a4f1 100644 --- a/app/dts/behaviors/mod_tap.dtsi +++ b/app/dts/behaviors/mod_tap.dtsi @@ -4,20 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(MT) - /omit-if-no-ref/ -#endif - mt: mod_tap { + /omit-if-no-ref/ mt: behavior_mod_tap { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "hold-preferred"; tapping-term-ms = <200>; bindings = <&kp>, <&kp>; - display-name = "Mod-Tap"; }; }; }; diff --git a/app/dts/behaviors/momentary_layer.dtsi b/app/dts/behaviors/momentary_layer.dtsi index c263ef10..d1c91232 100644 --- a/app/dts/behaviors/momentary_layer.dtsi +++ b/app/dts/behaviors/momentary_layer.dtsi @@ -4,17 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(MO) - /omit-if-no-ref/ -#endif - mo: momentary_layer { + /omit-if-no-ref/ mo: behavior_momentary_layer { compatible = "zmk,behavior-momentary-layer"; + label = "MO"; #binding-cells = <1>; - display-name = "Momentary Layer"; }; }; }; diff --git a/app/dts/behaviors/mouse_key_press.dtsi b/app/dts/behaviors/mouse_key_press.dtsi deleted file mode 100644 index c20f04c0..00000000 --- a/app/dts/behaviors/mouse_key_press.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - - #include - -/ { - behaviors { -#if ZMK_BEHAVIOR_OMIT(MKP) - /omit-if-no-ref/ -#endif - mkp: mouse_key_press { - compatible = "zmk,behavior-mouse-key-press"; - #binding-cells = <1>; - display-name = "Mouse Key Press"; - }; - }; - - mkp_input_listener: mkp_input_listener { - compatible = "zmk,input-listener"; - device = <&mkp>; - }; -}; diff --git a/app/dts/behaviors/mouse_keys.dtsi b/app/dts/behaviors/mouse_keys.dtsi deleted file mode 100644 index f9a99fed..00000000 --- a/app/dts/behaviors/mouse_keys.dtsi +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "mouse_key_press.dtsi" -#include "mouse_move.dtsi" -#include "mouse_scroll.dtsi" \ No newline at end of file diff --git a/app/dts/behaviors/mouse_move.dtsi b/app/dts/behaviors/mouse_move.dtsi deleted file mode 100644 index 09b93520..00000000 --- a/app/dts/behaviors/mouse_move.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - behaviors { - /omit-if-no-ref/ mmv: mouse_move { - compatible = "zmk,behavior-input-two-axis"; - #binding-cells = <1>; - x-input-code = ; - y-input-code = ; - time-to-max-speed-ms = <300>; - acceleration-exponent = <1>; - }; - }; - - mmv_input_listener: mmv_input_listener { - compatible = "zmk,input-listener"; - device = <&mmv>; - }; -}; diff --git a/app/dts/behaviors/mouse_scroll.dtsi b/app/dts/behaviors/mouse_scroll.dtsi deleted file mode 100644 index b482efde..00000000 --- a/app/dts/behaviors/mouse_scroll.dtsi +++ /dev/null @@ -1,26 +0,0 @@ - -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - behaviors { - /omit-if-no-ref/ msc: mouse_scroll { - compatible = "zmk,behavior-input-two-axis"; - #binding-cells = <1>; - x-input-code = ; - y-input-code = ; - time-to-max-speed-ms = <300>; - acceleration-exponent = <0>; - }; - }; - - msc_input_listener: msc_input_listener { - compatible = "zmk,input-listener"; - device = <&msc>; - }; -}; diff --git a/app/dts/behaviors/none.dtsi b/app/dts/behaviors/none.dtsi index 5ac55438..fc4890c3 100644 --- a/app/dts/behaviors/none.dtsi +++ b/app/dts/behaviors/none.dtsi @@ -4,17 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(NONE) - /omit-if-no-ref/ -#endif - none: none { + /omit-if-no-ref/ none: behavior_none { compatible = "zmk,behavior-none"; + label = "NONE"; #binding-cells = <0>; - display-name = "None"; }; }; }; diff --git a/app/dts/behaviors/outputs.dtsi b/app/dts/behaviors/outputs.dtsi index 6071dcbd..88e8f882 100644 --- a/app/dts/behaviors/outputs.dtsi +++ b/app/dts/behaviors/outputs.dtsi @@ -4,17 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(OUT) - /omit-if-no-ref/ -#endif - out: outputs { + /omit-if-no-ref/ out: behavior_outputs { compatible = "zmk,behavior-outputs"; + label = "OUTPUTS"; #binding-cells = <1>; - display-name = "Output Selection"; }; }; }; diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index 1b29f9d1..2e775269 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -8,20 +8,17 @@ / { behaviors { - // Behavior can be invoked on peripherals, so name must be <= 8 characters. - sys_reset: sysreset { + sys_reset: behavior_reset { compatible = "zmk,behavior-reset"; + label = "SYSRESET"; #binding-cells = <0>; - display-name = "Reset"; }; - // Behavior can be invoked on peripherals, so name must be <= 8 characters. - bootloader: bootload { + bootloader: behavior_reset_dfu { compatible = "zmk,behavior-reset"; + label = "BOOTLOAD"; type = ; - bootloader; #binding-cells = <0>; - display-name = "Bootloader"; }; }; }; diff --git a/app/dts/behaviors/rgb_underglow.dtsi b/app/dts/behaviors/rgb_underglow.dtsi index 07640058..6ffec2e6 100644 --- a/app/dts/behaviors/rgb_underglow.dtsi +++ b/app/dts/behaviors/rgb_underglow.dtsi @@ -6,11 +6,10 @@ / { behaviors { - // Behavior can be invoked on peripherals, so name must be <= 8 characters. - rgb_ug: rgb_ug { + rgb_ug: behavior_rgb_underglow { compatible = "zmk,behavior-rgb-underglow"; + label = "RGB_UG"; #binding-cells = <2>; - display-name = "Underglow"; }; }; }; diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index d9bdbfe5..dc30b798 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -7,8 +7,9 @@ / { behaviors { /* DEPRECATED: `inc_dec_cp` will be removed in the future */ - /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: enc_key_press { + /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KEY_PRESS"; #sensor-binding-cells = <2>; bindings = <&kp>, <&kp>; }; diff --git a/app/dts/behaviors/soft_off.dtsi b/app/dts/behaviors/soft_off.dtsi deleted file mode 100644 index 68dce9c9..00000000 --- a/app/dts/behaviors/soft_off.dtsi +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - behaviors { -#if ZMK_BEHAVIOR_OMIT(SOFT_OFF) - /omit-if-no-ref/ -#endif - soft_off: z_so_off { - compatible = "zmk,behavior-soft-off"; - #binding-cells = <0>; - split-peripheral-off-on-press; - }; - }; -}; diff --git a/app/dts/behaviors/sticky_key.dtsi b/app/dts/behaviors/sticky_key.dtsi index 4429ffc4..72a80a90 100644 --- a/app/dts/behaviors/sticky_key.dtsi +++ b/app/dts/behaviors/sticky_key.dtsi @@ -4,31 +4,23 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(SK) - /omit-if-no-ref/ -#endif - sk: sticky_key { + /omit-if-no-ref/ sk: behavior_sticky_key { compatible = "zmk,behavior-sticky-key"; + label = "STICKY_KEY"; #binding-cells = <1>; release-after-ms = <1000>; bindings = <&kp>; ignore-modifiers; - display-name = "Sticky Key"; }; -#if ZMK_BEHAVIOR_OMIT(STICKY_LAYER) - /omit-if-no-ref/ -#endif - sl: sticky_layer { + /omit-if-no-ref/ sl: behavior_sticky_layer { compatible = "zmk,behavior-sticky-key"; + label = "STICKY_LAYER"; #binding-cells = <1>; release-after-ms = <1000>; bindings = <&mo>; quick-release; - display-name = "Sticky Layer"; }; }; diff --git a/app/dts/behaviors/studio_unlock.dtsi b/app/dts/behaviors/studio_unlock.dtsi deleted file mode 100644 index 2426662c..00000000 --- a/app/dts/behaviors/studio_unlock.dtsi +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/ { - behaviors { - studio_unlock: studio_unlock { - compatible = "zmk,behavior-studio-unlock"; - #binding-cells = <0>; - display-name = "Studio Unlock"; - }; - }; -}; diff --git a/app/dts/behaviors/to_layer.dtsi b/app/dts/behaviors/to_layer.dtsi index 89bc91ca..0ea66fa9 100644 --- a/app/dts/behaviors/to_layer.dtsi +++ b/app/dts/behaviors/to_layer.dtsi @@ -4,18 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(TO) - /omit-if-no-ref/ -#endif - to: to_layer { + /omit-if-no-ref/ to: behavior_to_layer { compatible = "zmk,behavior-to-layer"; + label = "TO_LAYER"; #binding-cells = <1>; - display-name = "To Layer"; - locking; }; }; }; diff --git a/app/dts/behaviors/toggle_layer.dtsi b/app/dts/behaviors/toggle_layer.dtsi index a0c85340..75730934 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -4,18 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(TOG) - /omit-if-no-ref/ -#endif - tog: toggle_layer { + /omit-if-no-ref/ tog: behavior_toggle_layer { compatible = "zmk,behavior-toggle-layer"; + label = "TOGGLE_LAYER"; #binding-cells = <1>; - display-name = "Toggle Layer"; - locking; }; }; }; diff --git a/app/dts/behaviors/transparent.dtsi b/app/dts/behaviors/transparent.dtsi index 09d29a4a..0dfaade2 100644 --- a/app/dts/behaviors/transparent.dtsi +++ b/app/dts/behaviors/transparent.dtsi @@ -4,17 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include - / { behaviors { -#if ZMK_BEHAVIOR_OMIT(TRANS) - /omit-if-no-ref/ -#endif - trans: transparent { + /omit-if-no-ref/ trans: behavior_transparent { compatible = "zmk,behavior-transparent"; + label = "TRANS"; #binding-cells = <0>; - display-name = "Transparent"; }; }; }; diff --git a/app/dts/bindings/behaviors/behavior-metadata.yaml b/app/dts/bindings/behaviors/behavior-metadata.yaml deleted file mode 100644 index 3a758ba3..00000000 --- a/app/dts/bindings/behaviors/behavior-metadata.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -properties: - display-name: - type: string diff --git a/app/dts/bindings/behaviors/one_param.yaml b/app/dts/bindings/behaviors/one_param.yaml index fa4c2dc0..faa01a0d 100644 --- a/app/dts/bindings/behaviors/one_param.yaml +++ b/app/dts/bindings/behaviors/one_param.yaml @@ -1,13 +1,10 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -include: behavior-metadata.yaml - properties: label: type: string - required: false - deprecated: true + required: true "#binding-cells": type: int required: true diff --git a/app/dts/bindings/behaviors/two_param.yaml b/app/dts/bindings/behaviors/two_param.yaml index af9618e1..d4cdfaa0 100644 --- a/app/dts/bindings/behaviors/two_param.yaml +++ b/app/dts/bindings/behaviors/two_param.yaml @@ -1,13 +1,10 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -include: behavior-metadata.yaml - properties: label: type: string - required: false - deprecated: true + required: true "#binding-cells": type: int required: true diff --git a/app/dts/bindings/behaviors/zero_param.yaml b/app/dts/bindings/behaviors/zero_param.yaml index deed5a12..075270d6 100644 --- a/app/dts/bindings/behaviors/zero_param.yaml +++ b/app/dts/bindings/behaviors/zero_param.yaml @@ -1,13 +1,10 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -include: behavior-metadata.yaml - properties: label: type: string - required: false - deprecated: true + required: true "#binding-cells": type: int required: true diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index 76f14d12..57575411 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -37,10 +37,6 @@ properties: - "balanced" - "tap-preferred" - "tap-unless-interrupted" - hold-while-undecided: - type: boolean - hold-while-undecided-linger: - type: boolean retro-tap: type: boolean hold-trigger-key-positions: diff --git a/app/dts/bindings/behaviors/zmk,behavior-input-two-axis.yaml b/app/dts/bindings/behaviors/zmk,behavior-input-two-axis.yaml deleted file mode 100644 index 80972212..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-input-two-axis.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Two axis input behavior - -compatible: "zmk,behavior-input-two-axis" - -include: one_param.yaml - -properties: - x-input-code: - type: int - required: true - y-input-code: - type: int - required: true - trigger-period-ms: - type: int - default: 16 - description: The time (in ms) between generated inputs when an input has non-zero speed. - delay-ms: - type: int - time-to-max-speed-ms: - type: int - required: true - acceleration-exponent: - type: int - default: 1 diff --git a/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml b/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml index 7e465e88..e3ec86f7 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml @@ -6,13 +6,3 @@ description: Key toggle behavior compatible: "zmk,behavior-key-toggle" include: one_param.yaml - -properties: - toggle-mode: - type: string - required: false - default: "flip" - enum: - - "on" - - "off" - - "flip" diff --git a/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml index 453dbcd2..5423e29c 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml @@ -6,8 +6,3 @@ description: Momentary layer on press/release behavior compatible: "zmk,behavior-momentary-layer" include: one_param.yaml - -properties: - locking: - type: boolean - description: Whether to "lock" the layer active, preventing behaviors without the "locking" property from deactivating the layer diff --git a/app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml b/app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml deleted file mode 100644 index 8540916b..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml +++ /dev/null @@ -1,5 +0,0 @@ -description: Mouse key press/release behavior - -compatible: "zmk,behavior-mouse-key-press" - -include: one_param.yaml diff --git a/app/dts/bindings/behaviors/zmk,behavior-reset.yaml b/app/dts/bindings/behaviors/zmk,behavior-reset.yaml index aeb9450e..9eb7aa6a 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-reset.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-reset.yaml @@ -11,5 +11,3 @@ properties: type: type: int default: 0 - bootloader: - type: boolean diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml index d286f9c4..0da3b4db 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml @@ -8,8 +8,7 @@ compatible: "zmk,behavior-sensor-rotate-var" properties: label: type: string - required: false - deprecated: true + required: true "#sensor-binding-cells": type: int required: true diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml index dbb92c8b..d20777b8 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml @@ -8,8 +8,7 @@ compatible: "zmk,behavior-sensor-rotate" properties: label: type: string - required: false - deprecated: true + required: true "#sensor-binding-cells": type: int required: true diff --git a/app/dts/bindings/behaviors/zmk,behavior-soft-off.yaml b/app/dts/bindings/behaviors/zmk,behavior-soft-off.yaml deleted file mode 100644 index 865e656f..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-soft-off.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Soft-Off Behavior - -compatible: "zmk,behavior-soft-off" - -include: zero_param.yaml - -properties: - hold-time-ms: - type: int - required: false - description: Number of milliseconds the behavior must be held before releasing will actually trigger a soft-off. - split-peripheral-off-on-press: - type: boolean - description: When built for a split peripheral, turn off on press, not release diff --git a/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml b/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml index a0e52879..172f20a2 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml @@ -16,7 +16,5 @@ properties: required: true quick-release: type: boolean - lazy: - type: boolean ignore-modifiers: type: boolean diff --git a/app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml b/app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml deleted file mode 100644 index 25942b94..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Studio Unlock Behavior - -compatible: "zmk,behavior-studio-unlock" - -include: zero_param.yaml diff --git a/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml index 52deecd3..cbafddf7 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml @@ -6,8 +6,3 @@ description: To Layer compatible: "zmk,behavior-to-layer" include: one_param.yaml - -properties: - locking: - type: boolean - description: Whether to "lock" the layer active, preventing behaviors without the "locking" property from deactivating the layer diff --git a/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml index 71d70a3a..0a9723f7 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml @@ -6,15 +6,3 @@ description: Toggle Layer compatible: "zmk,behavior-toggle-layer" include: one_param.yaml - -properties: - toggle-mode: - type: string - default: "flip" - enum: - - "on" - - "off" - - "flip" - locking: - type: boolean - description: Whether to "lock" the layer active, preventing behaviors without the "locking" property from deactivating the layer diff --git a/app/dts/bindings/gpio/moergo,glove80-ext.yaml b/app/dts/bindings/gpio/moergo,glove80-ext.yaml deleted file mode 100644 index ca438a1c..00000000 --- a/app/dts/bindings/gpio/moergo,glove80-ext.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - GPIO pins exposed on the Glove80 internal extension header. - - See https://docs.moergo.com/glove80-user-guide/appendix-more-customizations/ - - Both sides of the Glove80 split keyboard expose a set of 6 extra GPIO pins - for customization, with different underlying nRF52 pins used on each side. - This nexus node allows referencing the pins generically without being tied - to a specific left/right side pin assignment. - - - - GND VEXT - - - VDDH EXT1 1 - 2 EXT2 EXT3 3 - 4 EXT4 EXT5 5 - 6 SWO_EXT6 RESET - - - SWDCLK SWDIO - - -compatible: "moergo,glove80-ext" - -include: [gpio-nexus.yaml, base.yaml] diff --git a/app/dts/bindings/indicators/zmk,indicator-leds.yaml b/app/dts/bindings/indicators/zmk,indicator-leds.yaml deleted file mode 100644 index e6ea5b06..00000000 --- a/app/dts/bindings/indicators/zmk,indicator-leds.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2025, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Display the states of HID indicators using LEDs - -compatible: "zmk,indicator-leds" - -child-binding: - properties: - leds: - type: phandles - required: true - description: One or more LED devices to control - - indicator: - type: int - required: true - description: HID_INDICATOR_* value to indicate (see dt-bindings/zmk/hid_indicators.h) - - active-brightness: - type: int - description: LED brightness in percent when the indicator is active - default: 100 - - inactive-brightness: - type: int - description: LED brightness in percent when the indicator is not active - default: 0 - - disconnected-brightness: - type: int - description: LED brightness in percent when the keyboard is not connected to any device - default: 0 - - on-while-idle: - type: boolean - description: Keep LEDs enabled even when the keyboard is idle and on battery power diff --git a/app/dts/bindings/input_processors/ip_common.yaml b/app/dts/bindings/input_processors/ip_common.yaml deleted file mode 100644 index 9add07ac..00000000 --- a/app/dts/bindings/input_processors/ip_common.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -properties: - track-remainders: - type: boolean diff --git a/app/dts/bindings/input_processors/ip_one_param.yaml b/app/dts/bindings/input_processors/ip_one_param.yaml deleted file mode 100644 index 6ef83b14..00000000 --- a/app/dts/bindings/input_processors/ip_one_param.yaml +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -include: ip_common.yaml - -properties: - "#input-processor-cells": - type: int - required: true - const: 1 - -input-processor-cells: - - param1 diff --git a/app/dts/bindings/input_processors/ip_two_param.yaml b/app/dts/bindings/input_processors/ip_two_param.yaml deleted file mode 100644 index f9538eb1..00000000 --- a/app/dts/bindings/input_processors/ip_two_param.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -include: ip_common.yaml - -properties: - "#input-processor-cells": - type: int - required: true - const: 2 - -input-processor-cells: - - param1 - - param2 diff --git a/app/dts/bindings/input_processors/ip_zero_param.yaml b/app/dts/bindings/input_processors/ip_zero_param.yaml deleted file mode 100644 index c22f6ec8..00000000 --- a/app/dts/bindings/input_processors/ip_zero_param.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -include: ip_common.yaml - -properties: - "#input-processor-cells": - type: int - required: true - const: 0 diff --git a/app/dts/bindings/input_processors/zmk,input-processor-behaviors.yaml b/app/dts/bindings/input_processors/zmk,input-processor-behaviors.yaml deleted file mode 100644 index c8c54c55..00000000 --- a/app/dts/bindings/input_processors/zmk,input-processor-behaviors.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2024, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Input Processor for invoking behaviors on certain events - -compatible: "zmk,input-processor-behaviors" - -include: ip_zero_param.yaml - -properties: - type: - type: int - codes: - type: array - required: true - bindings: - type: phandle-array - required: true diff --git a/app/dts/bindings/input_processors/zmk,input-processor-code-mapper.yaml b/app/dts/bindings/input_processors/zmk,input-processor-code-mapper.yaml deleted file mode 100644 index 6cad85a8..00000000 --- a/app/dts/bindings/input_processors/zmk,input-processor-code-mapper.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2024, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Input Processor for remapping certain input codes to other codes - -compatible: "zmk,input-processor-code-mapper" - -include: ip_zero_param.yaml - -properties: - type: - type: int - required: true - map: - type: array - required: true diff --git a/app/dts/bindings/input_processors/zmk,input-processor-scaler.yaml b/app/dts/bindings/input_processors/zmk,input-processor-scaler.yaml deleted file mode 100644 index da7ca13f..00000000 --- a/app/dts/bindings/input_processors/zmk,input-processor-scaler.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2024, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Input Processor for scaling values - -compatible: "zmk,input-processor-scaler" - -include: ip_two_param.yaml - -properties: - type: - type: int - required: true - codes: - type: array - required: true diff --git a/app/dts/bindings/input_processors/zmk,input-processor-temp-layer.yaml b/app/dts/bindings/input_processors/zmk,input-processor-temp-layer.yaml deleted file mode 100644 index e69cd58d..00000000 --- a/app/dts/bindings/input_processors/zmk,input-processor-temp-layer.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2024, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Input Processor for temporarily enabling a layer after input events - -compatible: "zmk,input-processor-temp-layer" - -include: ip_two_param.yaml - -properties: - require-prior-idle-ms: - type: int - required: false - default: 0 - description: Time in milliseconds that must pass after the last keystroke before the layer can be toggled - - excluded-positions: - type: array - required: false - default: [] - description: Array of key positions that will NOT trigger layer deactivation when pressed diff --git a/app/dts/bindings/input_processors/zmk,input-processor-transform.yaml b/app/dts/bindings/input_processors/zmk,input-processor-transform.yaml deleted file mode 100644 index 24fbd288..00000000 --- a/app/dts/bindings/input_processors/zmk,input-processor-transform.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2024, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Input Processor for transforming values in various ways - -compatible: "zmk,input-processor-transform" - -include: ip_one_param.yaml - -properties: - type: - type: int - x-codes: - type: array - required: true - y-codes: - type: array - required: true diff --git a/app/dts/bindings/kscan/zmk,kscan-sideband-behaviors.yaml b/app/dts/bindings/kscan/zmk,kscan-sideband-behaviors.yaml deleted file mode 100644 index e38beeb4..00000000 --- a/app/dts/bindings/kscan/zmk,kscan-sideband-behaviors.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2023, The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - kscan sideband behavior runner. Only basic system behaviors should be used, - since no keymap processing occurs when using them. Primarily, that means avoiding - using tap-holds, sticky keys, etc. as sideband behaviors. - -compatible: "zmk,kscan-sideband-behaviors" - -include: kscan.yaml - -properties: - auto-enable: - type: boolean - - kscan: - type: phandle - required: true - -child-binding: - description: "A sideband behavior tied to a row/column pair" - - properties: - row: - type: int - default: 0 - column: - type: int - required: true - bindings: - type: phandle-array - required: true diff --git a/app/dts/bindings/retained_mem/zmk,bootmode-to-magic-mapper.yaml b/app/dts/bindings/retained_mem/zmk,bootmode-to-magic-mapper.yaml deleted file mode 100644 index 5d8b70c6..00000000 --- a/app/dts/bindings/retained_mem/zmk,bootmode-to-magic-mapper.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Driver for mapping bootloader boot mode to a magic value - -compatible: "zmk,bootmode-to-magic-mapper" - -include: base.yaml diff --git a/app/dts/bindings/vendor-prefixes.txt b/app/dts/bindings/vendor-prefixes.txt index 889ba584..72066dfb 100644 --- a/app/dts/bindings/vendor-prefixes.txt +++ b/app/dts/bindings/vendor-prefixes.txt @@ -1,2 +1 @@ -zmk ZMK Project -moergo MoErgo \ No newline at end of file +zmk ZMK Project \ No newline at end of file diff --git a/app/dts/bindings/zmk,combos.yaml b/app/dts/bindings/zmk,combos.yaml index 5ab0085d..f146ab7a 100644 --- a/app/dts/bindings/zmk,combos.yaml +++ b/app/dts/bindings/zmk,combos.yaml @@ -25,3 +25,4 @@ child-binding: type: boolean layers: type: array + default: [-1] diff --git a/app/dts/bindings/zmk,ext-power-generic.yaml b/app/dts/bindings/zmk,ext-power-generic.yaml index cb2a16b5..ddb4b3de 100644 --- a/app/dts/bindings/zmk,ext-power-generic.yaml +++ b/app/dts/bindings/zmk,ext-power-generic.yaml @@ -14,8 +14,7 @@ properties: required: true label: type: string - required: false - deprecated: true + required: true init-delay-ms: type: int description: Number of milliseconds to delay after initializing driver diff --git a/app/dts/bindings/zmk,gpio-key-wakeup-trigger.yaml b/app/dts/bindings/zmk,gpio-key-wakeup-trigger.yaml deleted file mode 100644 index 4e16ff33..00000000 --- a/app/dts/bindings/zmk,gpio-key-wakeup-trigger.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Driver for a dedicated key for waking the device from sleep - -compatible: "zmk,gpio-key-wakeup-trigger" - -include: base.yaml - -properties: - trigger: - type: phandle - required: true - description: The GPIO key that triggers wake via interrupt - extra-gpios: - type: phandle-array - description: Optional set of pins that should be set active before sleeping. diff --git a/app/dts/bindings/zmk,input-listener.yaml b/app/dts/bindings/zmk,input-listener.yaml deleted file mode 100644 index 5516794c..00000000 --- a/app/dts/bindings/zmk,input-listener.yaml +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Listener to subscribe to input events and send HID updates after processing - -compatible: "zmk,input-listener" - -properties: - device: - type: phandle - required: true - input-processors: - type: phandle-array - -child-binding: - description: "Listener overrides for certain layers" - - properties: - layers: - type: array - required: true - process-next: - type: boolean - input-processors: - type: phandle-array diff --git a/app/dts/bindings/zmk,input-split.yaml b/app/dts/bindings/zmk,input-split.yaml deleted file mode 100644 index 76d15a36..00000000 --- a/app/dts/bindings/zmk,input-split.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -include: [base.yaml] - -compatible: "zmk,input-split" - -description: Device to wire up an input device for split use. - -properties: - reg: - required: true - - device: - type: phandle - - input-processors: - type: phandle-array diff --git a/app/dts/bindings/zmk,key-physical-attrs.yaml b/app/dts/bindings/zmk,key-physical-attrs.yaml deleted file mode 100644 index 9ea070f8..00000000 --- a/app/dts/bindings/zmk,key-physical-attrs.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# -# SPDX-License-Identifier: MIT - -description: | - The physical attributes of a key, including size, location, and rotation - -compatible: "zmk,key-physical-attrs" - -properties: - "#key-cells": - type: int - required: true - const: 7 - -key-cells: - - width - - height - - x - - y - - r - - rx - - ry diff --git a/app/dts/bindings/zmk,keymap.yaml b/app/dts/bindings/zmk,keymap.yaml index 4c675d21..56821ded 100644 --- a/app/dts/bindings/zmk,keymap.yaml +++ b/app/dts/bindings/zmk,keymap.yaml @@ -7,19 +7,12 @@ child-binding: description: "A layer to be used in a keymap" properties: - display-name: + label: type: string required: false - description: The name of this layer to show on displays bindings: type: phandle-array required: true sensor-bindings: type: phandle-array required: false - - label: - type: string - required: false - deprecated: true - description: Deprecated. Use "name" instead. diff --git a/app/dts/bindings/zmk,kscan-composite.yaml b/app/dts/bindings/zmk,kscan-composite.yaml index 2600eab7..6126c303 100644 --- a/app/dts/bindings/zmk,kscan-composite.yaml +++ b/app/dts/bindings/zmk,kscan-composite.yaml @@ -3,13 +3,9 @@ description: | compatible: "zmk,kscan-composite" -include: kscan.yaml - properties: label: type: string - required: false - deprecated: true rows: type: int columns: @@ -21,18 +17,11 @@ child-binding: properties: label: type: string - required: false - deprecated: true kscan: type: phandle row-offset: type: int default: 0 - col-offset: - type: int - default: 0 - column-offset: type: int default: 0 - deprecated: true diff --git a/app/dts/bindings/zmk,kscan-mock.yaml b/app/dts/bindings/zmk,kscan-mock.yaml index 2fe9360c..f9d83fa7 100644 --- a/app/dts/bindings/zmk,kscan-mock.yaml +++ b/app/dts/bindings/zmk,kscan-mock.yaml @@ -6,8 +6,6 @@ compatible: "zmk,kscan-mock" properties: label: type: string - required: false - deprecated: true event-period: type: int description: Milliseconds between each generated event diff --git a/app/dts/bindings/zmk,physical-layout-position-map.yaml b/app/dts/bindings/zmk,physical-layout-position-map.yaml deleted file mode 100644 index 8647404b..00000000 --- a/app/dts/bindings/zmk,physical-layout-position-map.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# -# SPDX-License-Identifier: MIT - -description: | - Describes how to correlate equivalent keys between layouts that don't have the exact same X,Y location. - -compatible: "zmk,physical-layout-position-map" - -properties: - complete: - type: boolean - description: If the mapping complete describes the key mapping, and no position based mapping should be used. - -child-binding: - properties: - physical-layout: - type: phandle - description: The physical layout that corresponds to this mapping entry. - positions: - type: array - description: Array of key positions that match the same array entry in the other sibling nodes. diff --git a/app/dts/bindings/zmk,physical-layout.yaml b/app/dts/bindings/zmk,physical-layout.yaml deleted file mode 100644 index 7ed4cdc3..00000000 --- a/app/dts/bindings/zmk,physical-layout.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# -# SPDX-License-Identifier: MIT - -description: | - Describe the physical layout of a keyboard, including deps like the transform and kscan - that are needed for that layout to work. - -compatible: "zmk,physical-layout" - -properties: - display-name: - type: string - required: true - description: The name of this layout to display in the UI - transform: - type: phandle - required: true - description: The matrix transform to use along with this layout. - kscan: - type: phandle - description: The kscan to use along with this layout. The `zmk,kscan` chosen will be used as a fallback if this property is omitted. - input: - type: phandle - description: The input device to use along with this layout. The `zmk,matrix-input` chosen will be used as a fallback if this property is omitted. - keys: - type: phandle-array - description: Array of key physical attributes. diff --git a/app/dts/bindings/zmk,soft-off-wakeup-sources.yaml b/app/dts/bindings/zmk,soft-off-wakeup-sources.yaml deleted file mode 100644 index 6b55d5d2..00000000 --- a/app/dts/bindings/zmk,soft-off-wakeup-sources.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Description of all possible wakeup-sources from a forced - soft-off state. - -compatible: "zmk,soft-off-wakeup-sources" - -properties: - wakeup-sources: - type: phandles - required: true - description: List of wakeup-sources that should be enabled to wake the system from forced soft-off state. diff --git a/app/dts/bindings/zmk,wired-split.yaml b/app/dts/bindings/zmk,wired-split.yaml deleted file mode 100644 index 311d367a..00000000 --- a/app/dts/bindings/zmk,wired-split.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Complete specification of wired split connection - -compatible: "zmk,wired-split" - -properties: - device: - type: phandle - required: true - description: The UART device for wired split communication - - detect-gpios: - type: phandle-array - description: | - If your split includes support for an extra GPIO to detect presence of the split cable, set - this to the GPIO pin used to detect the connection. - - half-duplex: - type: boolean - description: "Experimental: Enable half-duplex protocol mode" - - dir-gpios: - type: phandle-array - description: "Experimental: Set the communication direction. Used for RS-422 style comms." diff --git a/app/dts/common/arduino_uno_pro_micro_map.dtsi b/app/dts/common/arduino_uno_pro_micro_map.dtsi index 885661d4..a6b8d792 100644 --- a/app/dts/common/arduino_uno_pro_micro_map.dtsi +++ b/app/dts/common/arduino_uno_pro_micro_map.dtsi @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -/* This provides a mapping from Arduino Uno to Arduino Pro Micro pins for development */ +/* This provies a mapping from Arduino Uno to Arduino Pro Micro pins for development */ / { pro_micro_d: connector_d { diff --git a/app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi b/app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi deleted file mode 100644 index 9087426c..00000000 --- a/app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi +++ /dev/null @@ -1,29 +0,0 @@ - -&gpregret1 { - adafruit_boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; -}; - -/ { - chosen { - zephyr,boot-mode = &boot_retention; - zmk,magic-boot-mode = &adafruit_boot_retention; - }; - - magic_mapper { - compatible = "zmk,bootmode-to-magic-mapper"; - status = "okay"; - - #address-cells = <1>; - #size-cells = <1>; - - boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; -}; \ No newline at end of file diff --git a/app/dts/common/nordic/nrf52840_uf2_boot_mode.dtsi b/app/dts/common/nordic/nrf52840_uf2_boot_mode.dtsi deleted file mode 100644 index 9087426c..00000000 --- a/app/dts/common/nordic/nrf52840_uf2_boot_mode.dtsi +++ /dev/null @@ -1,29 +0,0 @@ - -&gpregret1 { - adafruit_boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; -}; - -/ { - chosen { - zephyr,boot-mode = &boot_retention; - zmk,magic-boot-mode = &adafruit_boot_retention; - }; - - magic_mapper { - compatible = "zmk,bootmode-to-magic-mapper"; - status = "okay"; - - #address-cells = <1>; - #size-cells = <1>; - - boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; -}; \ No newline at end of file diff --git a/app/dts/input/processors.dtsi b/app/dts/input/processors.dtsi deleted file mode 100644 index 17398bad..00000000 --- a/app/dts/input/processors.dtsi +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include \ No newline at end of file diff --git a/app/dts/input/processors/behaviors.dtsi b/app/dts/input/processors/behaviors.dtsi deleted file mode 100644 index a50f9384..00000000 --- a/app/dts/input/processors/behaviors.dtsi +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - zip_button_behaviors: zip_button_behaviors { - compatible = "zmk,input-processor-behaviors"; - #input-processor-cells = <0>; - codes = ; - bindings = <&none &none &none>; - }; -}; \ No newline at end of file diff --git a/app/dts/input/processors/code_mapper.dtsi b/app/dts/input/processors/code_mapper.dtsi deleted file mode 100644 index 6a9b5d16..00000000 --- a/app/dts/input/processors/code_mapper.dtsi +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - /omit-if-no-ref/ zip_xy_swap_mapper: zip_xy_swap_mapper { - compatible = "zmk,input-processor-code-mapper"; - #input-processor-cells = <0>; - type = ; - map - = - , - ; - }; - - /omit-if-no-ref/ zip_xy_to_scroll_mapper: zip_xy_to_scroll_mapper { - compatible = "zmk,input-processor-code-mapper"; - #input-processor-cells = <0>; - type = ; - map - = - , - ; - }; -}; \ No newline at end of file diff --git a/app/dts/input/processors/scaler.dtsi b/app/dts/input/processors/scaler.dtsi deleted file mode 100644 index 7d5e3b45..00000000 --- a/app/dts/input/processors/scaler.dtsi +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - - #include - -/ { - /omit-if-no-ref/ zip_x_scaler: zip_x_scaler { - compatible = "zmk,input-processor-scaler"; - #input-processor-cells = <2>; - type = ; - codes = ; - track-remainders; - }; - - /omit-if-no-ref/ zip_y_scaler: zip_y_scaler { - compatible = "zmk,input-processor-scaler"; - #input-processor-cells = <2>; - type = ; - codes = ; - track-remainders; - }; - - /omit-if-no-ref/ zip_xy_scaler: zip_xy_scaler { - compatible = "zmk,input-processor-scaler"; - #input-processor-cells = <2>; - type = ; - codes = ; - track-remainders; - }; - - /omit-if-no-ref/ zip_scroll_scaler: zip_scroll_scaler { - compatible = "zmk,input-processor-scaler"; - #input-processor-cells = <2>; - type = ; - codes = ; - track-remainders; - }; -}; diff --git a/app/dts/input/processors/temp_layer.dtsi b/app/dts/input/processors/temp_layer.dtsi deleted file mode 100644 index 228ad4be..00000000 --- a/app/dts/input/processors/temp_layer.dtsi +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - /omit-if-no-ref/ zip_temp_layer: zip_temp_layer { - compatible = "zmk,input-processor-temp-layer"; - #input-processor-cells = <2>; - }; -}; \ No newline at end of file diff --git a/app/dts/input/processors/transform.dtsi b/app/dts/input/processors/transform.dtsi deleted file mode 100644 index 541e47d3..00000000 --- a/app/dts/input/processors/transform.dtsi +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - /omit-if-no-ref/ zip_xy_transform: zip_xy_transform { - compatible = "zmk,input-processor-transform"; - #input-processor-cells = <1>; - type = ; - y-codes = ; - x-codes = ; - }; - - /omit-if-no-ref/ zip_scroll_transform: zip_scroll_transform { - compatible = "zmk,input-processor-transform"; - #input-processor-cells = <1>; - type = ; - y-codes = ; - x-codes = ; - }; -}; \ No newline at end of file diff --git a/app/dts/layouts/common/60percent/all1u.dtsi b/app/dts/layouts/common/60percent/all1u.dtsi deleted file mode 100644 index e99f75b5..00000000 --- a/app/dts/layouts/common/60percent/all1u.dtsi +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include - -/ { - layout_60_all1u: layout_60_all1u { - compatible = "zmk,physical-layout"; - display-name = "60% All 1U"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 150 100 1350 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 225 100 1275 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - , <&key_physical_attrs 100 100 1200 300 0 0 0> - , <&key_physical_attrs 100 100 1300 300 0 0 0> - , <&key_physical_attrs 100 100 1400 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 125 100 125 400 0 0 0> - , <&key_physical_attrs 125 100 250 400 0 0 0> - , <&key_physical_attrs 625 100 375 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1200 400 0 0 0> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - ; - }; -}; - -&layouts_common_60_percent_position_map { - layout_60_all1u_posmap: layout_60_all1u { - physical-layout = <&layout_60_all1u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14> - , <15 16 17 18 19 20 21 22 23 24 25 26 27 28> - , <29 30 31 32 33 34 35 36 37 38 39 40 41> - , <42 43 44 45 46 47 48 49 50 51 52 53 54 55 56> - , <57 58 59 60 61 62 64 63 65> - ; - }; -}; diff --git a/app/dts/layouts/common/60percent/ansi.dtsi b/app/dts/layouts/common/60percent/ansi.dtsi deleted file mode 100644 index 0d6c6b9e..00000000 --- a/app/dts/layouts/common/60percent/ansi.dtsi +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include - -/ { - layout_60_ansi: layout_60_ansi { - compatible = "zmk,physical-layout"; - display-name = "60% ANSI"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 200 100 1300 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 150 100 1350 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 225 100 1275 200 0 0 0> - , <&key_physical_attrs 225 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 625 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - , <&key_physical_attrs 100 100 1025 300 0 0 0> - , <&key_physical_attrs 100 100 1125 300 0 0 0> - , <&key_physical_attrs 275 100 1225 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 125 100 125 400 0 0 0> - , <&key_physical_attrs 125 100 250 400 0 0 0> - , <&key_physical_attrs 625 100 375 400 0 0 0> - , <&key_physical_attrs 125 100 1000 400 0 0 0> - , <&key_physical_attrs 125 100 1125 400 0 0 0> - , <&key_physical_attrs 125 100 1250 400 0 0 0> - , <&key_physical_attrs 125 100 1375 400 0 0 0> - ; - }; -}; - -&layouts_common_60_percent_position_map { - layout_60_ansi_posmap: layout_60_ansi { - physical-layout = <&layout_60_ansi>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 61> - , <14 15 16 17 18 19 20 21 22 23 24 25 26 27> - , <28 29 30 31 32 33 34 35 36 37 38 39 40> - , <41 62 42 43 44 45 46 47 48 49 50 51 52 63 64> - , <53 54 55 56 57 58 60 59 65> - ; - }; -}; diff --git a/app/dts/layouts/common/60percent/hhkb.dtsi b/app/dts/layouts/common/60percent/hhkb.dtsi deleted file mode 100644 index dcefbfc6..00000000 --- a/app/dts/layouts/common/60percent/hhkb.dtsi +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include - -/ { - layout_60_hhkb: layout_60_hhkb { - compatible = "zmk,physical-layout"; - display-name = "60% HHKB/Tsangan layout"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 200 100 1300 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 150 100 1350 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 225 100 1275 200 0 0 0> - , <&key_physical_attrs 225 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 625 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - , <&key_physical_attrs 100 100 1025 300 0 0 0> - , <&key_physical_attrs 100 100 1125 300 0 0 0> - , <&key_physical_attrs 275 100 1225 300 0 0 0> - , <&key_physical_attrs 150 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 150 400 0 0 0> - , <&key_physical_attrs 150 100 250 400 0 0 0> - , <&key_physical_attrs 700 100 400 400 0 0 0> - , <&key_physical_attrs 150 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1250 400 0 0 0> - , <&key_physical_attrs 150 100 1350 400 0 0 0> - ; - }; -}; - -&layouts_common_60_percent_position_map { - layout_60_hhkb_posmap: layout_60_hhkb { - physical-layout = <&layout_60_hhkb>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 60> - , <14 15 16 17 18 19 20 21 22 23 24 25 26 27> - , <28 29 30 31 32 33 34 35 36 37 38 39 40> - , <41 61 42 43 44 45 46 47 48 49 50 51 52 62 63> - , <53 54 55 56 57 58 59 64 65> - ; - }; -}; diff --git a/app/dts/layouts/common/60percent/iso.dtsi b/app/dts/layouts/common/60percent/iso.dtsi deleted file mode 100644 index 1f9ae26d..00000000 --- a/app/dts/layouts/common/60percent/iso.dtsi +++ /dev/null @@ -1,87 +0,0 @@ -#include -#include - -/ { - layout_60_iso: layout_60_iso { - compatible = "zmk,physical-layout"; - display-name = "60% ISO"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 200 100 1300 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 100 100 1275 200 0 0 0> - , <&key_physical_attrs 125 200 1375 100 0 0 0> - , <&key_physical_attrs 125 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 125 300 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 625 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - , <&key_physical_attrs 100 100 1025 300 0 0 0> - , <&key_physical_attrs 100 100 1125 300 0 0 0> - , <&key_physical_attrs 275 100 1225 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 125 100 125 400 0 0 0> - , <&key_physical_attrs 125 100 250 400 0 0 0> - , <&key_physical_attrs 625 100 375 400 0 0 0> - , <&key_physical_attrs 125 100 1000 400 0 0 0> - , <&key_physical_attrs 125 100 1125 400 0 0 0> - , <&key_physical_attrs 125 100 1250 400 0 0 0> - , <&key_physical_attrs 125 100 1375 400 0 0 0> - ; - }; -}; - -&layouts_common_60_percent_position_map { - layout_60_iso_posmap: layout_60_iso { - physical-layout = <&layout_60_iso>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 62> - , <14 15 16 17 18 19 20 21 22 23 24 25 26 63> - , <27 28 29 30 31 32 33 34 35 36 37 38 40> - , <41 42 43 44 45 46 47 48 49 50 51 52 53 64 65> - , <54 55 56 57 58 59 61 60 39> - ; - }; -}; diff --git a/app/dts/layouts/common/60percent/position_map.dtsi b/app/dts/layouts/common/60percent/position_map.dtsi deleted file mode 100644 index b8db2d01..00000000 --- a/app/dts/layouts/common/60percent/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_60_percent_position_map: layouts_common_60_percent_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/65percent/all1u.dtsi b/app/dts/layouts/common/65percent/all1u.dtsi deleted file mode 100644 index f5d3121d..00000000 --- a/app/dts/layouts/common/65percent/all1u.dtsi +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include - -/ { - layout_65_all1u: layout_65_all1u { - compatible = "zmk,physical-layout"; - display-name = "65% All 1U"; - - kscan = <&kscan0>; - transform = <&matrix_transform_65_all1u>; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 150 100 1350 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 225 100 1275 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - , <&key_physical_attrs 100 100 1200 300 0 0 0> - , <&key_physical_attrs 100 100 1300 300 0 0 0> - , <&key_physical_attrs 100 100 1400 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 125 100 125 400 0 0 0> - , <&key_physical_attrs 125 100 250 400 0 0 0> - , <&key_physical_attrs 625 100 375 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1200 400 0 0 0> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - ; - }; -}; - -&layouts_common_65_percent_position_map { - layout_65_all1u_posmap: layout_65_all1u { - physical-layout = <&layout_65_all1u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15> - , <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30> - , <31 32 33 34 35 36 37 38 39 40 41 42 43 44> - , <45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60> - , <61 62 63 64 65 66 67 68 69 70> - ; - }; -}; diff --git a/app/dts/layouts/common/65percent/ansi.dtsi b/app/dts/layouts/common/65percent/ansi.dtsi deleted file mode 100644 index d6938ce8..00000000 --- a/app/dts/layouts/common/65percent/ansi.dtsi +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include - -/ { - layout_65_ansi: layout_65_ansi { - compatible = "zmk,physical-layout"; - display-name = "65% ANSI"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 200 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 150 100 1350 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 225 100 1275 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 225 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 625 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - , <&key_physical_attrs 100 100 1025 300 0 0 0> - , <&key_physical_attrs 100 100 1125 300 0 0 0> - , <&key_physical_attrs 175 100 1225 300 0 0 0> - , <&key_physical_attrs 100 100 1400 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 125 100 125 400 0 0 0> - , <&key_physical_attrs 125 100 250 400 0 0 0> - , <&key_physical_attrs 625 100 375 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1200 400 0 0 0> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - ; - }; -}; - -&layouts_common_65_percent_position_map { - layout_65_ansi_posmap: layout_65_ansi { - physical-layout = <&layout_65_ansi>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 68 14> - , <15 16 17 18 19 20 21 22 23 24 25 26 27 28 29> - , <30 31 32 33 34 35 36 37 38 39 40 41 42 43> - , <44 69 45 46 47 48 49 50 51 52 53 54 55 70 56 57> - , <58 59 60 61 62 63 64 65 66 67> - ; - }; -}; diff --git a/app/dts/layouts/common/65percent/hhkb.dtsi b/app/dts/layouts/common/65percent/hhkb.dtsi deleted file mode 100644 index a20fb6dc..00000000 --- a/app/dts/layouts/common/65percent/hhkb.dtsi +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include - -/ { - layout_65_hhkb: layout_65_hhkb { - compatible = "zmk,physical-layout"; - display-name = "65% HHKB/Tsangan"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 200 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 150 100 1350 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 225 100 1275 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 225 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 625 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - , <&key_physical_attrs 100 100 1025 300 0 0 0> - , <&key_physical_attrs 100 100 1125 300 0 0 0> - , <&key_physical_attrs 275 100 1225 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 150 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 150 400 0 0 0> - , <&key_physical_attrs 150 100 250 400 0 0 0> - , <&key_physical_attrs 700 100 400 400 0 0 0> - , <&key_physical_attrs 150 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1250 400 0 0 0> - , <&key_physical_attrs 150 100 1350 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - ; - }; -}; - -&layouts_common_65_percent_position_map { - layout_65_hhkb_posmap: layout_65_hhkb { - physical-layout = <&layout_65_hhkb>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 65 14> - , <15 16 17 18 19 20 21 22 23 24 25 26 27 28 29> - , <30 31 32 33 34 35 36 37 38 39 40 41 42 43> - , <44 66 45 46 47 48 49 50 51 52 53 54 55 67 68 56> - , <57 58 59 60 61 62 63 69 70 64> - ; - }; -}; diff --git a/app/dts/layouts/common/65percent/iso.dtsi b/app/dts/layouts/common/65percent/iso.dtsi deleted file mode 100644 index 9117b70f..00000000 --- a/app/dts/layouts/common/65percent/iso.dtsi +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include - -/ { - layout_65_iso: layout_65_iso { - compatible = "zmk,physical-layout"; - display-name = "65% ISO"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 200 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 150 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 150 100 0 0 0> - , <&key_physical_attrs 100 100 250 100 0 0 0> - , <&key_physical_attrs 100 100 350 100 0 0 0> - , <&key_physical_attrs 100 100 450 100 0 0 0> - , <&key_physical_attrs 100 100 550 100 0 0 0> - , <&key_physical_attrs 100 100 650 100 0 0 0> - , <&key_physical_attrs 100 100 750 100 0 0 0> - , <&key_physical_attrs 100 100 850 100 0 0 0> - , <&key_physical_attrs 100 100 950 100 0 0 0> - , <&key_physical_attrs 100 100 1050 100 0 0 0> - , <&key_physical_attrs 100 100 1150 100 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 175 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 175 200 0 0 0> - , <&key_physical_attrs 100 100 275 200 0 0 0> - , <&key_physical_attrs 100 100 375 200 0 0 0> - , <&key_physical_attrs 100 100 475 200 0 0 0> - , <&key_physical_attrs 100 100 575 200 0 0 0> - , <&key_physical_attrs 100 100 675 200 0 0 0> - , <&key_physical_attrs 100 100 775 200 0 0 0> - , <&key_physical_attrs 100 100 875 200 0 0 0> - , <&key_physical_attrs 100 100 975 200 0 0 0> - , <&key_physical_attrs 100 100 1075 200 0 0 0> - , <&key_physical_attrs 100 100 1175 200 0 0 0> - , <&key_physical_attrs 100 100 1275 200 0 0 0> - , <&key_physical_attrs 125 200 1375 100 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 125 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 125 300 0 0 0> - , <&key_physical_attrs 100 100 225 300 0 0 0> - , <&key_physical_attrs 100 100 325 300 0 0 0> - , <&key_physical_attrs 100 100 425 300 0 0 0> - , <&key_physical_attrs 100 100 525 300 0 0 0> - , <&key_physical_attrs 100 100 625 300 0 0 0> - , <&key_physical_attrs 100 100 725 300 0 0 0> - , <&key_physical_attrs 100 100 825 300 0 0 0> - , <&key_physical_attrs 100 100 925 300 0 0 0> - , <&key_physical_attrs 100 100 1025 300 0 0 0> - , <&key_physical_attrs 100 100 1125 300 0 0 0> - , <&key_physical_attrs 175 100 1225 300 0 0 0> - , <&key_physical_attrs 100 100 1400 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 125 100 125 400 0 0 0> - , <&key_physical_attrs 125 100 250 400 0 0 0> - , <&key_physical_attrs 625 100 375 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1200 400 0 0 0> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - ; - }; -}; - -&layouts_common_65_percent_position_map { - layout_65_iso_posmap: layout_65_iso { - physical-layout = <&layout_65_iso>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 69 14> - , <15 16 17 18 19 20 21 22 23 24 25 26 27 70 28> - , <29 30 31 32 33 34 35 36 37 38 39 40 42 43> - , <44 45 46 47 48 49 50 51 52 53 54 55 56 41 57 58> - , <59 60 61 62 63 64 65 66 67 68> - ; - }; -}; diff --git a/app/dts/layouts/common/65percent/position_map.dtsi b/app/dts/layouts/common/65percent/position_map.dtsi deleted file mode 100644 index b761b858..00000000 --- a/app/dts/layouts/common/65percent/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_65_percent_position_map: layouts_common_65_percent_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/75percent/all1u.dtsi b/app/dts/layouts/common/75percent/all1u.dtsi deleted file mode 100644 index 702de021..00000000 --- a/app/dts/layouts/common/75percent/all1u.dtsi +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include - -/ { - layout_75_all1u: layout_75_all1u { - compatible = "zmk,physical-layout"; - display-name = "75% All 1U"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 100 100 1300 100 0 0 0> - , <&key_physical_attrs 100 100 1400 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 150 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 150 200 0 0 0> - , <&key_physical_attrs 100 100 250 200 0 0 0> - , <&key_physical_attrs 100 100 350 200 0 0 0> - , <&key_physical_attrs 100 100 450 200 0 0 0> - , <&key_physical_attrs 100 100 550 200 0 0 0> - , <&key_physical_attrs 100 100 650 200 0 0 0> - , <&key_physical_attrs 100 100 750 200 0 0 0> - , <&key_physical_attrs 100 100 850 200 0 0 0> - , <&key_physical_attrs 100 100 950 200 0 0 0> - , <&key_physical_attrs 100 100 1050 200 0 0 0> - , <&key_physical_attrs 100 100 1150 200 0 0 0> - , <&key_physical_attrs 100 100 1250 200 0 0 0> - , <&key_physical_attrs 150 100 1350 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 175 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 175 300 0 0 0> - , <&key_physical_attrs 100 100 275 300 0 0 0> - , <&key_physical_attrs 100 100 375 300 0 0 0> - , <&key_physical_attrs 100 100 475 300 0 0 0> - , <&key_physical_attrs 100 100 575 300 0 0 0> - , <&key_physical_attrs 100 100 675 300 0 0 0> - , <&key_physical_attrs 100 100 775 300 0 0 0> - , <&key_physical_attrs 100 100 875 300 0 0 0> - , <&key_physical_attrs 100 100 975 300 0 0 0> - , <&key_physical_attrs 100 100 1075 300 0 0 0> - , <&key_physical_attrs 100 100 1175 300 0 0 0> - , <&key_physical_attrs 225 100 1275 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 400 400 0 0 0> - , <&key_physical_attrs 100 100 500 400 0 0 0> - , <&key_physical_attrs 100 100 600 400 0 0 0> - , <&key_physical_attrs 100 100 700 400 0 0 0> - , <&key_physical_attrs 100 100 800 400 0 0 0> - , <&key_physical_attrs 100 100 900 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - , <&key_physical_attrs 100 100 1200 400 0 0 0> - , <&key_physical_attrs 100 100 1300 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - , <&key_physical_attrs 125 100 0 500 0 0 0> - , <&key_physical_attrs 125 100 125 500 0 0 0> - , <&key_physical_attrs 125 100 250 500 0 0 0> - , <&key_physical_attrs 625 100 375 500 0 0 0> - , <&key_physical_attrs 100 100 1000 500 0 0 0> - , <&key_physical_attrs 100 100 1100 500 0 0 0> - , <&key_physical_attrs 100 100 1200 500 0 0 0> - , <&key_physical_attrs 100 100 1300 500 0 0 0> - , <&key_physical_attrs 100 100 1400 500 0 0 0> - , <&key_physical_attrs 100 100 1500 500 0 0 0> - ; - }; -}; - -&layouts_common_75_percent_position_map { - layout_75_all1u_posmap: layout_75_all1u { - physical-layout = <&layout_75_all1u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15> - , <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31> - , <32 33 34 35 36 37 38 39 40 41 42 43 44 45 46> - , <47 48 49 50 51 52 53 54 55 56 57 58 59 60> - , <61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76> - , <77 78 79 80 81 82 83 84 85 86> - ; - }; -}; diff --git a/app/dts/layouts/common/75percent/ansi.dtsi b/app/dts/layouts/common/75percent/ansi.dtsi deleted file mode 100644 index 0395bd69..00000000 --- a/app/dts/layouts/common/75percent/ansi.dtsi +++ /dev/null @@ -1,110 +0,0 @@ -#include -#include - -/ { - layout_75_ansi: layout_75_ansi { - compatible = "zmk,physical-layout"; - display-name = "75% ANSI"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 200 100 1300 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 150 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 150 200 0 0 0> - , <&key_physical_attrs 100 100 250 200 0 0 0> - , <&key_physical_attrs 100 100 350 200 0 0 0> - , <&key_physical_attrs 100 100 450 200 0 0 0> - , <&key_physical_attrs 100 100 550 200 0 0 0> - , <&key_physical_attrs 100 100 650 200 0 0 0> - , <&key_physical_attrs 100 100 750 200 0 0 0> - , <&key_physical_attrs 100 100 850 200 0 0 0> - , <&key_physical_attrs 100 100 950 200 0 0 0> - , <&key_physical_attrs 100 100 1050 200 0 0 0> - , <&key_physical_attrs 100 100 1150 200 0 0 0> - , <&key_physical_attrs 100 100 1250 200 0 0 0> - , <&key_physical_attrs 150 100 1350 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 175 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 175 300 0 0 0> - , <&key_physical_attrs 100 100 275 300 0 0 0> - , <&key_physical_attrs 100 100 375 300 0 0 0> - , <&key_physical_attrs 100 100 475 300 0 0 0> - , <&key_physical_attrs 100 100 575 300 0 0 0> - , <&key_physical_attrs 100 100 675 300 0 0 0> - , <&key_physical_attrs 100 100 775 300 0 0 0> - , <&key_physical_attrs 100 100 875 300 0 0 0> - , <&key_physical_attrs 100 100 975 300 0 0 0> - , <&key_physical_attrs 100 100 1075 300 0 0 0> - , <&key_physical_attrs 100 100 1175 300 0 0 0> - , <&key_physical_attrs 225 100 1275 300 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 225 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 225 400 0 0 0> - , <&key_physical_attrs 100 100 325 400 0 0 0> - , <&key_physical_attrs 100 100 425 400 0 0 0> - , <&key_physical_attrs 100 100 525 400 0 0 0> - , <&key_physical_attrs 100 100 625 400 0 0 0> - , <&key_physical_attrs 100 100 725 400 0 0 0> - , <&key_physical_attrs 100 100 825 400 0 0 0> - , <&key_physical_attrs 100 100 925 400 0 0 0> - , <&key_physical_attrs 100 100 1025 400 0 0 0> - , <&key_physical_attrs 100 100 1125 400 0 0 0> - , <&key_physical_attrs 175 100 1225 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - , <&key_physical_attrs 125 100 0 500 0 0 0> - , <&key_physical_attrs 125 100 125 500 0 0 0> - , <&key_physical_attrs 125 100 250 500 0 0 0> - , <&key_physical_attrs 625 100 375 500 0 0 0> - , <&key_physical_attrs 100 100 1000 500 0 0 0> - , <&key_physical_attrs 100 100 1100 500 0 0 0> - , <&key_physical_attrs 100 100 1200 500 0 0 0> - , <&key_physical_attrs 100 100 1300 500 0 0 0> - , <&key_physical_attrs 100 100 1400 500 0 0 0> - , <&key_physical_attrs 100 100 1500 500 0 0 0> - ; - }; -}; - -&layouts_common_75_percent_position_map { - layout_75_ansi_posmap: layout_75_ansi { - physical-layout = <&layout_75_ansi>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15> - , <16 17 18 19 20 21 22 23 24 25 26 27 28 29 84 30> - , <31 32 33 34 35 36 37 38 39 40 41 42 43 44 45> - , <46 47 48 49 50 51 52 53 54 55 56 57 58 59> - , <60 85 61 62 63 64 65 66 67 68 69 70 71 86 72 73> - , <74 75 76 77 78 79 80 81 82 83> - ; - }; -}; diff --git a/app/dts/layouts/common/75percent/iso.dtsi b/app/dts/layouts/common/75percent/iso.dtsi deleted file mode 100644 index 7002b89c..00000000 --- a/app/dts/layouts/common/75percent/iso.dtsi +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include - -/ { - layout_75_iso: layout_75_iso { - compatible = "zmk,physical-layout"; - display-name = "75% ISO"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1500 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 200 100 1300 100 0 0 0> - , <&key_physical_attrs 100 100 1500 100 0 0 0> - , <&key_physical_attrs 150 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 150 200 0 0 0> - , <&key_physical_attrs 100 100 250 200 0 0 0> - , <&key_physical_attrs 100 100 350 200 0 0 0> - , <&key_physical_attrs 100 100 450 200 0 0 0> - , <&key_physical_attrs 100 100 550 200 0 0 0> - , <&key_physical_attrs 100 100 650 200 0 0 0> - , <&key_physical_attrs 100 100 750 200 0 0 0> - , <&key_physical_attrs 100 100 850 200 0 0 0> - , <&key_physical_attrs 100 100 950 200 0 0 0> - , <&key_physical_attrs 100 100 1050 200 0 0 0> - , <&key_physical_attrs 100 100 1150 200 0 0 0> - , <&key_physical_attrs 100 100 1250 200 0 0 0> - , <&key_physical_attrs 100 100 1500 200 0 0 0> - , <&key_physical_attrs 175 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 175 300 0 0 0> - , <&key_physical_attrs 100 100 275 300 0 0 0> - , <&key_physical_attrs 100 100 375 300 0 0 0> - , <&key_physical_attrs 100 100 475 300 0 0 0> - , <&key_physical_attrs 100 100 575 300 0 0 0> - , <&key_physical_attrs 100 100 675 300 0 0 0> - , <&key_physical_attrs 100 100 775 300 0 0 0> - , <&key_physical_attrs 100 100 875 300 0 0 0> - , <&key_physical_attrs 100 100 975 300 0 0 0> - , <&key_physical_attrs 100 100 1075 300 0 0 0> - , <&key_physical_attrs 100 100 1175 300 0 0 0> - , <&key_physical_attrs 100 100 1275 300 0 0 0> - , <&key_physical_attrs 125 200 1375 200 0 0 0> - , <&key_physical_attrs 100 100 1500 300 0 0 0> - , <&key_physical_attrs 125 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 125 400 0 0 0> - , <&key_physical_attrs 100 100 225 400 0 0 0> - , <&key_physical_attrs 100 100 325 400 0 0 0> - , <&key_physical_attrs 100 100 425 400 0 0 0> - , <&key_physical_attrs 100 100 525 400 0 0 0> - , <&key_physical_attrs 100 100 625 400 0 0 0> - , <&key_physical_attrs 100 100 725 400 0 0 0> - , <&key_physical_attrs 100 100 825 400 0 0 0> - , <&key_physical_attrs 100 100 925 400 0 0 0> - , <&key_physical_attrs 100 100 1025 400 0 0 0> - , <&key_physical_attrs 100 100 1125 400 0 0 0> - , <&key_physical_attrs 175 100 1225 400 0 0 0> - , <&key_physical_attrs 100 100 1400 400 0 0 0> - , <&key_physical_attrs 100 100 1500 400 0 0 0> - , <&key_physical_attrs 125 100 0 500 0 0 0> - , <&key_physical_attrs 125 100 125 500 0 0 0> - , <&key_physical_attrs 125 100 250 500 0 0 0> - , <&key_physical_attrs 625 100 375 500 0 0 0> - , <&key_physical_attrs 100 100 1000 500 0 0 0> - , <&key_physical_attrs 100 100 1100 500 0 0 0> - , <&key_physical_attrs 100 100 1200 500 0 0 0> - , <&key_physical_attrs 100 100 1300 500 0 0 0> - , <&key_physical_attrs 100 100 1400 500 0 0 0> - , <&key_physical_attrs 100 100 1500 500 0 0 0> - ; - }; -}; - -&layouts_common_75_percent_position_map { - layout_75_iso_posmap: layout_75_iso { - physical-layout = <&layout_75_iso>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15> - , <16 17 18 19 20 21 22 23 24 25 26 27 28 29 85 30> - , <31 32 33 34 35 36 37 38 39 40 41 42 43 86 44> - , <45 46 47 48 49 50 51 52 53 54 55 56 58 59> - , <60 61 62 63 64 65 66 67 68 69 70 71 72 57 73 74> - , <75 76 77 78 79 80 81 82 83 84> - ; - }; -}; diff --git a/app/dts/layouts/common/75percent/position_map.dtsi b/app/dts/layouts/common/75percent/position_map.dtsi deleted file mode 100644 index d5f9cdbb..00000000 --- a/app/dts/layouts/common/75percent/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_75_percent_position_map: layouts_common_75_percent_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/numpad/17_key.dtsi b/app/dts/layouts/common/numpad/17_key.dtsi deleted file mode 100644 index 2645803c..00000000 --- a/app/dts/layouts/common/numpad/17_key.dtsi +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -/ { - layout_numpad_17_key: layout_numpad_17_key { - compatible = "zmk,physical-layout"; - display-name = "17 Key Numpad"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 200 300 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 200 300 300 0 0 0> - , <&key_physical_attrs 200 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_17_key { - physical-layout = <&layout_numpad_17_key>; - positions - = <17 18 19 20> - , < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 21> - , <11 12 13 14> - , <15 22 16 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/18_key.dtsi b/app/dts/layouts/common/numpad/18_key.dtsi deleted file mode 100644 index 82493a38..00000000 --- a/app/dts/layouts/common/numpad/18_key.dtsi +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include - -/ { - layout_numpad_18_key: layout_numpad_18_key { - compatible = "zmk,physical-layout"; - display-name = "18 Key Numpad"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 200 300 300 0 0 0> - , <&key_physical_attrs 200 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_18_key { - physical-layout = <&layout_numpad_18_key>; - positions - = <18 19 20 21> - , < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 22 17 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/18_key_00.dtsi b/app/dts/layouts/common/numpad/18_key_00.dtsi deleted file mode 100644 index e363bf5f..00000000 --- a/app/dts/layouts/common/numpad/18_key_00.dtsi +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include - -/ { - layout_numpad_18_key_00: layout_numpad_18_key_00 { - compatible = "zmk,physical-layout"; - display-name = "18 Key Numpad (00)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 200 300 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 200 300 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_18_key_00 { - physical-layout = <&layout_numpad_18_key_00>; - positions - = <18 19 20 21> - , < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 22> - , <11 12 13 14> - , <15 16 17 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/19_key_00.dtsi b/app/dts/layouts/common/numpad/19_key_00.dtsi deleted file mode 100644 index 89f4d1a1..00000000 --- a/app/dts/layouts/common/numpad/19_key_00.dtsi +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include - -/ { - layout_numpad_19_key_00: layout_numpad_19_key_00 { - compatible = "zmk,physical-layout"; - display-name = "19 Key Numpad (00)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 200 300 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_19_key_00 { - physical-layout = <&layout_numpad_19_key_00>; - positions - = <19 20 21 22> - , < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/20_key.dtsi b/app/dts/layouts/common/numpad/20_key.dtsi deleted file mode 100644 index ec908524..00000000 --- a/app/dts/layouts/common/numpad/20_key.dtsi +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include - -/ { - layout_numpad_20_key: layout_numpad_20_key { - compatible = "zmk,physical-layout"; - display-name = "20 Key Numpad"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_20_key { - physical-layout = <&layout_numpad_20_key>; - positions - = <20 21 22 23> - , < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 19> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/21_key.dtsi b/app/dts/layouts/common/numpad/21_key.dtsi deleted file mode 100644 index b4ab99cb..00000000 --- a/app/dts/layouts/common/numpad/21_key.dtsi +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include - -/ { - layout_numpad_21_key: layout_numpad_21_key { - compatible = "zmk,physical-layout"; - display-name = "21 Key Numpad"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 125 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 0 225 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 200 300 225 0 0 0> - , <&key_physical_attrs 100 100 0 325 0 0 0> - , <&key_physical_attrs 100 100 100 325 0 0 0> - , <&key_physical_attrs 100 100 200 325 0 0 0> - , <&key_physical_attrs 100 100 0 425 0 0 0> - , <&key_physical_attrs 100 100 100 425 0 0 0> - , <&key_physical_attrs 100 100 200 425 0 0 0> - , <&key_physical_attrs 100 200 300 425 0 0 0> - , <&key_physical_attrs 200 100 0 525 0 0 0> - , <&key_physical_attrs 100 100 200 525 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_21_key { - physical-layout = <&layout_numpad_21_key>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 21> - , <15 16 17 18> - , <19 22 20 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/22_key.dtsi b/app/dts/layouts/common/numpad/22_key.dtsi deleted file mode 100644 index 29bd5ac8..00000000 --- a/app/dts/layouts/common/numpad/22_key.dtsi +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include - -/ { - layout_numpad_22_key: layout_numpad_22_key { - compatible = "zmk,physical-layout"; - display-name = "22 Key Numpad"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 125 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 0 225 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 0 325 0 0 0> - , <&key_physical_attrs 100 100 100 325 0 0 0> - , <&key_physical_attrs 100 100 200 325 0 0 0> - , <&key_physical_attrs 100 100 300 325 0 0 0> - , <&key_physical_attrs 100 100 0 425 0 0 0> - , <&key_physical_attrs 100 100 100 425 0 0 0> - , <&key_physical_attrs 100 100 200 425 0 0 0> - , <&key_physical_attrs 100 200 300 425 0 0 0> - , <&key_physical_attrs 200 100 0 525 0 0 0> - , <&key_physical_attrs 100 100 200 525 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_22_key { - physical-layout = <&layout_numpad_22_key>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 19> - , <20 22 21 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/22_key_00.dtsi b/app/dts/layouts/common/numpad/22_key_00.dtsi deleted file mode 100644 index 28666d14..00000000 --- a/app/dts/layouts/common/numpad/22_key_00.dtsi +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include - -/ { - layout_numpad_22_key_00: layout_numpad_22_key_00 { - compatible = "zmk,physical-layout"; - display-name = "22 Key Numpad (00)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 125 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 0 225 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 200 300 225 0 0 0> - , <&key_physical_attrs 100 100 0 325 0 0 0> - , <&key_physical_attrs 100 100 100 325 0 0 0> - , <&key_physical_attrs 100 100 200 325 0 0 0> - , <&key_physical_attrs 100 100 0 425 0 0 0> - , <&key_physical_attrs 100 100 100 425 0 0 0> - , <&key_physical_attrs 100 100 200 425 0 0 0> - , <&key_physical_attrs 100 200 300 425 0 0 0> - , <&key_physical_attrs 100 100 0 525 0 0 0> - , <&key_physical_attrs 100 100 100 525 0 0 0> - , <&key_physical_attrs 100 100 200 525 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_22_key_00 { - physical-layout = <&layout_numpad_22_key_00>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 22> - , <15 16 17 18> - , <19 20 21 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/23_key_00.dtsi b/app/dts/layouts/common/numpad/23_key_00.dtsi deleted file mode 100644 index b27da92b..00000000 --- a/app/dts/layouts/common/numpad/23_key_00.dtsi +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include - -/ { - layout_numpad_23_key_00: layout_numpad_23_key_00 { - compatible = "zmk,physical-layout"; - display-name = "23 Key Numpad (00)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 125 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 0 225 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 0 325 0 0 0> - , <&key_physical_attrs 100 100 100 325 0 0 0> - , <&key_physical_attrs 100 100 200 325 0 0 0> - , <&key_physical_attrs 100 100 300 325 0 0 0> - , <&key_physical_attrs 100 100 0 425 0 0 0> - , <&key_physical_attrs 100 100 100 425 0 0 0> - , <&key_physical_attrs 100 100 200 425 0 0 0> - , <&key_physical_attrs 100 200 300 425 0 0 0> - , <&key_physical_attrs 100 100 0 525 0 0 0> - , <&key_physical_attrs 100 100 100 525 0 0 0> - , <&key_physical_attrs 100 100 200 525 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_23_key_00 { - physical-layout = <&layout_numpad_23_key_00>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 19> - , <20 21 22 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/24_key.dtsi b/app/dts/layouts/common/numpad/24_key.dtsi deleted file mode 100644 index c410a532..00000000 --- a/app/dts/layouts/common/numpad/24_key.dtsi +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include - -/ { - layout_numpad_24_key: layout_numpad_24_key { - compatible = "zmk,physical-layout"; - display-name = "24 Key Numpad"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 0 125 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 0 225 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 0 325 0 0 0> - , <&key_physical_attrs 100 100 100 325 0 0 0> - , <&key_physical_attrs 100 100 200 325 0 0 0> - , <&key_physical_attrs 100 100 300 325 0 0 0> - , <&key_physical_attrs 100 100 0 425 0 0 0> - , <&key_physical_attrs 100 100 100 425 0 0 0> - , <&key_physical_attrs 100 100 200 425 0 0 0> - , <&key_physical_attrs 100 100 300 425 0 0 0> - , <&key_physical_attrs 100 100 0 525 0 0 0> - , <&key_physical_attrs 100 100 100 525 0 0 0> - , <&key_physical_attrs 100 100 200 525 0 0 0> - , <&key_physical_attrs 100 100 300 525 0 0 0> - ; - }; -}; - -&layouts_common_numpad_position_map { - layout_numpad_24_key { - physical-layout = <&layout_numpad_24_key>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 19> - , <20 21 22 23> - ; - }; -}; diff --git a/app/dts/layouts/common/numpad/position_map.dtsi b/app/dts/layouts/common/numpad/position_map.dtsi deleted file mode 100644 index 541cc518..00000000 --- a/app/dts/layouts/common/numpad/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_numpad_position_map: layouts_common_numpad_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/ortho_4x10/1x2u.dtsi b/app/dts/layouts/common/ortho_4x10/1x2u.dtsi deleted file mode 100644 index 6ffead4f..00000000 --- a/app/dts/layouts/common/ortho_4x10/1x2u.dtsi +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include - -/ { - layout_ortho_4x10_1x2u: layout_ortho_4x10_1x2u { - compatible = "zmk,physical-layout"; - display-name = "1x2U Space"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 200 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - ; - }; -}; - -&layouts_common_ortho_4x10_position_map { - layout_ortho_4x10_1x2u_posmap: layout_ortho_4x10_1x2u { - physical-layout = <&layout_ortho_4x10_1x2u>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28 29> - , <30 31 32 33 34 39 35 36 37 38> - ; - }; -}; - diff --git a/app/dts/layouts/common/ortho_4x10/all1u.dtsi b/app/dts/layouts/common/ortho_4x10/all1u.dtsi deleted file mode 100644 index d3c13f78..00000000 --- a/app/dts/layouts/common/ortho_4x10/all1u.dtsi +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include - -/ { - layout_ortho_4x10_all1u: layout_ortho_4x10_all1u { - compatible = "zmk,physical-layout"; - display-name = "All 1U/Grid"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - ; - }; -}; - -&layouts_common_ortho_4x10_position_map { - layout_ortho_4x10_all1u_posmap: layout_ortho_4x10_all1u { - physical-layout = <&layout_ortho_4x10_all1u>; - positions - = < 0 1 2 3 4 5 6 7 8 9> - , <10 11 12 13 14 15 16 17 18 19> - , <20 21 22 23 24 25 26 27 28 29> - , <30 31 32 33 34 35 36 37 38 39> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_4x10/position_map.dtsi b/app/dts/layouts/common/ortho_4x10/position_map.dtsi deleted file mode 100644 index 51bc87a0..00000000 --- a/app/dts/layouts/common/ortho_4x10/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_ortho_4x10_position_map: layouts_common_ortho_4x10_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/ortho_4x12/1x2u.dtsi b/app/dts/layouts/common/ortho_4x12/1x2u.dtsi deleted file mode 100644 index 451743ff..00000000 --- a/app/dts/layouts/common/ortho_4x12/1x2u.dtsi +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include - -/ { - layout_ortho_4x12_1x2u: layout_ortho_4x12_1x2u { - compatible = "zmk,physical-layout"; - display-name = "40% 1x2U Space"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 200 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - ; - }; -}; - -&layouts_common_ortho_4x12_position_map { - layout_ortho_4x12_1x2u_posmap: layout_ortho_4x12_1x2u { - physical-layout = <&layout_ortho_4x12_1x2u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , <36 37 38 39 40 41 47 42 43 44 45 46> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_4x12/2x2u.dtsi b/app/dts/layouts/common/ortho_4x12/2x2u.dtsi deleted file mode 100644 index 69afe35f..00000000 --- a/app/dts/layouts/common/ortho_4x12/2x2u.dtsi +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include - -/ { - layout_ortho_4x12_2x2u: layout_ortho_4x12_2x2u { - compatible = "zmk,physical-layout"; - display-name = "40% 2x2U Space"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 200 100 400 300 0 0 0> - , <&key_physical_attrs 200 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - ; - }; -}; - -&layouts_common_ortho_4x12_position_map { - layout_ortho_4x12_2x2u_posmap: layout_ortho_4x12_2x2u { - physical-layout = <&layout_ortho_4x12_2x2u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , <36 37 38 39 40 46 47 41 42 43 44 45> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_4x12/all1u.dtsi b/app/dts/layouts/common/ortho_4x12/all1u.dtsi deleted file mode 100644 index 00e4bded..00000000 --- a/app/dts/layouts/common/ortho_4x12/all1u.dtsi +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include - -/ { - layout_ortho_4x12_all1u: layout_ortho_4x12_all1u { - compatible = "zmk,physical-layout"; - display-name = "40% All 1U/Grid"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - ; - }; -}; - -&layouts_common_ortho_4x12_position_map { - layout_ortho_4x12_all1u_posmap: layout_ortho_4x12_all1u { - physical-layout = <&layout_ortho_4x12_all1u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , <36 37 38 39 40 41 42 43 44 45 46 47> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_4x12/position_map.dtsi b/app/dts/layouts/common/ortho_4x12/position_map.dtsi deleted file mode 100644 index c93a32bd..00000000 --- a/app/dts/layouts/common/ortho_4x12/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_ortho_4x12_position_map: layouts_common_ortho_4x12_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/ortho_5x12/1x2u.dtsi b/app/dts/layouts/common/ortho_5x12/1x2u.dtsi deleted file mode 100644 index bbe101ba..00000000 --- a/app/dts/layouts/common/ortho_5x12/1x2u.dtsi +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include - -/ { - layout_ortho_5x12_1x2u: layout_ortho_5x12_1x2u { - compatible = "zmk,physical-layout"; - display-name = "50% 1x2U Space"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 400 400 0 0 0> - , <&key_physical_attrs 200 100 500 400 0 0 0> - , <&key_physical_attrs 100 100 700 400 0 0 0> - , <&key_physical_attrs 100 100 800 400 0 0 0> - , <&key_physical_attrs 100 100 900 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - ; - }; -}; - -&layouts_common_ortho_5x12_position_map { - layout_ortho_5x12_1x2u_posmap: layout_ortho_5x12_1x2u { - physical-layout = <&layout_ortho_5x12_1x2u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , <36 37 38 39 40 41 42 43 44 45 46 47> - , <48 49 50 51 52 53 59 54 55 56 57 58> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_5x12/2x2u.dtsi b/app/dts/layouts/common/ortho_5x12/2x2u.dtsi deleted file mode 100644 index c2f7efb7..00000000 --- a/app/dts/layouts/common/ortho_5x12/2x2u.dtsi +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include - -/ { - layout_ortho_5x12_2x2u: layout_ortho_5x12_2x2u { - compatible = "zmk,physical-layout"; - display-name = "50% 2x2U Space"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 200 100 400 400 0 0 0> - , <&key_physical_attrs 200 100 600 400 0 0 0> - , <&key_physical_attrs 100 100 800 400 0 0 0> - , <&key_physical_attrs 100 100 900 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - ; - }; -}; - -&layouts_common_ortho_5x12_position_map { - layout_ortho_5x12_2x2u_posmap: layout_ortho_5x12_2x2u { - physical-layout = <&layout_ortho_5x12_2x2u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , <36 37 38 39 40 41 42 43 44 45 46 47> - , <48 49 50 51 52 58 59 53 54 55 56 57> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_5x12/all1u.dtsi b/app/dts/layouts/common/ortho_5x12/all1u.dtsi deleted file mode 100644 index e8648789..00000000 --- a/app/dts/layouts/common/ortho_5x12/all1u.dtsi +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include - -/ { - layout_ortho_5x12_all1u: layout_ortho_5x12_all1u { - compatible = "zmk,physical-layout"; - display-name = "50% All 1U/Grid"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 600 0 0 0 0> - , <&key_physical_attrs 100 100 700 0 0 0 0> - , <&key_physical_attrs 100 100 800 0 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 100 0 0 0> - , <&key_physical_attrs 100 100 600 100 0 0 0> - , <&key_physical_attrs 100 100 700 100 0 0 0> - , <&key_physical_attrs 100 100 800 100 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 0 200 0 0 0> - , <&key_physical_attrs 100 100 100 200 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 200 0 0 0> - , <&key_physical_attrs 100 100 600 200 0 0 0> - , <&key_physical_attrs 100 100 700 200 0 0 0> - , <&key_physical_attrs 100 100 800 200 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 0 300 0 0 0> - , <&key_physical_attrs 100 100 100 300 0 0 0> - , <&key_physical_attrs 100 100 200 300 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 300 0 0 0> - , <&key_physical_attrs 100 100 500 300 0 0 0> - , <&key_physical_attrs 100 100 600 300 0 0 0> - , <&key_physical_attrs 100 100 700 300 0 0 0> - , <&key_physical_attrs 100 100 800 300 0 0 0> - , <&key_physical_attrs 100 100 900 300 0 0 0> - , <&key_physical_attrs 100 100 1000 300 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - , <&key_physical_attrs 100 100 0 400 0 0 0> - , <&key_physical_attrs 100 100 100 400 0 0 0> - , <&key_physical_attrs 100 100 200 400 0 0 0> - , <&key_physical_attrs 100 100 300 400 0 0 0> - , <&key_physical_attrs 100 100 400 400 0 0 0> - , <&key_physical_attrs 100 100 500 400 0 0 0> - , <&key_physical_attrs 100 100 600 400 0 0 0> - , <&key_physical_attrs 100 100 700 400 0 0 0> - , <&key_physical_attrs 100 100 800 400 0 0 0> - , <&key_physical_attrs 100 100 900 400 0 0 0> - , <&key_physical_attrs 100 100 1000 400 0 0 0> - , <&key_physical_attrs 100 100 1100 400 0 0 0> - ; - }; -}; - -&layouts_common_ortho_5x12_position_map { - layout_ortho_5x12_all1u_posmap: layout_ortho_5x12_all1u { - physical-layout = <&layout_ortho_5x12_all1u>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , <36 37 38 39 40 41 42 43 44 45 46 47> - , <48 49 50 51 52 53 54 55 56 57 58 59> - ; - }; -}; diff --git a/app/dts/layouts/common/ortho_5x12/position_map.dtsi b/app/dts/layouts/common/ortho_5x12/position_map.dtsi deleted file mode 100644 index e292b4e7..00000000 --- a/app/dts/layouts/common/ortho_5x12/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_ortho_5x12_position_map: layouts_common_ortho_5x12_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/common/tkl/ansi.dtsi b/app/dts/layouts/common/tkl/ansi.dtsi deleted file mode 100644 index 83354c4f..00000000 --- a/app/dts/layouts/common/tkl/ansi.dtsi +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include - -/ { - layout_tkl_ansi: layout_tkl_ansi { - compatible = "zmk,physical-layout"; - display-name = "TKL 87 Key ANSI"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 0 0 0 0> - , <&key_physical_attrs 100 100 650 0 0 0 0> - , <&key_physical_attrs 100 100 750 0 0 0 0> - , <&key_physical_attrs 100 100 850 0 0 0 0> - , <&key_physical_attrs 100 100 950 0 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 0 0 0 0> - , <&key_physical_attrs 100 100 1400 0 0 0 0> - , <&key_physical_attrs 100 100 1525 0 0 0 0> - , <&key_physical_attrs 100 100 1625 0 0 0 0> - , <&key_physical_attrs 100 100 1725 0 0 0 0> - , <&key_physical_attrs 100 100 0 150 0 0 0> - , <&key_physical_attrs 100 100 100 150 0 0 0> - , <&key_physical_attrs 100 100 200 150 0 0 0> - , <&key_physical_attrs 100 100 300 150 0 0 0> - , <&key_physical_attrs 100 100 400 150 0 0 0> - , <&key_physical_attrs 100 100 500 150 0 0 0> - , <&key_physical_attrs 100 100 600 150 0 0 0> - , <&key_physical_attrs 100 100 700 150 0 0 0> - , <&key_physical_attrs 100 100 800 150 0 0 0> - , <&key_physical_attrs 100 100 900 150 0 0 0> - , <&key_physical_attrs 100 100 1000 150 0 0 0> - , <&key_physical_attrs 100 100 1100 150 0 0 0> - , <&key_physical_attrs 100 100 1200 150 0 0 0> - , <&key_physical_attrs 200 100 1300 150 0 0 0> - , <&key_physical_attrs 100 100 1525 150 0 0 0> - , <&key_physical_attrs 100 100 1625 150 0 0 0> - , <&key_physical_attrs 100 100 1725 150 0 0 0> - , <&key_physical_attrs 150 100 0 250 0 0 0> - , <&key_physical_attrs 100 100 150 250 0 0 0> - , <&key_physical_attrs 100 100 250 250 0 0 0> - , <&key_physical_attrs 100 100 350 250 0 0 0> - , <&key_physical_attrs 100 100 450 250 0 0 0> - , <&key_physical_attrs 100 100 550 250 0 0 0> - , <&key_physical_attrs 100 100 650 250 0 0 0> - , <&key_physical_attrs 100 100 750 250 0 0 0> - , <&key_physical_attrs 100 100 850 250 0 0 0> - , <&key_physical_attrs 100 100 950 250 0 0 0> - , <&key_physical_attrs 100 100 1050 250 0 0 0> - , <&key_physical_attrs 100 100 1150 250 0 0 0> - , <&key_physical_attrs 100 100 1250 250 0 0 0> - , <&key_physical_attrs 150 100 1350 250 0 0 0> - , <&key_physical_attrs 100 100 1525 250 0 0 0> - , <&key_physical_attrs 100 100 1625 250 0 0 0> - , <&key_physical_attrs 100 100 1725 250 0 0 0> - , <&key_physical_attrs 175 100 0 350 0 0 0> - , <&key_physical_attrs 100 100 175 350 0 0 0> - , <&key_physical_attrs 100 100 275 350 0 0 0> - , <&key_physical_attrs 100 100 375 350 0 0 0> - , <&key_physical_attrs 100 100 475 350 0 0 0> - , <&key_physical_attrs 100 100 575 350 0 0 0> - , <&key_physical_attrs 100 100 675 350 0 0 0> - , <&key_physical_attrs 100 100 775 350 0 0 0> - , <&key_physical_attrs 100 100 875 350 0 0 0> - , <&key_physical_attrs 100 100 975 350 0 0 0> - , <&key_physical_attrs 100 100 1075 350 0 0 0> - , <&key_physical_attrs 100 100 1175 350 0 0 0> - , <&key_physical_attrs 225 100 1275 350 0 0 0> - , <&key_physical_attrs 225 100 0 450 0 0 0> - , <&key_physical_attrs 100 100 225 450 0 0 0> - , <&key_physical_attrs 100 100 325 450 0 0 0> - , <&key_physical_attrs 100 100 425 450 0 0 0> - , <&key_physical_attrs 100 100 525 450 0 0 0> - , <&key_physical_attrs 100 100 625 450 0 0 0> - , <&key_physical_attrs 100 100 725 450 0 0 0> - , <&key_physical_attrs 100 100 825 450 0 0 0> - , <&key_physical_attrs 100 100 925 450 0 0 0> - , <&key_physical_attrs 100 100 1025 450 0 0 0> - , <&key_physical_attrs 100 100 1125 450 0 0 0> - , <&key_physical_attrs 275 100 1225 450 0 0 0> - , <&key_physical_attrs 100 100 1625 450 0 0 0> - , <&key_physical_attrs 125 100 0 550 0 0 0> - , <&key_physical_attrs 125 100 125 550 0 0 0> - , <&key_physical_attrs 125 100 250 550 0 0 0> - , <&key_physical_attrs 625 100 375 550 0 0 0> - , <&key_physical_attrs 125 100 1000 550 0 0 0> - , <&key_physical_attrs 125 100 1125 550 0 0 0> - , <&key_physical_attrs 125 100 1250 550 0 0 0> - , <&key_physical_attrs 125 100 1375 550 0 0 0> - , <&key_physical_attrs 100 100 1525 550 0 0 0> - , <&key_physical_attrs 100 100 1625 550 0 0 0> - , <&key_physical_attrs 100 100 1725 550 0 0 0> - ; - }; -}; diff --git a/app/dts/layouts/common/tkl/position_map.dtsi b/app/dts/layouts/common/tkl/position_map.dtsi deleted file mode 100644 index 8ac528e3..00000000 --- a/app/dts/layouts/common/tkl/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_common_tkl_position_map: layouts_common_tkl_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/cuddlykeyboards/ferris.dtsi b/app/dts/layouts/cuddlykeyboards/ferris.dtsi deleted file mode 100644 index 6c1df4f5..00000000 --- a/app/dts/layouts/cuddlykeyboards/ferris.dtsi +++ /dev/null @@ -1,45 +0,0 @@ -#include - -/ { - cuddlykeyboards_ferris_layout: cuddlykeyboards_ferris_layout { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 95 0 0 0> - , <&key_physical_attrs 100 100 100 32 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 28 0 0 0> - , <&key_physical_attrs 100 100 400 42 0 0 0> - , <&key_physical_attrs 100 100 700 42 0 0 0> - , <&key_physical_attrs 100 100 800 28 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 32 0 0 0> - , <&key_physical_attrs 100 100 1100 95 0 0 0> - , <&key_physical_attrs 100 100 0 195 0 0 0> - , <&key_physical_attrs 100 100 100 132 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 129 0 0 0> - , <&key_physical_attrs 100 100 400 142 0 0 0> - , <&key_physical_attrs 100 100 700 142 0 0 0> - , <&key_physical_attrs 100 100 800 129 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 132 0 0 0> - , <&key_physical_attrs 100 100 1100 195 0 0 0> - , <&key_physical_attrs 100 100 0 295 0 0 0> - , <&key_physical_attrs 100 100 100 231 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 229 0 0 0> - , <&key_physical_attrs 100 100 400 242 0 0 0> - , <&key_physical_attrs 100 100 700 242 0 0 0> - , <&key_physical_attrs 100 100 800 229 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 231 0 0 0> - , <&key_physical_attrs 100 100 1100 295 0 0 0> - , <&key_physical_attrs 100 100 330 355 1500 430 455> - , <&key_physical_attrs 100 100 430 355 3000 430 455> - , <&key_physical_attrs 100 100 670 355 (-3000) 770 455> - , <&key_physical_attrs 100 100 770 355 (-1500) 770 455> - ; - }; -}; diff --git a/app/dts/layouts/foostan/corne/5column.dtsi b/app/dts/layouts/foostan/corne/5column.dtsi deleted file mode 100644 index 72d52a60..00000000 --- a/app/dts/layouts/foostan/corne/5column.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -/ { - foostan_corne_5col_layout: foostan_corne_5col_layout { - compatible = "zmk,physical-layout"; - display-name = "5 Column"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 37 0 0 0> - , <&key_physical_attrs 100 100 100 12 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 12 0 0 0> - , <&key_physical_attrs 100 100 400 24 0 0 0> - , <&key_physical_attrs 100 100 700 24 0 0 0> - , <&key_physical_attrs 100 100 800 12 0 0 0> - , <&key_physical_attrs 100 100 900 0 0 0 0> - , <&key_physical_attrs 100 100 1000 12 0 0 0> - , <&key_physical_attrs 100 100 1100 37 0 0 0> - , <&key_physical_attrs 100 100 0 137 0 0 0> - , <&key_physical_attrs 100 100 100 112 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 112 0 0 0> - , <&key_physical_attrs 100 100 400 124 0 0 0> - , <&key_physical_attrs 100 100 700 124 0 0 0> - , <&key_physical_attrs 100 100 800 112 0 0 0> - , <&key_physical_attrs 100 100 900 100 0 0 0> - , <&key_physical_attrs 100 100 1000 112 0 0 0> - , <&key_physical_attrs 100 100 1100 137 0 0 0> - , <&key_physical_attrs 100 100 0 237 0 0 0> - , <&key_physical_attrs 100 100 100 212 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 212 0 0 0> - , <&key_physical_attrs 100 100 400 224 0 0 0> - , <&key_physical_attrs 100 100 700 224 0 0 0> - , <&key_physical_attrs 100 100 800 212 0 0 0> - , <&key_physical_attrs 100 100 900 200 0 0 0> - , <&key_physical_attrs 100 100 1000 212 0 0 0> - , <&key_physical_attrs 100 100 1100 237 0 0 0> - , <&key_physical_attrs 100 100 250 312 0 0 0> - , <&key_physical_attrs 100 100 350 312 1200 350 412> - , <&key_physical_attrs 100 150 448 283 2400 448 433> - , <&key_physical_attrs 100 150 652 283 (-2400) 752 433> - , <&key_physical_attrs 100 100 750 312 (-1200) 850 412> - , <&key_physical_attrs 100 100 850 312 0 0 0> - ; - }; -}; - -&layouts_foostan_corne_position_map { - foostan_corne_5col_posmap: five { - physical-layout = <&foostan_corne_5col_layout>; - positions - = <36 0 1 2 3 4 5 6 7 8 9 37> - , <38 10 11 12 13 14 15 16 17 18 19 39> - , <40 20 21 22 23 24 25 26 27 28 29 41> - , < 30 31 32 33 34 35 >; - }; -}; diff --git a/app/dts/layouts/foostan/corne/6column.dtsi b/app/dts/layouts/foostan/corne/6column.dtsi deleted file mode 100644 index 4747a1e3..00000000 --- a/app/dts/layouts/foostan/corne/6column.dtsi +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include - -/ { - foostan_corne_6col_layout: foostan_corne_6col_layout { - compatible = "zmk,physical-layout"; - display-name = "6 Column"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 37 0 0 0> - , <&key_physical_attrs 100 100 100 37 0 0 0> - , <&key_physical_attrs 100 100 200 12 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 12 0 0 0> - , <&key_physical_attrs 100 100 500 24 0 0 0> - , <&key_physical_attrs 100 100 800 24 0 0 0> - , <&key_physical_attrs 100 100 900 12 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 12 0 0 0> - , <&key_physical_attrs 100 100 1200 37 0 0 0> - , <&key_physical_attrs 100 100 1300 37 0 0 0> - , <&key_physical_attrs 100 100 0 137 0 0 0> - , <&key_physical_attrs 100 100 100 137 0 0 0> - , <&key_physical_attrs 100 100 200 112 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 112 0 0 0> - , <&key_physical_attrs 100 100 500 124 0 0 0> - , <&key_physical_attrs 100 100 800 124 0 0 0> - , <&key_physical_attrs 100 100 900 112 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 112 0 0 0> - , <&key_physical_attrs 100 100 1200 137 0 0 0> - , <&key_physical_attrs 100 100 1300 137 0 0 0> - , <&key_physical_attrs 100 100 0 237 0 0 0> - , <&key_physical_attrs 100 100 100 237 0 0 0> - , <&key_physical_attrs 100 100 200 212 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 212 0 0 0> - , <&key_physical_attrs 100 100 500 224 0 0 0> - , <&key_physical_attrs 100 100 800 224 0 0 0> - , <&key_physical_attrs 100 100 900 212 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 212 0 0 0> - , <&key_physical_attrs 100 100 1200 237 0 0 0> - , <&key_physical_attrs 100 100 1300 237 0 0 0> - , <&key_physical_attrs 100 100 350 312 0 0 0> - , <&key_physical_attrs 100 100 450 312 1200 450 412> - , <&key_physical_attrs 100 150 548 283 2400 548 433> - , <&key_physical_attrs 100 150 752 283 (-2400) 852 433> - , <&key_physical_attrs 100 100 850 312 (-1200) 950 412> - , <&key_physical_attrs 100 100 950 312 0 0 0> - ; - }; -}; - -&layouts_foostan_corne_position_map { - foostan_corne_6col_posmap: six { - physical-layout = <&foostan_corne_6col_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , < 36 37 38 39 40 41 >; - }; -}; diff --git a/app/dts/layouts/foostan/corne/position_map.dtsi b/app/dts/layouts/foostan/corne/position_map.dtsi deleted file mode 100644 index 7cf87d72..00000000 --- a/app/dts/layouts/foostan/corne/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_foostan_corne_position_map: layouts_foostan_corne_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/layouts/gtips/reviung41.dtsi b/app/dts/layouts/gtips/reviung41.dtsi deleted file mode 100644 index 08f45b3c..00000000 --- a/app/dts/layouts/gtips/reviung41.dtsi +++ /dev/null @@ -1,55 +0,0 @@ -#include - -/ { - gtips_reviung41_layout: gtips_reviung41_layout { - compatible = "zmk,physical-layout"; - display-name = "reviung41"; - - keys - = <&key_physical_attrs 100 100 000 53 700 400 338> - , <&key_physical_attrs 100 100 100 53 700 400 338> - , <&key_physical_attrs 100 100 200 28 700 400 338> - , <&key_physical_attrs 100 100 300 03 700 400 338> - , <&key_physical_attrs 100 100 400 28 700 400 338> - , <&key_physical_attrs 100 100 500 38 700 400 338> - , <&key_physical_attrs 100 100 700 38 (-700) 900 338> - , <&key_physical_attrs 100 100 800 28 (-700) 900 338> - , <&key_physical_attrs 100 100 900 03 (-700) 900 338> - , <&key_physical_attrs 100 100 1000 28 (-700) 900 338> - , <&key_physical_attrs 100 100 1100 53 (-700) 900 338> - , <&key_physical_attrs 100 100 1200 53 (-700) 900 338> - - , <&key_physical_attrs 100 100 000 153 700 400 338> - , <&key_physical_attrs 100 100 100 153 700 400 338> - , <&key_physical_attrs 100 100 200 128 700 400 338> - , <&key_physical_attrs 100 100 300 103 700 400 338> - , <&key_physical_attrs 100 100 400 128 700 400 338> - , <&key_physical_attrs 100 100 500 138 700 400 338> - , <&key_physical_attrs 100 100 700 138 (-700) 900 338> - , <&key_physical_attrs 100 100 800 128 (-700) 900 338> - , <&key_physical_attrs 100 100 900 103 (-700) 900 338> - , <&key_physical_attrs 100 100 1000 128 (-700) 900 338> - , <&key_physical_attrs 100 100 1100 153 (-700) 900 338> - , <&key_physical_attrs 100 100 1200 153 (-700) 900 338> - - , <&key_physical_attrs 100 100 000 253 700 400 338> - , <&key_physical_attrs 100 100 100 253 700 400 338> - , <&key_physical_attrs 100 100 200 228 700 400 338> - , <&key_physical_attrs 100 100 300 203 700 400 338> - , <&key_physical_attrs 100 100 400 228 700 400 338> - , <&key_physical_attrs 100 100 500 238 700 400 338> - , <&key_physical_attrs 100 100 700 238 (-700) 900 338> - , <&key_physical_attrs 100 100 800 228 (-700) 900 338> - , <&key_physical_attrs 100 100 900 203 (-700) 900 338> - , <&key_physical_attrs 100 100 1000 228 (-700) 900 338> - , <&key_physical_attrs 100 100 1100 253 (-700) 900 338> - , <&key_physical_attrs 100 100 1200 253 (-700) 900 338> - - , <&key_physical_attrs 100 100 339 338 0 0 0> - , <&key_physical_attrs 100 100 450 365 700 500 415> - , <&key_physical_attrs 200 100 555 394 0 0 0> - , <&key_physical_attrs 100 100 760 365 (-700) 710 415> - , <&key_physical_attrs 100 100 871 338 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/dts/layouts/josefadamcik/sofle.dtsi b/app/dts/layouts/josefadamcik/sofle.dtsi deleted file mode 100644 index 9c858e2d..00000000 --- a/app/dts/layouts/josefadamcik/sofle.dtsi +++ /dev/null @@ -1,71 +0,0 @@ -#include - -/ { - josefadamcik_sofle_layout: josefadamcik_sofle_layout { - compatible = "zmk,physical-layout"; - display-name = "Sofle"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 37 0 0 0> - , <&key_physical_attrs 100 100 100 37 0 0 0> - , <&key_physical_attrs 100 100 200 12 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 12 0 0 0> - , <&key_physical_attrs 100 100 500 24 0 0 0> - , <&key_physical_attrs 100 100 900 24 0 0 0> - , <&key_physical_attrs 100 100 1000 12 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 12 0 0 0> - , <&key_physical_attrs 100 100 1300 37 0 0 0> - , <&key_physical_attrs 100 100 1400 37 0 0 0> - , <&key_physical_attrs 100 100 0 137 0 0 0> - , <&key_physical_attrs 100 100 100 137 0 0 0> - , <&key_physical_attrs 100 100 200 112 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 112 0 0 0> - , <&key_physical_attrs 100 100 500 124 0 0 0> - , <&key_physical_attrs 100 100 900 124 0 0 0> - , <&key_physical_attrs 100 100 1000 112 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 1200 112 0 0 0> - , <&key_physical_attrs 100 100 1300 137 0 0 0> - , <&key_physical_attrs 100 100 1400 137 0 0 0> - , <&key_physical_attrs 100 100 0 237 0 0 0> - , <&key_physical_attrs 100 100 100 237 0 0 0> - , <&key_physical_attrs 100 100 200 212 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 212 0 0 0> - , <&key_physical_attrs 100 100 500 224 0 0 0> - , <&key_physical_attrs 100 100 900 224 0 0 0> - , <&key_physical_attrs 100 100 1000 212 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 1200 212 0 0 0> - , <&key_physical_attrs 100 100 1300 237 0 0 0> - , <&key_physical_attrs 100 100 1400 237 0 0 0> - , <&key_physical_attrs 100 100 0 337 0 0 0> - , <&key_physical_attrs 100 100 100 337 0 0 0> - , <&key_physical_attrs 100 100 200 312 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 312 0 0 0> - , <&key_physical_attrs 100 100 500 324 0 0 0> - , <&key_physical_attrs 100 100 600 274 0 0 0> - , <&key_physical_attrs 100 100 800 274 0 0 0> - , <&key_physical_attrs 100 100 900 324 0 0 0> - , <&key_physical_attrs 100 100 1000 312 0 0 0> - , <&key_physical_attrs 100 100 1100 300 0 0 0> - , <&key_physical_attrs 100 100 1200 312 0 0 0> - , <&key_physical_attrs 100 100 1300 337 0 0 0> - , <&key_physical_attrs 100 100 1400 337 0 0 0> - , <&key_physical_attrs 100 100 175 437 0 0 0> - , <&key_physical_attrs 100 100 275 412 0 0 0> - , <&key_physical_attrs 100 100 375 412 0 0 0> - , <&key_physical_attrs 100 100 490 412 1200 490 412> - , <&key_physical_attrs 100 150 600 383 2400 600 433> - , <&key_physical_attrs 100 150 800 383 (-2400) 900 433> - , <&key_physical_attrs 100 100 910 412 (-1200) 1010 412> - , <&key_physical_attrs 100 100 1025 412 0 0 0> - , <&key_physical_attrs 100 100 1125 412 0 0 0> - , <&key_physical_attrs 100 100 1225 437 0 0 0> - ; - }; -}; \ No newline at end of file diff --git a/app/dts/layouts/kata0510/lily58.dtsi b/app/dts/layouts/kata0510/lily58.dtsi deleted file mode 100644 index 7cb1f25e..00000000 --- a/app/dts/layouts/kata0510/lily58.dtsi +++ /dev/null @@ -1,69 +0,0 @@ -#include - -/ { - kata0510_lily58_layout: kata0510_lily58_layout { - compatible = "zmk,physical-layout"; - display-name = "Default"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 50 0 0 0> - , <&key_physical_attrs 100 100 100 37 0 0 0> - , <&key_physical_attrs 100 100 200 12 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 12 0 0 0> - , <&key_physical_attrs 100 100 500 25 0 0 0> - , <&key_physical_attrs 100 100 1050 25 0 0 0> - , <&key_physical_attrs 100 100 1150 12 0 0 0> - , <&key_physical_attrs 100 100 1250 0 0 0 0> - , <&key_physical_attrs 100 100 1350 12 0 0 0> - , <&key_physical_attrs 100 100 1450 37 0 0 0> - , <&key_physical_attrs 100 100 1550 50 0 0 0> - , <&key_physical_attrs 100 100 0 150 0 0 0> - , <&key_physical_attrs 100 100 100 137 0 0 0> - , <&key_physical_attrs 100 100 200 112 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 112 0 0 0> - , <&key_physical_attrs 100 100 500 125 0 0 0> - , <&key_physical_attrs 100 100 1050 125 0 0 0> - , <&key_physical_attrs 100 100 1150 112 0 0 0> - , <&key_physical_attrs 100 100 1250 100 0 0 0> - , <&key_physical_attrs 100 100 1350 112 0 0 0> - , <&key_physical_attrs 100 100 1450 137 0 0 0> - , <&key_physical_attrs 100 100 1550 150 0 0 0> - , <&key_physical_attrs 100 100 0 250 0 0 0> - , <&key_physical_attrs 100 100 100 237 0 0 0> - , <&key_physical_attrs 100 100 200 212 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 212 0 0 0> - , <&key_physical_attrs 100 100 500 225 0 0 0> - , <&key_physical_attrs 100 100 1050 225 0 0 0> - , <&key_physical_attrs 100 100 1150 212 0 0 0> - , <&key_physical_attrs 100 100 1250 200 0 0 0> - , <&key_physical_attrs 100 100 1350 212 0 0 0> - , <&key_physical_attrs 100 100 1450 237 0 0 0> - , <&key_physical_attrs 100 100 1550 250 0 0 0> - , <&key_physical_attrs 100 100 0 350 0 0 0> - , <&key_physical_attrs 100 100 100 337 0 0 0> - , <&key_physical_attrs 100 100 200 312 0 0 0> - , <&key_physical_attrs 100 100 300 300 0 0 0> - , <&key_physical_attrs 100 100 400 312 0 0 0> - , <&key_physical_attrs 100 100 500 325 0 0 0> - , <&key_physical_attrs 100 100 600 275 0 0 0> - , <&key_physical_attrs 100 100 950 275 0 0 0> - , <&key_physical_attrs 100 100 1050 325 0 0 0> - , <&key_physical_attrs 100 100 1150 312 0 0 0> - , <&key_physical_attrs 100 100 1250 300 0 0 0> - , <&key_physical_attrs 100 100 1350 312 0 0 0> - , <&key_physical_attrs 100 100 1450 337 0 0 0> - , <&key_physical_attrs 100 100 1550 350 0 0 0> - , <&key_physical_attrs 100 100 250 412 0 0 0> - , <&key_physical_attrs 100 100 350 415 0 0 0> - , <&key_physical_attrs 100 100 450 425 0 0 0> - , <&key_physical_attrs 100 150 575 400 3000 625 475> - , <&key_physical_attrs 100 150 975 400 (-3000) 1025 475> - , <&key_physical_attrs 100 100 1100 425 0 0 0> - , <&key_physical_attrs 100 100 1200 415 0 0 0> - , <&key_physical_attrs 100 100 1300 415 0 0 0> - ; - }; -}; diff --git a/app/dts/layouts/kgoh/jian/5column.dtsi b/app/dts/layouts/kgoh/jian/5column.dtsi deleted file mode 100644 index c54d07fd..00000000 --- a/app/dts/layouts/kgoh/jian/5column.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -/ { - kgoh_jian_5col_layout: kgoh_jian_5col_layout { - compatible = "zmk,physical-layout"; - display-name = "5 Column"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 62 0 0 0> - , <&key_physical_attrs 100 100 100 25 0 0 0> - , <&key_physical_attrs 100 100 200 0 0 0 0> - , <&key_physical_attrs 100 100 300 25 0 0 0> - , <&key_physical_attrs 100 100 400 37 0 0 0> - , <&key_physical_attrs 100 100 800 37 0 0 0> - , <&key_physical_attrs 100 100 900 25 0 0 0> - , <&key_physical_attrs 100 100 1000 0 0 0 0> - , <&key_physical_attrs 100 100 1100 25 0 0 0> - , <&key_physical_attrs 100 100 1200 62 0 0 0> - , <&key_physical_attrs 100 100 0 162 0 0 0> - , <&key_physical_attrs 100 100 100 125 0 0 0> - , <&key_physical_attrs 100 100 200 100 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 400 137 0 0 0> - , <&key_physical_attrs 100 100 800 137 0 0 0> - , <&key_physical_attrs 100 100 900 125 0 0 0> - , <&key_physical_attrs 100 100 1000 100 0 0 0> - , <&key_physical_attrs 100 100 1100 125 0 0 0> - , <&key_physical_attrs 100 100 1200 162 0 0 0> - , <&key_physical_attrs 100 100 0 262 0 0 0> - , <&key_physical_attrs 100 100 100 225 0 0 0> - , <&key_physical_attrs 100 100 200 200 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 400 237 0 0 0> - , <&key_physical_attrs 100 100 800 237 0 0 0> - , <&key_physical_attrs 100 100 900 225 0 0 0> - , <&key_physical_attrs 100 100 1000 200 0 0 0> - , <&key_physical_attrs 100 100 1100 225 0 0 0> - , <&key_physical_attrs 100 100 1200 262 0 0 0> - , <&key_physical_attrs 100 100 300 325 0 0 0> - , <&key_physical_attrs 100 100 400 337 0 0 0> - , <&key_physical_attrs 100 100 500 350 0 0 0> - , <&key_physical_attrs 100 100 700 350 0 0 0> - , <&key_physical_attrs 100 100 800 337 0 0 0> - , <&key_physical_attrs 100 100 900 325 0 0 0> - ; - }; -}; - -&layouts_kgoh_jian_position_map { - kgoh_jian_5col_posmap: five { - physical-layout = <&kgoh_jian_5col_layout>; - positions - = <36 37 0 1 2 3 4 5 6 7 8 9 38 39> - , < 40 10 11 12 13 14 15 16 17 18 19 41 > - , < 42 20 21 22 23 24 25 26 27 28 29 43 > - , < 30 31 32 33 34 35 >; - }; -}; diff --git a/app/dts/layouts/kgoh/jian/6column.dtsi b/app/dts/layouts/kgoh/jian/6column.dtsi deleted file mode 100644 index ec648846..00000000 --- a/app/dts/layouts/kgoh/jian/6column.dtsi +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include - -/ { - kgoh_jian_6col_layout: kgoh_jian_6col_layout { - compatible = "zmk,physical-layout"; - display-name = "6 Column"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 75 0 0 0> - , <&key_physical_attrs 100 100 100 62 0 0 0> - , <&key_physical_attrs 100 100 200 25 0 0 0> - , <&key_physical_attrs 100 100 300 0 0 0 0> - , <&key_physical_attrs 100 100 400 25 0 0 0> - , <&key_physical_attrs 100 100 500 37 0 0 0> - , <&key_physical_attrs 100 100 900 37 0 0 0> - , <&key_physical_attrs 100 100 1000 25 0 0 0> - , <&key_physical_attrs 100 100 1100 0 0 0 0> - , <&key_physical_attrs 100 100 1200 25 0 0 0> - , <&key_physical_attrs 100 100 1300 62 0 0 0> - , <&key_physical_attrs 100 100 1400 75 0 0 0> - , <&key_physical_attrs 100 100 0 175 0 0 0> - , <&key_physical_attrs 100 100 100 162 0 0 0> - , <&key_physical_attrs 100 100 200 125 0 0 0> - , <&key_physical_attrs 100 100 300 100 0 0 0> - , <&key_physical_attrs 100 100 400 125 0 0 0> - , <&key_physical_attrs 100 100 500 137 0 0 0> - , <&key_physical_attrs 100 100 900 137 0 0 0> - , <&key_physical_attrs 100 100 1000 125 0 0 0> - , <&key_physical_attrs 100 100 1100 100 0 0 0> - , <&key_physical_attrs 100 100 1200 125 0 0 0> - , <&key_physical_attrs 100 100 1300 162 0 0 0> - , <&key_physical_attrs 100 100 1400 175 0 0 0> - , <&key_physical_attrs 100 100 0 275 0 0 0> - , <&key_physical_attrs 100 100 100 262 0 0 0> - , <&key_physical_attrs 100 100 200 225 0 0 0> - , <&key_physical_attrs 100 100 300 200 0 0 0> - , <&key_physical_attrs 100 100 400 225 0 0 0> - , <&key_physical_attrs 100 100 500 237 0 0 0> - , <&key_physical_attrs 100 100 900 237 0 0 0> - , <&key_physical_attrs 100 100 1000 225 0 0 0> - , <&key_physical_attrs 100 100 1100 200 0 0 0> - , <&key_physical_attrs 100 100 1200 225 0 0 0> - , <&key_physical_attrs 100 100 1300 262 0 0 0> - , <&key_physical_attrs 100 100 1400 275 0 0 0> - , <&key_physical_attrs 100 100 400 325 0 0 0> - , <&key_physical_attrs 100 100 500 337 0 0 0> - , <&key_physical_attrs 100 100 600 350 0 0 0> - , <&key_physical_attrs 100 100 800 350 0 0 0> - , <&key_physical_attrs 100 100 900 337 0 0 0> - , <&key_physical_attrs 100 100 1000 325 0 0 0> - ; - }; -}; - -&layouts_kgoh_jian_position_map { - kgoh_jian_6col_posmap: six { - physical-layout = <&kgoh_jian_6col_layout>; - positions - = <42 0 1 2 3 4 5 6 7 8 9 10 11 43> - , < 12 13 14 15 16 17 18 19 20 21 22 23 > - , < 24 25 26 27 28 29 30 31 32 33 34 35 > - , < 36 37 38 39 40 41 >; - }; -}; diff --git a/app/dts/layouts/kgoh/jian/full.dtsi b/app/dts/layouts/kgoh/jian/full.dtsi deleted file mode 100644 index a16903d3..00000000 --- a/app/dts/layouts/kgoh/jian/full.dtsi +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include - -/ { - kgoh_jian_full_layout: kgoh_jian_full_layout { - compatible = "zmk,physical-layout"; - display-name = "Full (with pinky)"; - - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 150 0 0 0> - , <&key_physical_attrs 100 100 100 75 0 0 0> - , <&key_physical_attrs 100 100 200 62 0 0 0> - , <&key_physical_attrs 100 100 300 25 0 0 0> - , <&key_physical_attrs 100 100 400 0 0 0 0> - , <&key_physical_attrs 100 100 500 25 0 0 0> - , <&key_physical_attrs 100 100 600 37 0 0 0> - , <&key_physical_attrs 100 100 1000 37 0 0 0> - , <&key_physical_attrs 100 100 1100 25 0 0 0> - , <&key_physical_attrs 100 100 1200 0 0 0 0> - , <&key_physical_attrs 100 100 1300 25 0 0 0> - , <&key_physical_attrs 100 100 1400 62 0 0 0> - , <&key_physical_attrs 100 100 1500 75 0 0 0> - , <&key_physical_attrs 100 100 1600 150 0 0 0> - , <&key_physical_attrs 100 100 100 175 0 0 0> - , <&key_physical_attrs 100 100 200 162 0 0 0> - , <&key_physical_attrs 100 100 300 125 0 0 0> - , <&key_physical_attrs 100 100 400 100 0 0 0> - , <&key_physical_attrs 100 100 500 125 0 0 0> - , <&key_physical_attrs 100 100 600 137 0 0 0> - , <&key_physical_attrs 100 100 1000 137 0 0 0> - , <&key_physical_attrs 100 100 1100 125 0 0 0> - , <&key_physical_attrs 100 100 1200 100 0 0 0> - , <&key_physical_attrs 100 100 1300 125 0 0 0> - , <&key_physical_attrs 100 100 1400 162 0 0 0> - , <&key_physical_attrs 100 100 1500 175 0 0 0> - , <&key_physical_attrs 100 100 100 275 0 0 0> - , <&key_physical_attrs 100 100 200 262 0 0 0> - , <&key_physical_attrs 100 100 300 225 0 0 0> - , <&key_physical_attrs 100 100 400 200 0 0 0> - , <&key_physical_attrs 100 100 500 225 0 0 0> - , <&key_physical_attrs 100 100 600 237 0 0 0> - , <&key_physical_attrs 100 100 1000 237 0 0 0> - , <&key_physical_attrs 100 100 1100 225 0 0 0> - , <&key_physical_attrs 100 100 1200 200 0 0 0> - , <&key_physical_attrs 100 100 1300 225 0 0 0> - , <&key_physical_attrs 100 100 1400 262 0 0 0> - , <&key_physical_attrs 100 100 1500 275 0 0 0> - , <&key_physical_attrs 100 100 500 325 0 0 0> - , <&key_physical_attrs 100 100 600 337 0 0 0> - , <&key_physical_attrs 100 100 700 350 0 0 0> - , <&key_physical_attrs 100 100 900 350 0 0 0> - , <&key_physical_attrs 100 100 1000 337 0 0 0> - , <&key_physical_attrs 100 100 1100 325 0 0 0> - ; - }; -}; - -&layouts_kgoh_jian_position_map { - kgoh_jian_full_posmap: full { - physical-layout = <&kgoh_jian_full_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13> - , < 14 15 16 17 18 19 20 21 22 23 24 25 > - , < 26 27 28 29 30 31 32 33 34 35 36 37 > - , < 38 39 40 41 42 43 >; - }; -}; diff --git a/app/dts/layouts/kgoh/jian/position_map.dtsi b/app/dts/layouts/kgoh/jian/position_map.dtsi deleted file mode 100644 index 126e0772..00000000 --- a/app/dts/layouts/kgoh/jian/position_map.dtsi +++ /dev/null @@ -1,7 +0,0 @@ -/ { - layouts_kgoh_jian_position_map: layouts_kgoh_jian_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - }; -}; diff --git a/app/dts/physical_layouts.dtsi b/app/dts/physical_layouts.dtsi deleted file mode 100644 index 1c8703ec..00000000 --- a/app/dts/physical_layouts.dtsi +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/ { - key_physical_attrs: key_physical_attrs { - compatible = "zmk,key-physical-attrs"; - - #key-cells = <7>; - }; -}; \ No newline at end of file diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 56c26a01..066cc723 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -23,39 +23,6 @@ * (Internal use only.) */ -struct behavior_parameter_value_metadata { - char *display_name; - - union { - uint32_t value; - struct { - int32_t min; - int32_t max; - } range; - }; - - enum { - BEHAVIOR_PARAMETER_VALUE_TYPE_NIL = 0, - BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE = 1, - BEHAVIOR_PARAMETER_VALUE_TYPE_RANGE = 2, - BEHAVIOR_PARAMETER_VALUE_TYPE_HID_USAGE = 3, - BEHAVIOR_PARAMETER_VALUE_TYPE_LAYER_ID = 4, - } type; -}; - -struct behavior_parameter_metadata_set { - size_t param1_values_len; - const struct behavior_parameter_value_metadata *param1_values; - - size_t param2_values_len; - const struct behavior_parameter_value_metadata *param2_values; -}; - -struct behavior_parameter_metadata { - size_t sets_len; - const struct behavior_parameter_metadata_set *sets; -}; - enum behavior_sensor_binding_process_mode { BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER, BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD, @@ -70,10 +37,6 @@ typedef int (*behavior_sensor_keymap_binding_accept_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -typedef int (*behavior_get_parameter_metadata_t)( - const struct device *behavior, struct behavior_parameter_metadata *param_metadata); -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -88,152 +51,11 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_released; behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_accept_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - behavior_get_parameter_metadata_t get_parameter_metadata; - const struct behavior_parameter_metadata *parameter_metadata; -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; /** * @endcond */ -struct zmk_behavior_metadata { -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - const char *display_name; -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; - -struct zmk_behavior_ref { - const struct device *device; - const struct zmk_behavior_metadata metadata; -}; - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS) - -struct zmk_behavior_local_id_map { - const struct device *device; - zmk_behavior_local_id_t local_id; -}; - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS) - -#define ZMK_BEHAVIOR_REF_DT_NAME(node_id) _CONCAT(zmk_behavior_, DEVICE_DT_NAME_GET(node_id)) - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -#define ZMK_BEHAVIOR_METADATA_INITIALIZER(node_id) \ - { \ - .display_name = DT_PROP_OR(node_id, display_name, DEVICE_DT_NAME(node_id)), \ - } - -#else - -#define ZMK_BEHAVIOR_METADATA_INITIALIZER(node_id) \ - {} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -#define ZMK_BEHAVIOR_REF_INITIALIZER(node_id, _dev) \ - { \ - .device = _dev, \ - .metadata = ZMK_BEHAVIOR_METADATA_INITIALIZER(node_id), \ - } - -#define ZMK_BEHAVIOR_LOCAL_ID_MAP_INITIALIZER(node_id, _dev) \ - { \ - .device = _dev, \ - } - -#define ZMK_BEHAVIOR_REF_DEFINE(name, node_id, _dev) \ - static const STRUCT_SECTION_ITERABLE(zmk_behavior_ref, name) = \ - ZMK_BEHAVIOR_REF_INITIALIZER(node_id, _dev); \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS), \ - (static const STRUCT_SECTION_ITERABLE(zmk_behavior_local_id_map, \ - _CONCAT(_zmk_behavior_local_id_map, name)) = \ - ZMK_BEHAVIOR_LOCAL_ID_MAP_INITIALIZER(node_id, _dev)), \ - ()); - -#define ZMK_BEHAVIOR_REF_DT_DEFINE(node_id) \ - ZMK_BEHAVIOR_REF_DEFINE(ZMK_BEHAVIOR_REF_DT_NAME(node_id), node_id, DEVICE_DT_GET(node_id)) - -/** - * Registers @p node_id as a behavior. - */ -#define BEHAVIOR_DEFINE(node_id) ZMK_BEHAVIOR_REF_DT_DEFINE(node_id) - -/** - * @brief Like DEVICE_DT_DEFINE(), but also registers the device as a behavior. - * - * @param node_id The devicetree node identifier. - * @param ... Other parameters as expected by DEVICE_DT_DEFINE. - */ -#define BEHAVIOR_DT_DEFINE(node_id, ...) \ - DEVICE_DT_DEFINE(node_id, __VA_ARGS__); \ - BEHAVIOR_DEFINE(node_id) - -/** - * @brief Like DEVICE_DT_INST_DEFINE(), but also registers the device as a behavior. - * - * @param inst Instance number. - * @param ... Other parameters as expected by DEVICE_DT_DEFINE. - */ -#define BEHAVIOR_DT_INST_DEFINE(inst, ...) \ - DEVICE_DT_INST_DEFINE(inst, __VA_ARGS__); \ - BEHAVIOR_DEFINE(DT_DRV_INST(inst)) - -/** - * @brief Validate a given behavior binding is valid, including parameter validation - * if the metadata feature is enablued. - * - * @param binding The behavior binding to validate. - * - * @retval 0 if the passed in binding is valid. - * @retval -ENODEV if the binding references a non-existant behavior. - * @retval -EINVAL if parameters are not valid for the behavior metadata. - */ -int zmk_behavior_validate_binding(const struct zmk_behavior_binding *binding); - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -int zmk_behavior_get_empty_param_metadata(const struct device *dev, - struct behavior_parameter_metadata *metadata); - -/** - * @brief Validate a given behavior parameters match the behavior metadata. - * - * @param metadata The behavior metadata to validate against - * @param param1 The first parameter value - * @param param2 The second parameter value - * - * @retval 0 if the passed in parameters are valid. - * @retval -ENODEV if metadata is NULL. - * @retval -EINVAL if parameters are not valid for the metadata. - */ -int zmk_behavior_check_params_match_metadata(const struct behavior_parameter_metadata *metadata, - uint32_t param1, uint32_t param2); -/** - * @brief Validate a given behavior parameter matches the behavior metadata parameter values. - * - * @param values The values to validate against - * @param values_len How many values to check - * @param param The value to check. - * - * @retval 0 if the passed in parameter is valid. - * @retval -ENODEV if values is NULL. - * @retval -EINVAL if parameter is not valid for the value metadata. - */ -int zmk_behavior_validate_param_values(const struct behavior_parameter_value_metadata *values, - size_t values_len, uint32_t param); - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -/** - * Syscall wrapper for zmk_behavior_get_binding(). - * - * Use zmk_behavior_get_binding() in application code instead. - */ -__syscall const struct device *behavior_get_binding(const char *name); - /** * @brief Handle the keymap binding which needs to be converted from relative "toggle" to absolute * "turn on" @@ -248,7 +70,7 @@ __syscall int behavior_keymap_binding_convert_central_state_dependent_params( static inline int z_impl_behavior_keymap_binding_convert_central_state_dependent_params( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; if (api->binding_convert_central_state_dependent_params == NULL) { @@ -258,40 +80,6 @@ static inline int z_impl_behavior_keymap_binding_convert_central_state_dependent return api->binding_convert_central_state_dependent_params(binding, event); } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -/** - * @brief Determine where the behavior should be run - * @param behavior Pointer to the device structure for the driver instance. - * - * @retval Zero if successful. - * @retval Negative errno code if failure. - */ -__syscall int behavior_get_parameter_metadata(const struct device *behavior, - struct behavior_parameter_metadata *param_metadata); - -static inline int -z_impl_behavior_get_parameter_metadata(const struct device *behavior, - struct behavior_parameter_metadata *param_metadata) { - if (behavior == NULL || param_metadata == NULL) { - return -EINVAL; - } - - const struct behavior_driver_api *api = (const struct behavior_driver_api *)behavior->api; - - if (api->get_parameter_metadata) { - return api->get_parameter_metadata(behavior, param_metadata); - } else if (api->parameter_metadata) { - *param_metadata = *api->parameter_metadata; - } else { - return -ENODEV; - } - - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - /** * @brief Determine where the behavior should be run * @param behavior Pointer to the device structure for the driver instance. @@ -328,7 +116,7 @@ __syscall int behavior_keymap_binding_pressed(struct zmk_behavior_binding *bindi static inline int z_impl_behavior_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { return -EINVAL; @@ -356,7 +144,7 @@ __syscall int behavior_keymap_binding_released(struct zmk_behavior_binding *bind static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { return -EINVAL; @@ -390,7 +178,7 @@ static inline int z_impl_behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { return -EINVAL; @@ -426,7 +214,7 @@ static inline int z_impl_behavior_sensor_keymap_binding_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { return -EINVAL; diff --git a/app/include/drivers/input_processor.h b/app/include/drivers/input_processor.h deleted file mode 100644 index fac4459b..00000000 --- a/app/include/drivers/input_processor.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -#define ZMK_INPUT_PROC_CONTINUE 0 -#define ZMK_INPUT_PROC_STOP 1 - -struct zmk_input_processor_entry { - const struct device *dev; - uint32_t param1; - uint32_t param2; - bool track_remainders; -}; - -#define ZMK_INPUT_PROCESSOR_ENTRY_AT_IDX(idx, n) \ - { \ - .dev = DEVICE_DT_GET(DT_PHANDLE_BY_IDX(n, input_processors, idx)), \ - .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(n, input_processors, idx, param1), (0), \ - (DT_PHA_BY_IDX(n, input_processors, idx, param1))), \ - .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(n, input_processors, idx, param2), (0), \ - (DT_PHA_BY_IDX(n, input_processors, idx, param2))), \ - .track_remainders = \ - COND_CODE_1(DT_PROP(DT_PHANDLE_BY_IDX(n, input_processors, idx), track_remainders), \ - (true), (false)), \ - } - -struct zmk_input_processor_state { - uint8_t input_device_index; - int16_t *remainder; -}; - -// TODO: Need the ability to store remainders? Some data passed in? -typedef int (*zmk_input_processor_handle_event_callback_t)(const struct device *dev, - struct input_event *event, - uint32_t param1, uint32_t param2, - struct zmk_input_processor_state *state); - -__subsystem struct zmk_input_processor_driver_api { - zmk_input_processor_handle_event_callback_t handle_event; -}; - -__syscall int zmk_input_processor_handle_event(const struct device *dev, struct input_event *event, - uint32_t param1, uint32_t param2, - struct zmk_input_processor_state *state); - -static inline int z_impl_zmk_input_processor_handle_event(const struct device *dev, - struct input_event *event, - uint32_t param1, uint32_t param2, - struct zmk_input_processor_state *state) { - const struct zmk_input_processor_driver_api *api = - (const struct zmk_input_processor_driver_api *)dev->api; - - if (api->handle_event == NULL) { - return -ENOTSUP; - } - - return api->handle_event(dev, event, param1, param2, state); -} - -#include diff --git a/app/include/dt-bindings/input.h b/app/include/dt-bindings/input.h deleted file mode 100644 index 2437b504..00000000 --- a/app/include/dt-bindings/input.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#define ZMK_INPUT_EXPLICIT_CODE(type, code) ((type << 16) & code) - -#define ZMK_INPUT_EXPLICIT_CODE_TYPE(val) ((val >> 16) & 0xFF) -#define ZMK_INPUT_EXPLICIT_CODE_CODE(val) (val & 0xFFFF) \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/behaviors.h b/app/include/dt-bindings/zmk/behaviors.h deleted file mode 100644 index abfb91f4..00000000 --- a/app/include/dt-bindings/zmk/behaviors.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define ZMK_BEHAVIOR_OMIT(_name) \ - !(defined(ZMK_BEHAVIORS_KEEP_##_name) || \ - (defined(ZMK_BEHAVIORS_KEEP_ALL) && !defined(ZMK_BEHAVIORS_OMIT_##_name))) \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/bt.h b/app/include/dt-bindings/zmk/bt.h index aaad4dc5..8ca10606 100644 --- a/app/include/dt-bindings/zmk/bt.h +++ b/app/include/dt-bindings/zmk/bt.h @@ -8,8 +8,7 @@ #define BT_NXT_CMD 1 #define BT_PRV_CMD 2 #define BT_SEL_CMD 3 -#define BT_CLR_ALL_CMD 4 -#define BT_DISC_CMD 5 +// #define BT_FULL_RESET_CMD 4 /* Note: Some future commands will include additional parameters, so we @@ -20,5 +19,3 @@ defines these aliases up front. #define BT_NXT BT_NXT_CMD 0 #define BT_PRV BT_PRV_CMD 0 #define BT_SEL BT_SEL_CMD -#define BT_CLR_ALL BT_CLR_ALL_CMD 0 -#define BT_DISC BT_DISC_CMD diff --git a/app/include/dt-bindings/zmk/hid_indicators.h b/app/include/dt-bindings/zmk/hid_indicators.h deleted file mode 100644 index fcd27700..00000000 --- a/app/include/dt-bindings/zmk/hid_indicators.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -// hid.h defines HID_USAGE_LED_NUM_LOCK as the minimum value, so that is bit -// zero in the report, and all other indicators are relative to that. - -#define HID_INDICATOR_NUM_LOCK (1 << (HID_USAGE_LED_NUM_LOCK - HID_USAGE_LED_NUM_LOCK)) -#define HID_INDICATOR_CAPS_LOCK (1 << (HID_USAGE_LED_CAPS_LOCK - HID_USAGE_LED_NUM_LOCK)) -#define HID_INDICATOR_SCROLL_LOCK (1 << (HID_USAGE_LED_SCROLL_LOCK - HID_USAGE_LED_NUM_LOCK)) -#define HID_INDICATOR_COMPOSE (1 << (HID_USAGE_LED_COMPOSE - HID_USAGE_LED_NUM_LOCK)) -#define HID_INDICATOR_KANA (1 << (HID_USAGE_LED_KANA - HID_USAGE_LED_NUM_LOCK)) diff --git a/app/include/dt-bindings/zmk/hid_usage.h b/app/include/dt-bindings/zmk/hid_usage.h index 8c0e9470..0555f004 100644 --- a/app/include/dt-bindings/zmk/hid_usage.h +++ b/app/include/dt-bindings/zmk/hid_usage.h @@ -1109,7 +1109,7 @@ #define HID_USAGE_CONSUMER_AC_RENAME (0x298) // Sel #define HID_USAGE_CONSUMER_AC_MERGE (0x299) // Sel #define HID_USAGE_CONSUMER_AC_SPLIT (0x29A) // Sel -#define HID_USAGE_CONSUMER_AC_DISTRIBUTE_HORIZONTALLY (0x29B) // Sel +#define HID_USAGE_CONSUMER_AC_DISRIBUTE_HORIZONTALLY (0x29B) // Sel #define HID_USAGE_CONSUMER_AC_DISTRIBUTE_VERTICALLY (0x29C) // Sel #define HID_USAGE_CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT (0x29D) // Sel #define HID_USAGE_CONSUMER_AC_NAVIGATION_GUIDANCE (0x29E) // Sel @@ -2563,4 +2563,4 @@ #define HID_USAGE_FIDO_UNDEFINED (0x00) #define HID_USAGE_FIDO_U2F_AUTHENTICATOR_DEVICE (0x01) // CA #define HID_USAGE_FIDO_INPUT_REPORT_DATA (0x20) // DV -#define HID_USAGE_FIDO_OUTPUT_REPORT_DATA (0x21) // DV +#define HID_USAGE_FIDO_OUTPUT_REPORT_DATA (0x21) // DV \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/hid_usage_pages.h b/app/include/dt-bindings/zmk/hid_usage_pages.h index 7fa54fd8..2ccdba55 100644 --- a/app/include/dt-bindings/zmk/hid_usage_pages.h +++ b/app/include/dt-bindings/zmk/hid_usage_pages.h @@ -26,7 +26,6 @@ #define HID_USAGE_GDV (0x06) // Generic Device Controls #define HID_USAGE_KEY (0x07) // Keyboard/Keypad #define HID_USAGE_LED (0x08) // LED -#define HID_USAGE_BUTTON (0x09) // Button #define HID_USAGE_TELEPHONY (0x0B) // Telephony Device #define HID_USAGE_CONSUMER (0x0C) // Consumer #define HID_USAGE_DIGITIZERS (0x0D) // Digitizers diff --git a/app/include/dt-bindings/zmk/input_transform.h b/app/include/dt-bindings/zmk/input_transform.h deleted file mode 100644 index f75c6dab..00000000 --- a/app/include/dt-bindings/zmk/input_transform.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#define INPUT_TRANSFORM_XY_SWAP BIT(0) -#define INPUT_TRANSFORM_X_INVERT BIT(1) -#define INPUT_TRANSFORM_Y_INVERT BIT(2) \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/mouse.h b/app/include/dt-bindings/zmk/mouse.h deleted file mode 100644 index ce41e7f7..00000000 --- a/app/include/dt-bindings/zmk/mouse.h +++ /dev/null @@ -1,9 +0,0 @@ - -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ -#pragma once - -#include "pointing.h" \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/outputs.h b/app/include/dt-bindings/zmk/outputs.h index 1bb8d740..f24380f7 100644 --- a/app/include/dt-bindings/zmk/outputs.h +++ b/app/include/dt-bindings/zmk/outputs.h @@ -6,5 +6,4 @@ #define OUT_TOG 0 #define OUT_USB 1 -#define OUT_BLE 2 -#define OUT_NONE 3 \ No newline at end of file +#define OUT_BLE 2 \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/pointing.h b/app/include/dt-bindings/zmk/pointing.h deleted file mode 100644 index 48246504..00000000 --- a/app/include/dt-bindings/zmk/pointing.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ -#pragma once - -#include - -/* Mouse press behavior */ -/* Left click */ -#define MB1 BIT(0) -#define LCLK (MB1) - -/* Right click */ -#define MB2 BIT(1) -#define RCLK (MB2) - -/* Middle click */ -#define MB3 BIT(2) -#define MCLK (MB3) - -#define MB4 BIT(3) -#define MB5 BIT(4) - -#ifndef ZMK_POINTING_DEFAULT_MOVE_VAL -#define ZMK_POINTING_DEFAULT_MOVE_VAL 600 -#endif - -#ifndef ZMK_POINTING_DEFAULT_SCRL_VAL -#define ZMK_POINTING_DEFAULT_SCRL_VAL 10 -#endif - -/* Mouse move behavior */ -#define MOVE_Y(vert) ((vert) & 0xFFFF) -#define MOVE_Y_DECODE(encoded) (int16_t)((encoded) & 0x0000FFFF) -#define MOVE_X(hor) (((hor) & 0xFFFF) << 16) -#define MOVE_X_DECODE(encoded) (int16_t)(((encoded) & 0xFFFF0000) >> 16) - -#define MOVE(hor, vert) (MOVE_X(hor) + MOVE_Y(vert)) - -#define MOVE_UP MOVE_Y(-ZMK_POINTING_DEFAULT_MOVE_VAL) -#define MOVE_DOWN MOVE_Y(ZMK_POINTING_DEFAULT_MOVE_VAL) -#define MOVE_LEFT MOVE_X(-ZMK_POINTING_DEFAULT_MOVE_VAL) -#define MOVE_RIGHT MOVE_X(ZMK_POINTING_DEFAULT_MOVE_VAL) - -#define SCRL_UP MOVE_Y(ZMK_POINTING_DEFAULT_SCRL_VAL) -#define SCRL_DOWN MOVE_Y(-ZMK_POINTING_DEFAULT_SCRL_VAL) -#define SCRL_LEFT MOVE_X(-ZMK_POINTING_DEFAULT_SCRL_VAL) -#define SCRL_RIGHT MOVE_X(ZMK_POINTING_DEFAULT_SCRL_VAL) diff --git a/app/include/linker/zmk-behavior-local-id-map.ld b/app/include/linker/zmk-behavior-local-id-map.ld deleted file mode 100644 index c91e64c4..00000000 --- a/app/include/linker/zmk-behavior-local-id-map.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_RAM(zmk_behavior_local_id_map, 4) diff --git a/app/include/linker/zmk-rpc-event-mappers.ld b/app/include/linker/zmk-rpc-event-mappers.ld deleted file mode 100644 index bc5a0eea..00000000 --- a/app/include/linker/zmk-rpc-event-mappers.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_ROM(zmk_rpc_event_mapper, 4) diff --git a/app/include/linker/zmk-rpc-subsystem-handlers.ld b/app/include/linker/zmk-rpc-subsystem-handlers.ld deleted file mode 100644 index 286af1e4..00000000 --- a/app/include/linker/zmk-rpc-subsystem-handlers.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_ROM(zmk_rpc_subsystem_handler, 4) diff --git a/app/include/linker/zmk-rpc-subsystem-settings-reset.ld b/app/include/linker/zmk-rpc-subsystem-settings-reset.ld deleted file mode 100644 index 207d1c8f..00000000 --- a/app/include/linker/zmk-rpc-subsystem-settings-reset.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_ROM(zmk_rpc_subsystem_settings_reset, 4) diff --git a/app/include/linker/zmk-rpc-subsystems.ld b/app/include/linker/zmk-rpc-subsystems.ld deleted file mode 100644 index 9373154f..00000000 --- a/app/include/linker/zmk-rpc-subsystems.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_RAM(zmk_rpc_subsystem, 4) diff --git a/app/include/linker/zmk-rpc-transport.ld b/app/include/linker/zmk-rpc-transport.ld deleted file mode 100644 index d5178c3d..00000000 --- a/app/include/linker/zmk-rpc-transport.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_ROM(zmk_rpc_transport, 4) diff --git a/app/include/linker/zmk-split-transport-central.ld b/app/include/linker/zmk-split-transport-central.ld deleted file mode 100644 index 50456875..00000000 --- a/app/include/linker/zmk-split-transport-central.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_ROM(zmk_split_transport_central, 4) diff --git a/app/include/linker/zmk-split-transport-peripheral.ld b/app/include/linker/zmk-split-transport-peripheral.ld deleted file mode 100644 index e49e1156..00000000 --- a/app/include/linker/zmk-split-transport-peripheral.ld +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ITERABLE_SECTION_ROM(zmk_split_transport_peripheral, 4) diff --git a/app/include/zmk/activity.h b/app/include/zmk/activity.h index 2aad024a..9c858b15 100644 --- a/app/include/zmk/activity.h +++ b/app/include/zmk/activity.h @@ -8,4 +8,4 @@ enum zmk_activity_state { ZMK_ACTIVITY_ACTIVE, ZMK_ACTIVITY_IDLE, ZMK_ACTIVITY_SLEEP }; -enum zmk_activity_state zmk_activity_get_state(void); +enum zmk_activity_state zmk_activity_get_state(); \ No newline at end of file diff --git a/app/include/zmk/backlight.h b/app/include/zmk/backlight.h index af8fc76d..a0f52431 100644 --- a/app/include/zmk/backlight.h +++ b/app/include/zmk/backlight.h @@ -6,12 +6,12 @@ #pragma once -int zmk_backlight_on(void); -int zmk_backlight_off(void); -int zmk_backlight_toggle(void); -bool zmk_backlight_is_on(void); +int zmk_backlight_on(); +int zmk_backlight_off(); +int zmk_backlight_toggle(); +bool zmk_backlight_is_on(); int zmk_backlight_set_brt(uint8_t brightness); -uint8_t zmk_backlight_get_brt(void); +uint8_t zmk_backlight_get_brt(); uint8_t zmk_backlight_calc_brt(int direction); -uint8_t zmk_backlight_calc_brt_cycle(void); +uint8_t zmk_backlight_calc_brt_cycle(); diff --git a/app/include/zmk/battery.h b/app/include/zmk/battery.h index edc8fd7a..f62219c1 100644 --- a/app/include/zmk/battery.h +++ b/app/include/zmk/battery.h @@ -6,4 +6,4 @@ #pragma once -uint8_t zmk_battery_state_of_charge(void); +uint8_t zmk_battery_state_of_charge(); diff --git a/app/include/zmk/behavior.h b/app/include/zmk/behavior.h index 5028d320..31fb43ed 100644 --- a/app/include/zmk/behavior.h +++ b/app/include/zmk/behavior.h @@ -6,18 +6,11 @@ #pragma once -#include - #define ZMK_BEHAVIOR_OPAQUE 0 #define ZMK_BEHAVIOR_TRANSPARENT 1 -typedef uint16_t zmk_behavior_local_id_t; - struct zmk_behavior_binding { -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS) - zmk_behavior_local_id_t local_id; -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS) - const char *behavior_dev; + char *behavior_dev; uint32_t param1; uint32_t param2; }; @@ -26,54 +19,4 @@ struct zmk_behavior_binding_event { int layer; uint32_t position; int64_t timestamp; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - uint8_t source; -#endif -}; - -/** - * @brief Get a const struct device* for a behavior from its @p name field. - * - * @param name Behavior name to search for. - * - * @retval Pointer to the device structure for the behavior with the given name. - * @retval NULL if the behavior is not found or its initialization function failed. - * - * @note This is equivalent to device_get_binding(), except it only searches - * behavior devices, so it is faster and there is no chance of it returning an - * unrelated node which shares the same name as a behavior. - */ -const struct device *zmk_behavior_get_binding(const char *name); - -/** - * @brief Invoke a behavior given its binding and invoking event details. - * - * @param src_binding Behavior binding to invoke. - * @param event The binding event struct containing details of the event that invoked it. - * @param pressed Whether the binding is pressed or released. - * - * @retval 0 If successful. - * @retval Negative errno code if failure. - */ -int zmk_behavior_invoke_binding(const struct zmk_behavior_binding *src_binding, - struct zmk_behavior_binding_event event, bool pressed); - -/** - * @brief Get a local ID for a behavior from its @p name field. - * - * @param name Behavior name to search for. - * - * @retval The local ID value that can be used to reference the behavior later, across reboots. - * @retval UINT16_MAX if the behavior is not found or its initialization function failed. - */ -zmk_behavior_local_id_t zmk_behavior_get_local_id(const char *name); - -/** - * @brief Get a behavior name for a behavior from its @p local_id . - * - * @param local_id Behavior local ID used to search for the behavior - * - * @retval The name of the behavior that is associated with that local ID. - * @retval NULL if the behavior is not found or its initialization function failed. - */ -const char *zmk_behavior_find_behavior_name_from_local_id(zmk_behavior_local_id_t local_id); +}; \ No newline at end of file diff --git a/app/include/zmk/behavior_queue.h b/app/include/zmk/behavior_queue.h index b942bd28..307482e7 100644 --- a/app/include/zmk/behavior_queue.h +++ b/app/include/zmk/behavior_queue.h @@ -10,5 +10,5 @@ #include #include -int zmk_behavior_queue_add(const struct zmk_behavior_binding_event *event, - const struct zmk_behavior_binding behavior, bool press, uint32_t wait); +int zmk_behavior_queue_add(uint32_t position, const struct zmk_behavior_binding behavior, + bool press, uint32_t wait); diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 92b2107d..435fde49 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -10,7 +10,8 @@ #include #define ZMK_BLE_IS_CENTRAL \ - (IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) + (IS_ENABLED(CONFIG_ZMK_SPLIT) && IS_ENABLED(CONFIG_ZMK_BLE) && \ + IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) #if ZMK_BLE_IS_CENTRAL #define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS) @@ -19,30 +20,18 @@ #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif -void zmk_ble_clear_bonds(void); -int zmk_ble_prof_next(void); -int zmk_ble_prof_prev(void); +int zmk_ble_clear_bonds(); +int zmk_ble_prof_next(); +int zmk_ble_prof_prev(); int zmk_ble_prof_select(uint8_t index); -void zmk_ble_clear_all_bonds(void); -int zmk_ble_prof_disconnect(uint8_t index); -int zmk_ble_active_profile_index(void); -int zmk_ble_profile_index(const bt_addr_le_t *addr); -bt_addr_le_t *zmk_ble_profile_address(uint8_t index); +int zmk_ble_active_profile_index(); +bt_addr_le_t *zmk_ble_active_profile_addr(); +bool zmk_ble_active_profile_is_open(); +bool zmk_ble_active_profile_is_connected(); +char *zmk_ble_active_profile_name(); -bt_addr_le_t *zmk_ble_active_profile_addr(void); -struct bt_conn *zmk_ble_active_profile_conn(void); - -bool zmk_ble_profile_is_connected(uint8_t index); -bool zmk_ble_profile_is_open(uint8_t index); - -bool zmk_ble_active_profile_is_open(void); -bool zmk_ble_active_profile_is_connected(void); -char *zmk_ble_active_profile_name(void); - -int zmk_ble_unpair_all(void); - -int zmk_ble_set_device_name(char *name); +int zmk_ble_unpair_all(); #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr); diff --git a/app/include/zmk/combos.h b/app/include/zmk/combos.h deleted file mode 100644 index 644a2b53..00000000 --- a/app/include/zmk/combos.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -#define ZMK_COMBOS_UTIL_ONE(n) +1 - -#define ZMK_COMBOS_LEN \ - COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(zmk_combos), \ - (0 DT_FOREACH_CHILD_STATUS_OKAY(DT_INST(0, zmk_combos), ZMK_COMBOS_UTIL_ONE)), \ - (0)) diff --git a/app/include/zmk/display.h b/app/include/zmk/display.h index d206d357..45a4bee0 100644 --- a/app/include/zmk/display.h +++ b/app/include/zmk/display.h @@ -10,10 +10,10 @@ #pragma once -struct k_work_q *zmk_display_work_q(void); +struct k_work_q *zmk_display_work_q(); -bool zmk_display_is_initialized(void); -int zmk_display_init(void); +bool zmk_display_is_initialized(); +int zmk_display_init(); /** * @brief Macro to define a ZMK event listener that handles the thread safety of fetching @@ -23,12 +23,12 @@ int zmk_display_init(void); * * @param listener THe ZMK Event manager listener name. * @param state_type The struct/enum type used to store/transfer state. - * @param cb The callback to invoke in the display queue context to update the UI. Should be `void + * @param cb The callback to invoke in the dispaly queue context to update the UI. Should be `void * func(state_type)` signature. * @param state_func The callback function to invoke to fetch the updated state from ZMK core. * Should be `state type func(const zmk_event_t *eh)` signature. - * @retval listener##_init Generates a function `listener##_init` that should be called by the - * widget once ready to be updated. + * @retval listner##_init Generates a function `listener##_init` that should be called by the widget + * once ready to be updated. **/ #define ZMK_DISPLAY_WIDGET_LISTENER(listener, state_type, cb, state_func) \ K_MUTEX_DEFINE(listener##_mutex); \ diff --git a/app/include/zmk/endpoints.h b/app/include/zmk/endpoints.h index c10e387d..c5964ff8 100644 --- a/app/include/zmk/endpoints.h +++ b/app/include/zmk/endpoints.h @@ -14,8 +14,6 @@ */ #define ZMK_ENDPOINT_STR_LEN 10 -#define ZMK_ENDPOINT_NONE_COUNT 1 - #ifdef CONFIG_ZMK_USB #define ZMK_ENDPOINT_USB_COUNT 1 #else @@ -35,8 +33,7 @@ * Note that this value may change between firmware versions, so it should not * be used in any persistent storage. */ -#define ZMK_ENDPOINT_COUNT \ - (ZMK_ENDPOINT_NONE_COUNT + ZMK_ENDPOINT_USB_COUNT + ZMK_ENDPOINT_BLE_COUNT) +#define ZMK_ENDPOINT_COUNT (ZMK_ENDPOINT_USB_COUNT + ZMK_ENDPOINT_BLE_COUNT) bool zmk_endpoint_instance_eq(struct zmk_endpoint_instance a, struct zmk_endpoint_instance b); @@ -60,53 +57,15 @@ int zmk_endpoint_instance_to_str(struct zmk_endpoint_instance endpoint, char *st int zmk_endpoint_instance_to_index(struct zmk_endpoint_instance endpoint); /** - * Sets the preferred endpoint transport to use. - * - * If the preferred endpoint is not available, zmk_endpoint_get_selected() may - * automatically fall back to another transport. + * Sets the preferred endpoint transport to use. (If the preferred endpoint is + * not available, a different one may automatically be selected.) */ -int zmk_endpoint_set_preferred_transport(enum zmk_transport transport); - -enum zmk_transport zmk_endpoint_get_preferred_transport(void); +int zmk_endpoints_select_transport(enum zmk_transport transport); +int zmk_endpoints_toggle_transport(void); /** - * If the preferred endpoint transport is USB, sets it to BLE, else sets it to USB. + * Gets the currently-selected endpoint. */ -int zmk_endpoint_toggle_preferred_transport(void); +struct zmk_endpoint_instance zmk_endpoints_selected(void); -/** - * Gets the endpoint instance that will be preferred if it is connected. - */ -struct zmk_endpoint_instance zmk_endpoint_get_preferred(void); - -/** - * Gets the endpoint instance that is currently in use. - * - * This may differ from zmk_endpoint_get_preferred(), for example if the preferred - * endpoint is not connected, then this will return an instance for ZMK_TRANSPORT_NONE. - */ -struct zmk_endpoint_instance zmk_endpoint_get_selected(void); - -/** - * Returns whether the keyboard is connected to an endpoint. - * - * This is equivalent to zmk_endpoint_get_selected().transport != ZMK_TRANSPORT_NONE - */ -bool zmk_endpoint_is_connected(void); - -/** - * Sends the HID report for the given usage page to the selected endpoint. - */ -int zmk_endpoint_send_report(uint16_t usage_page); - -#if IS_ENABLED(CONFIG_ZMK_POINTING) -/** - * Sends the HID mouse report to the selected endpoint. - */ -int zmk_endpoint_send_mouse_report(); -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -/** - * Clears all HID reports for the selected endpoint. - */ -void zmk_endpoint_clear_reports(void); +int zmk_endpoints_send_report(uint16_t usage_page); diff --git a/app/include/zmk/endpoints_types.h b/app/include/zmk/endpoints_types.h index 5117544b..ea51c8aa 100644 --- a/app/include/zmk/endpoints_types.h +++ b/app/include/zmk/endpoints_types.h @@ -8,12 +8,10 @@ /** * The method by which data is sent. - * @note This type is used in settings. Do not modify existing values. */ enum zmk_transport { - ZMK_TRANSPORT_NONE = 0, - ZMK_TRANSPORT_USB = 1, - ZMK_TRANSPORT_BLE = 2, + ZMK_TRANSPORT_USB, + ZMK_TRANSPORT_BLE, }; /** diff --git a/app/include/zmk/event_manager.h b/app/include/zmk/event_manager.h index 0eb63ad7..aa9942ea 100644 --- a/app/include/zmk/event_manager.h +++ b/app/include/zmk/event_manager.h @@ -38,8 +38,7 @@ struct zmk_event_subscription { zmk_event_t header; \ struct event_type data; \ }; \ - struct event_type##_event copy_raised_##event_type(const struct event_type *ev); \ - int raise_##event_type(struct event_type); \ + struct event_type##_event *new_##event_type(struct event_type); \ struct event_type *as_##event_type(const zmk_event_t *eh); \ extern const struct zmk_event_type zmk_event_##event_type; @@ -47,14 +46,12 @@ struct zmk_event_subscription { const struct zmk_event_type zmk_event_##event_type = {.name = STRINGIFY(event_type)}; \ const struct zmk_event_type *zmk_event_ref_##event_type __used \ __attribute__((__section__(".event_type"))) = &zmk_event_##event_type; \ - struct event_type##_event copy_raised_##event_type(const struct event_type *ev) { \ - struct event_type##_event *outer = CONTAINER_OF(ev, struct event_type##_event, data); \ - return *outer; \ - }; \ - int raise_##event_type(struct event_type data) { \ - struct event_type##_event ev = {.data = data, \ - .header = {.event = &zmk_event_##event_type}}; \ - return ZMK_EVENT_RAISE(ev); \ + struct event_type##_event *new_##event_type(struct event_type data) { \ + struct event_type##_event *ev = \ + (struct event_type##_event *)k_malloc(sizeof(struct event_type##_event)); \ + ev->header.event = &zmk_event_##event_type; \ + ev->data = data; \ + return ev; \ }; \ struct event_type *as_##event_type(const zmk_event_t *eh) { \ return (eh->event == &zmk_event_##event_type) ? &((struct event_type##_event *)eh)->data \ @@ -64,7 +61,6 @@ struct zmk_event_subscription { #define ZMK_LISTENER(mod, cb) const struct zmk_listener zmk_listener_##mod = {.callback = cb}; #define ZMK_SUBSCRIPTION(mod, ev_type) \ - extern const struct zmk_listener zmk_listener_##mod; \ const Z_DECL_ALIGN(struct zmk_event_subscription) \ _CONCAT(_CONCAT(zmk_event_sub_, mod), ev_type) __used \ __attribute__((__section__(".event_subscription"))) = { \ @@ -72,14 +68,17 @@ struct zmk_event_subscription { .listener = &zmk_listener_##mod, \ }; -#define ZMK_EVENT_RAISE(ev) zmk_event_manager_raise(&(ev).header) +#define ZMK_EVENT_RAISE(ev) zmk_event_manager_raise((zmk_event_t *)ev); #define ZMK_EVENT_RAISE_AFTER(ev, mod) \ - zmk_event_manager_raise_after(&(ev).header, &zmk_listener_##mod) + zmk_event_manager_raise_after((zmk_event_t *)ev, &zmk_listener_##mod); -#define ZMK_EVENT_RAISE_AT(ev, mod) zmk_event_manager_raise_at(&(ev).header, &zmk_listener_##mod) +#define ZMK_EVENT_RAISE_AT(ev, mod) \ + zmk_event_manager_raise_at((zmk_event_t *)ev, &zmk_listener_##mod); -#define ZMK_EVENT_RELEASE(ev) zmk_event_manager_release(&(ev).header) +#define ZMK_EVENT_RELEASE(ev) zmk_event_manager_release((zmk_event_t *)ev); + +#define ZMK_EVENT_FREE(ev) k_free((void *)ev); int zmk_event_manager_raise(zmk_event_t *event); int zmk_event_manager_raise_after(zmk_event_t *event, const struct zmk_listener *listener); diff --git a/app/include/zmk/events/battery_state_changed.h b/app/include/zmk/events/battery_state_changed.h index 157490d9..5a8c625e 100644 --- a/app/include/zmk/events/battery_state_changed.h +++ b/app/include/zmk/events/battery_state_changed.h @@ -14,12 +14,4 @@ struct zmk_battery_state_changed { uint8_t state_of_charge; }; -ZMK_EVENT_DECLARE(zmk_battery_state_changed); - -struct zmk_peripheral_battery_state_changed { - uint8_t source; - // TODO: Other battery channels - uint8_t state_of_charge; -}; - -ZMK_EVENT_DECLARE(zmk_peripheral_battery_state_changed); \ No newline at end of file +ZMK_EVENT_DECLARE(zmk_battery_state_changed); \ No newline at end of file diff --git a/app/include/zmk/events/hid_indicators_changed.h b/app/include/zmk/events/hid_indicators_changed.h deleted file mode 100644 index b1fba797..00000000 --- a/app/include/zmk/events/hid_indicators_changed.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -struct zmk_hid_indicators_changed { - zmk_hid_indicators_t indicators; -}; - -ZMK_EVENT_DECLARE(zmk_hid_indicators_changed); diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 60ffcfc8..c3a3ed30 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -21,7 +21,7 @@ struct zmk_keycode_state_changed { ZMK_EVENT_DECLARE(zmk_keycode_state_changed); -static inline struct zmk_keycode_state_changed +static inline struct zmk_keycode_state_changed_event * zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) { uint16_t page = ZMK_HID_USAGE_PAGE(encoded); uint16_t id = ZMK_HID_USAGE_ID(encoded); @@ -38,16 +38,11 @@ zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t t implicit_modifiers = SELECT_MODS(encoded); } - return (struct zmk_keycode_state_changed){.usage_page = page, - .keycode = id, - .implicit_modifiers = implicit_modifiers, - .explicit_modifiers = explicit_modifiers, - .state = pressed, - .timestamp = timestamp}; -} - -static inline int raise_zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, - int64_t timestamp) { - return raise_zmk_keycode_state_changed( - zmk_keycode_state_changed_from_encoded(encoded, pressed, timestamp)); + return new_zmk_keycode_state_changed( + (struct zmk_keycode_state_changed){.usage_page = page, + .keycode = id, + .implicit_modifiers = implicit_modifiers, + .explicit_modifiers = explicit_modifiers, + .state = pressed, + .timestamp = timestamp}); } diff --git a/app/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 3bf5c870..405d1365 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -12,13 +12,13 @@ struct zmk_layer_state_changed { uint8_t layer; bool state; - bool locked; int64_t timestamp; }; ZMK_EVENT_DECLARE(zmk_layer_state_changed); -static inline int raise_layer_state_changed(uint8_t layer, bool state, bool locked) { - return raise_zmk_layer_state_changed((struct zmk_layer_state_changed){ - .layer = layer, .state = state, .locked = locked, .timestamp = k_uptime_get()}); +static inline struct zmk_layer_state_changed_event *create_layer_state_changed(uint8_t layer, + bool state) { + return new_zmk_layer_state_changed((struct zmk_layer_state_changed){ + .layer = layer, .state = state, .timestamp = k_uptime_get()}); } diff --git a/app/include/zmk/events/mouse_button_state_changed.h b/app/include/zmk/events/mouse_button_state_changed.h deleted file mode 100644 index 336b6ca9..00000000 --- a/app/include/zmk/events/mouse_button_state_changed.h +++ /dev/null @@ -1,26 +0,0 @@ - -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include -#include - -struct zmk_mouse_button_state_changed { - zmk_mouse_button_t buttons; - bool state; - int64_t timestamp; -}; - -ZMK_EVENT_DECLARE(zmk_mouse_button_state_changed); - -static inline int raise_zmk_mouse_button_state_changed_from_encoded(uint32_t encoded, bool pressed, - int64_t timestamp) { - return raise_zmk_mouse_button_state_changed((struct zmk_mouse_button_state_changed){ - .buttons = ZMK_HID_USAGE_ID(encoded), .state = pressed, .timestamp = timestamp}); -} diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 962180e7..afe92101 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -6,42 +6,14 @@ #pragma once -#include - #include #include #include -#if IS_ENABLED(CONFIG_ZMK_POINTING) -#include -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - #include #include -#if IS_ENABLED(CONFIG_ZMK_HID_KEYBOARD_NKRO_EXTENDED_REPORT) -#define ZMK_HID_KEYBOARD_NKRO_MAX_USAGE HID_USAGE_KEY_KEYBOARD_LANG8 -#else #define ZMK_HID_KEYBOARD_NKRO_MAX_USAGE HID_USAGE_KEY_KEYPAD_EQUAL -#endif - -#if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC) -#define ZMK_HID_CONSUMER_MAX_USAGE 0xFF -#elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL) -#define ZMK_HID_CONSUMER_MAX_USAGE 0xFFF -#else -#error "Unknown consumer report usages configuration" -#endif - -#if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) -#define ZMK_HID_KEYBOARD_MAX_USAGE ZMK_HID_KEYBOARD_NKRO_MAX_USAGE -#elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) -#define ZMK_HID_KEYBOARD_MAX_USAGE 0xFF -#else -#error "Unknown keyboard report usages configuration" -#endif - -#define ZMK_HID_MOUSE_NUM_BUTTONS 0x05 // See https://www.usb.org/sites/default/files/hid1_11.pdf section 6.2.2.4 Main Items @@ -73,33 +45,7 @@ #define ZMK_HID_MAIN_VAL_BUFFERED_BYTES (0x01 << 8) #define ZMK_HID_REPORT_ID_KEYBOARD 0x01 -#define ZMK_HID_REPORT_ID_LEDS 0x01 #define ZMK_HID_REPORT_ID_CONSUMER 0x02 -#define ZMK_HID_REPORT_ID_MOUSE 0x03 - -#ifndef HID_ITEM_TAG_PUSH -#define HID_ITEM_TAG_PUSH 0xA -#endif - -#ifndef HID_ITEM_TAG_POP -#define HID_ITEM_TAG_POP 0xB -#endif - -#define HID_PUSH HID_ITEM(HID_ITEM_TAG_PUSH, HID_ITEM_TYPE_GLOBAL, 0) - -#define HID_POP HID_ITEM(HID_ITEM_TAG_POP, HID_ITEM_TYPE_GLOBAL, 0) - -#ifndef HID_PHYSICAL_MIN8 -#define HID_PHYSICAL_MIN8(a) HID_ITEM(HID_ITEM_TAG_PHYSICAL_MIN, HID_ITEM_TYPE_GLOBAL, 1), a -#endif - -#ifndef HID_PHYSICAL_MAX8 -#define HID_PHYSICAL_MAX8(a) HID_ITEM(HID_ITEM_TAG_PHYSICAL_MAX, HID_ITEM_TYPE_GLOBAL, 1), a -#endif - -#define HID_USAGE16(a, b) HID_ITEM(HID_ITEM_TAG_USAGE, HID_ITEM_TYPE_LOCAL, 2), a, b - -#define HID_USAGE16_SINGLE(a) HID_USAGE16((a & 0xFF), ((a >> 8) & 0xFF)) static const uint8_t zmk_hid_report_desc[] = { HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), @@ -121,22 +67,6 @@ static const uint8_t zmk_hid_report_desc[] = { HID_REPORT_COUNT(0x01), HID_INPUT(ZMK_HID_MAIN_VAL_CONST | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - - HID_USAGE_PAGE(HID_USAGE_LED), - HID_USAGE_MIN8(HID_USAGE_LED_NUM_LOCK), - HID_USAGE_MAX8(HID_USAGE_LED_KANA), - HID_REPORT_SIZE(0x01), - HID_REPORT_COUNT(0x05), - HID_OUTPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), - - HID_USAGE_PAGE(HID_USAGE_LED), - HID_REPORT_SIZE(0x03), - HID_REPORT_COUNT(0x01), - HID_OUTPUT(ZMK_HID_MAIN_VAL_CONST | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), - -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - HID_USAGE_PAGE(HID_USAGE_KEY), #if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) @@ -184,75 +114,6 @@ static const uint8_t zmk_hid_report_desc[] = { HID_REPORT_COUNT(CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE), HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_ARRAY | ZMK_HID_MAIN_VAL_ABS), HID_END_COLLECTION, - -#if IS_ENABLED(CONFIG_ZMK_POINTING) - HID_USAGE_PAGE(HID_USAGE_GD), - HID_USAGE(HID_USAGE_GD_MOUSE), - HID_COLLECTION(HID_COLLECTION_APPLICATION), - HID_REPORT_ID(ZMK_HID_REPORT_ID_MOUSE), - HID_USAGE(HID_USAGE_GD_POINTER), - HID_COLLECTION(HID_COLLECTION_PHYSICAL), - HID_USAGE_PAGE(HID_USAGE_BUTTON), - HID_USAGE_MIN8(0x1), - HID_USAGE_MAX8(ZMK_HID_MOUSE_NUM_BUTTONS), - HID_LOGICAL_MIN8(0x00), - HID_LOGICAL_MAX8(0x01), - HID_REPORT_SIZE(0x01), - HID_REPORT_COUNT(0x5), - HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), - // Constant padding for the last 3 bits. - HID_REPORT_SIZE(0x03), - HID_REPORT_COUNT(0x01), - HID_INPUT(ZMK_HID_MAIN_VAL_CONST | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), - // Some OSes ignore pointer devices without X/Y data. - HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), - HID_USAGE(HID_USAGE_GD_X), - HID_USAGE(HID_USAGE_GD_Y), - HID_LOGICAL_MIN16(0x00, 0x80), - HID_LOGICAL_MAX16(0xFF, 0x7F), - HID_REPORT_SIZE(0x10), - HID_REPORT_COUNT(0x02), - HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_REL), - HID_COLLECTION(HID_COLLECTION_LOGICAL), -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - HID_USAGE(HID_USAGE_GD_RESOLUTION_MULTIPLIER), - HID_LOGICAL_MIN8(0x00), - HID_LOGICAL_MAX8(0x0F), - HID_PHYSICAL_MIN8(0x01), - HID_PHYSICAL_MAX8(0x10), - HID_REPORT_SIZE(0x04), - HID_REPORT_COUNT(0x01), - HID_PUSH, - HID_FEATURE(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - HID_USAGE(HID_USAGE_GD_WHEEL), - HID_LOGICAL_MIN16(0x00, 0x80), - HID_LOGICAL_MAX16(0xFF, 0x7F), - HID_PHYSICAL_MIN8(0x00), - HID_PHYSICAL_MAX8(0x00), - HID_REPORT_SIZE(0x10), - HID_REPORT_COUNT(0x01), - HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_REL), - HID_END_COLLECTION, - HID_COLLECTION(HID_COLLECTION_LOGICAL), -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - HID_USAGE(HID_USAGE_GD_RESOLUTION_MULTIPLIER), - HID_POP, - HID_FEATURE(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - HID_USAGE_PAGE(HID_USAGE_CONSUMER), - HID_USAGE16_SINGLE(HID_USAGE_CONSUMER_AC_PAN), - HID_LOGICAL_MIN16(0x00, 0x80), - HID_LOGICAL_MAX16(0xFF, 0x7F), - HID_PHYSICAL_MIN8(0x00), - HID_PHYSICAL_MAX8(0x00), - HID_REPORT_SIZE(0x10), - HID_REPORT_COUNT(0x01), - HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_REL), - HID_END_COLLECTION, - HID_END_COLLECTION, - HID_END_COLLECTION, -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) }; #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) @@ -278,7 +139,7 @@ struct zmk_hid_keyboard_report_body { zmk_mod_flags_t modifiers; uint8_t _reserved; #if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) - uint8_t keys[DIV_ROUND_UP(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1, 8)]; + uint8_t keys[(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1) / 8]; #elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) uint8_t keys[CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE]; #endif @@ -289,15 +150,6 @@ struct zmk_hid_keyboard_report { struct zmk_hid_keyboard_report_body body; } __packed; -struct zmk_hid_led_report_body { - uint8_t leds; -} __packed; - -struct zmk_hid_led_report { - uint8_t report_id; - struct zmk_hid_led_report_body body; -} __packed; - struct zmk_hid_consumer_report_body { #if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC) uint8_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE]; @@ -311,37 +163,7 @@ struct zmk_hid_consumer_report { struct zmk_hid_consumer_report_body body; } __packed; -#if IS_ENABLED(CONFIG_ZMK_POINTING) -struct zmk_hid_mouse_report_body { - zmk_mouse_button_flags_t buttons; - int16_t d_x; - int16_t d_y; - int16_t d_scroll_y; - int16_t d_scroll_x; -} __packed; - -struct zmk_hid_mouse_report { - uint8_t report_id; - struct zmk_hid_mouse_report_body body; -} __packed; - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -struct zmk_hid_mouse_resolution_feature_report_body { - uint8_t wheel_res : 4; - uint8_t hwheel_res : 4; -} __packed; - -struct zmk_hid_mouse_resolution_feature_report { - uint8_t report_id; - struct zmk_hid_mouse_resolution_feature_report_body body; -} __packed; - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -zmk_mod_flags_t zmk_hid_get_explicit_mods(void); +zmk_mod_flags_t zmk_hid_get_explicit_mods(); int zmk_hid_register_mod(zmk_mod_t modifier); int zmk_hid_unregister_mod(zmk_mod_t modifier); bool zmk_hid_mod_is_pressed(zmk_mod_t modifier); @@ -349,44 +171,27 @@ bool zmk_hid_mod_is_pressed(zmk_mod_t modifier); int zmk_hid_register_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_unregister_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers); -int zmk_hid_implicit_modifiers_release(void); +int zmk_hid_implicit_modifiers_release(); int zmk_hid_masked_modifiers_set(zmk_mod_flags_t masked_modifiers); -int zmk_hid_masked_modifiers_clear(void); +int zmk_hid_masked_modifiers_clear(); int zmk_hid_keyboard_press(zmk_key_t key); int zmk_hid_keyboard_release(zmk_key_t key); -void zmk_hid_keyboard_clear(void); +void zmk_hid_keyboard_clear(); bool zmk_hid_keyboard_is_pressed(zmk_key_t key); int zmk_hid_consumer_press(zmk_key_t key); int zmk_hid_consumer_release(zmk_key_t key); -void zmk_hid_consumer_clear(void); +void zmk_hid_consumer_clear(); bool zmk_hid_consumer_is_pressed(zmk_key_t key); int zmk_hid_press(uint32_t usage); int zmk_hid_release(uint32_t usage); bool zmk_hid_is_pressed(uint32_t usage); -#if IS_ENABLED(CONFIG_ZMK_POINTING) -int zmk_hid_mouse_button_press(zmk_mouse_button_t button); -int zmk_hid_mouse_button_release(zmk_mouse_button_t button); -int zmk_hid_mouse_buttons_press(zmk_mouse_button_flags_t buttons); -int zmk_hid_mouse_buttons_release(zmk_mouse_button_flags_t buttons); -void zmk_hid_mouse_movement_set(int16_t x, int16_t y); -void zmk_hid_mouse_scroll_set(int16_t x, int16_t y); -void zmk_hid_mouse_movement_update(int16_t x, int16_t y); -void zmk_hid_mouse_scroll_update(int16_t x, int16_t y); -void zmk_hid_mouse_clear(void); - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(void); -struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(void); +struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(); +struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(); #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) zmk_hid_boot_report_t *zmk_hid_get_boot_report(); #endif - -#if IS_ENABLED(CONFIG_ZMK_POINTING) -struct zmk_hid_mouse_report *zmk_hid_get_mouse_report(); -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) diff --git a/app/include/zmk/hid_indicators.h b/app/include/zmk/hid_indicators.h deleted file mode 100644 index 7c7b89f5..00000000 --- a/app/include/zmk/hid_indicators.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include -#include - -zmk_hid_indicators_t zmk_hid_indicators_get_current_profile(void); -zmk_hid_indicators_t zmk_hid_indicators_get_profile(struct zmk_endpoint_instance endpoint); -void zmk_hid_indicators_set_profile(zmk_hid_indicators_t indicators, - struct zmk_endpoint_instance endpoint); - -void zmk_hid_indicators_process_report(struct zmk_hid_led_report_body *report, - struct zmk_endpoint_instance endpoint); diff --git a/app/include/zmk/hid_indicators_types.h b/app/include/zmk/hid_indicators_types.h deleted file mode 100644 index 43bcf3c5..00000000 --- a/app/include/zmk/hid_indicators_types.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -typedef uint8_t zmk_hid_indicators_t; diff --git a/app/include/zmk/hog.h b/app/include/zmk/hog.h index 0b79decb..7523fb66 100644 --- a/app/include/zmk/hog.h +++ b/app/include/zmk/hog.h @@ -9,9 +9,7 @@ #include #include +int zmk_hog_init(); + int zmk_hog_send_keyboard_report(struct zmk_hid_keyboard_report_body *body); int zmk_hog_send_consumer_report(struct zmk_hid_consumer_report_body *body); - -#if IS_ENABLED(CONFIG_ZMK_POINTING) -int zmk_hog_send_mouse_report(struct zmk_hid_mouse_report_body *body); -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) diff --git a/app/include/zmk/input.h b/app/include/zmk/input.h deleted file mode 100644 index b1cbae6f..00000000 --- a/app/include/zmk/input.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -struct zmk_input_explicit_code { - uint8_t type; - uint16_t code; -}; diff --git a/app/include/zmk/input_listeners.h b/app/include/zmk/input_listeners.h deleted file mode 100644 index 1a1cdfb9..00000000 --- a/app/include/zmk/input_listeners.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -#define ZMK_INPUT_LISTENERS_UTIL_ONE(n) 1 + - -#define ZMK_INPUT_LISTENERS_LEN \ - (DT_FOREACH_STATUS_OKAY(zmk_input_listener, ZMK_INPUT_LISTENERS_UTIL_ONE) 0) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 26fd2d16..9ce140bf 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -7,88 +7,29 @@ #pragma once #include -#include -#include - -#define ZMK_KEYMAP_LAYERS_FOREACH(_fn) \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING), \ - (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), _fn)), \ - (DT_FOREACH_CHILD_STATUS_OKAY(DT_INST(0, zmk_keymap), _fn))) - -#define ZMK_KEYMAP_LAYERS_FOREACH_SEP(_fn, _sep) \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING), \ - (DT_FOREACH_CHILD_SEP(DT_INST(0, zmk_keymap), _fn, _sep)), \ - (DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_INST(0, zmk_keymap), _fn, _sep))) #define ZMK_LAYER_CHILD_LEN_PLUS_ONE(node) 1 + -#define ZMK_KEYMAP_LAYERS_LEN (ZMK_KEYMAP_LAYERS_FOREACH(ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0) - -/** - * @brief A layer ID is a stable identifier to refer to a layer, regardless of ordering. - */ -typedef uint8_t zmk_keymap_layer_id_t; - -/** - * @brief A way to return/reference a missing or invalid layer ID - */ -#define ZMK_KEYMAP_LAYER_ID_INVAL UINT8_MAX - -/** - * @brief A layer index is a identifier to refer layer at a particular position in the order. - */ -typedef uint8_t zmk_keymap_layer_index_t; +#define ZMK_KEYMAP_LAYERS_LEN \ + (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0) typedef uint32_t zmk_keymap_layers_state_t; -zmk_keymap_layer_id_t zmk_keymap_layer_index_to_id(zmk_keymap_layer_index_t layer_index); - -zmk_keymap_layer_id_t zmk_keymap_layer_default(void); -zmk_keymap_layers_state_t zmk_keymap_layer_state(void); -zmk_keymap_layers_state_t zmk_keymap_layer_locks(void); -bool zmk_keymap_layer_active(zmk_keymap_layer_id_t layer); -bool zmk_keymap_layer_locked(zmk_keymap_layer_id_t layer); -zmk_keymap_layer_index_t zmk_keymap_highest_layer_active(void); -int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer, bool locking); -int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer, bool locking); -int zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer, bool locking); -int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer, bool locking); -const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer); - -const struct zmk_behavior_binding *zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer, - uint16_t binding_idx); -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint16_t binding_idx, - const struct zmk_behavior_binding binding); - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -int zmk_keymap_add_layer(void); -int zmk_keymap_remove_layer(zmk_keymap_layer_index_t index); -int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t at_index); - -int zmk_keymap_move_layer(zmk_keymap_layer_index_t start_idx, zmk_keymap_layer_index_t dest_idx); - -int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size); - -#endif - -/** - * @brief Check if there are any unsaved keymap changes. - * - * @retval 0 if there are no changes. - * @retval 1 if there are changes. - */ -int zmk_keymap_check_unsaved_changes(void); - -int zmk_keymap_save_changes(void); -int zmk_keymap_discard_changes(void); -int zmk_keymap_reset_settings(void); +uint8_t zmk_keymap_layer_default(); +zmk_keymap_layers_state_t zmk_keymap_layer_state(); +bool zmk_keymap_layer_active(uint8_t layer); +uint8_t zmk_keymap_highest_layer_active(); +int zmk_keymap_layer_activate(uint8_t layer); +int zmk_keymap_layer_deactivate(uint8_t layer); +int zmk_keymap_layer_toggle(uint8_t layer); +int zmk_keymap_layer_to(uint8_t layer); +const char *zmk_keymap_layer_label(uint8_t layer); int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pressed, int64_t timestamp); #define ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) \ { \ - .behavior_dev = DEVICE_DT_NAME(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(drv_inst, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param2), (0), \ diff --git a/app/include/zmk/kscan.h b/app/include/zmk/kscan.h new file mode 100644 index 00000000..eebe41e7 --- /dev/null +++ b/app/include/zmk/kscan.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +int zmk_kscan_init(const struct device *dev); diff --git a/app/include/zmk/matrix.h b/app/include/zmk/matrix.h index 436f86f5..5f8cd7d7 100644 --- a/app/include/zmk/matrix.h +++ b/app/include/zmk/matrix.h @@ -9,21 +9,15 @@ #include #define ZMK_MATRIX_NODE_ID DT_CHOSEN(zmk_kscan) -#define ZMK_MATRIX_HAS_TRANSFORM DT_HAS_CHOSEN(zmk_matrix_transform) -#if DT_HAS_COMPAT_STATUS_OKAY(zmk_physical_layout) - -#define ZMK_PHYSICAL_LAYOUT_BYTE_ARRAY(node_id) \ - uint8_t _CONCAT(prop_, node_id)[DT_PROP_LEN(DT_PHANDLE(node_id, transform), map)]; - -#define ZMK_KEYMAP_LEN \ - sizeof(union {DT_FOREACH_STATUS_OKAY(zmk_physical_layout, ZMK_PHYSICAL_LAYOUT_BYTE_ARRAY)}) - -#elif ZMK_MATRIX_HAS_TRANSFORM +#if DT_HAS_CHOSEN(zmk_matrix_transform) #define ZMK_KEYMAP_TRANSFORM_NODE DT_CHOSEN(zmk_matrix_transform) #define ZMK_KEYMAP_LEN DT_PROP_LEN(ZMK_KEYMAP_TRANSFORM_NODE, map) +#define ZMK_MATRIX_ROWS DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, rows) +#define ZMK_MATRIX_COLS DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, columns) + #else /* DT_HAS_CHOSEN(zmk_matrix_transform) */ #if DT_NODE_HAS_PROP(ZMK_MATRIX_NODE_ID, row_gpios) diff --git a/app/include/zmk/matrix_transform.h b/app/include/zmk/matrix_transform.h index 42a98151..ffd3e3f1 100644 --- a/app/include/zmk/matrix_transform.h +++ b/app/include/zmk/matrix_transform.h @@ -6,16 +6,4 @@ #pragma once -#include - -typedef const struct zmk_matrix_transform *zmk_matrix_transform_t; - -#define ZMK_MATRIX_TRANSFORM_DEFAULT_EXTERN() \ - extern const struct zmk_matrix_transform zmk_matrix_transform_default -#define ZMK_MATRIX_TRANSFORM_EXTERN(node_id) \ - extern const struct zmk_matrix_transform _CONCAT(zmk_matrix_transform_, node_id) - -#define ZMK_MATRIX_TRANSFORM_T_FOR_NODE(node_id) &_CONCAT(zmk_matrix_transform_, node_id) - -int32_t zmk_matrix_transform_row_column_to_position(zmk_matrix_transform_t mt, uint32_t row, - uint32_t column); +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file diff --git a/app/include/zmk/physical_layouts.h b/app/include/zmk/physical_layouts.h deleted file mode 100644 index e28c194f..00000000 --- a/app/include/zmk/physical_layouts.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include -#include - -struct zmk_physical_layout_selection_changed { - uint8_t selection; -}; - -ZMK_EVENT_DECLARE(zmk_physical_layout_selection_changed); - -struct zmk_key_physical_attrs { - int16_t width; - int16_t height; - int16_t x; - int16_t y; -#if IS_ENABLED(CONFIG_ZMK_PHYSICAL_LAYOUT_KEY_ROTATION) - int16_t rx; - int16_t ry; - int16_t r; -#endif -}; - -struct zmk_physical_layout { - const char *display_name; - - zmk_matrix_transform_t matrix_transform; - const struct device *kscan; -#if IS_ENABLED(CONFIG_INPUT) - const struct device *input; -#endif - - const struct zmk_key_physical_attrs *keys; - size_t keys_len; -}; - -#define ZMK_PHYS_LAYOUTS_FOREACH(_ref) STRUCT_SECTION_FOREACH(zmk_physical_layout, _ref) - -size_t zmk_physical_layouts_get_list(struct zmk_physical_layout const *const **phys_layouts); - -int zmk_physical_layouts_select(uint8_t index); -int zmk_physical_layouts_get_selected(void); - -int zmk_physical_layouts_check_unsaved_selection(void); -int zmk_physical_layouts_save_selected(void); -int zmk_physical_layouts_revert_selected(void); - -int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, size_t map_size, - uint32_t map[map_size]); - -/** - * @brief Get a pointer to a position map array for mapping a key position in the selected - * physical layout to the stock/chosen physical layout - * - * @retval a negative errno value in the case of errors - * @retval a positive length of the position map array that map is updated to point to. - */ -int zmk_physical_layouts_get_selected_to_stock_position_map(uint32_t const **map); \ No newline at end of file diff --git a/app/include/zmk/pm.h b/app/include/zmk/pm.h deleted file mode 100644 index a733856d..00000000 --- a/app/include/zmk/pm.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -int zmk_pm_suspend_devices(void); -void zmk_pm_resume_devices(void); - -int zmk_pm_soft_off(void); \ No newline at end of file diff --git a/app/include/zmk/pointing.h b/app/include/zmk/pointing.h deleted file mode 100644 index 1bd53d63..00000000 --- a/app/include/zmk/pointing.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -typedef uint8_t zmk_mouse_button_flags_t; -typedef uint16_t zmk_mouse_button_t; diff --git a/app/include/zmk/pointing/input_split.h b/app/include/zmk/pointing/input_split.h deleted file mode 100644 index 235ea495..00000000 --- a/app/include/zmk/pointing/input_split.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -int zmk_input_split_report_peripheral_event(uint8_t reg, uint8_t type, uint16_t code, int32_t value, - bool sync); -int zmk_input_split_peripheral_disconnected(uint8_t reg); \ No newline at end of file diff --git a/app/include/zmk/pointing/resolution_multipliers.h b/app/include/zmk/pointing/resolution_multipliers.h deleted file mode 100644 index 1e50b781..00000000 --- a/app/include/zmk/pointing/resolution_multipliers.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -struct zmk_pointing_resolution_multipliers { - uint8_t wheel; - uint8_t hor_wheel; -}; - -struct zmk_pointing_resolution_multipliers -zmk_pointing_resolution_multipliers_get_current_profile(void); -struct zmk_pointing_resolution_multipliers -zmk_pointing_resolution_multipliers_get_profile(struct zmk_endpoint_instance endpoint); -void zmk_pointing_resolution_multipliers_set_profile( - struct zmk_pointing_resolution_multipliers multipliers, struct zmk_endpoint_instance endpoint); - -void zmk_pointing_resolution_multipliers_process_report( - struct zmk_hid_mouse_resolution_feature_report_body *report, - struct zmk_endpoint_instance endpoint); diff --git a/app/include/zmk/rgb_underglow.h b/app/include/zmk/rgb_underglow.h index be0ef252..797f0b19 100644 --- a/app/include/zmk/rgb_underglow.h +++ b/app/include/zmk/rgb_underglow.h @@ -12,10 +12,10 @@ struct zmk_led_hsb { uint8_t b; }; -int zmk_rgb_underglow_toggle(void); +int zmk_rgb_underglow_toggle(); int zmk_rgb_underglow_get_state(bool *state); -int zmk_rgb_underglow_on(void); -int zmk_rgb_underglow_off(void); +int zmk_rgb_underglow_on(); +int zmk_rgb_underglow_off(); int zmk_rgb_underglow_cycle_effect(int direction); int zmk_rgb_underglow_calc_effect(int direction); int zmk_rgb_underglow_select_effect(int effect); @@ -26,4 +26,4 @@ int zmk_rgb_underglow_change_hue(int direction); int zmk_rgb_underglow_change_sat(int direction); int zmk_rgb_underglow_change_brt(int direction); int zmk_rgb_underglow_change_spd(int direction); -int zmk_rgb_underglow_set_hsb(struct zmk_led_hsb color); +int zmk_rgb_underglow_set_hsb(struct zmk_led_hsb color); \ No newline at end of file diff --git a/app/include/zmk/settings.h b/app/include/zmk/settings.h deleted file mode 100644 index 5567d61b..00000000 --- a/app/include/zmk/settings.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -/** - * Erases all saved settings. - * - * @note This does not automatically update any code using Zephyr's settings - * subsystem. This should typically be followed by a call to sys_reboot(). - */ -int zmk_settings_erase(void); diff --git a/app/include/zmk/split/bluetooth/central.h b/app/include/zmk/split/bluetooth/central.h new file mode 100644 index 00000000..443d9b1b --- /dev/null +++ b/app/include/zmk/split/bluetooth/central.h @@ -0,0 +1,8 @@ + +#pragma once + +#include +#include + +int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, bool state); \ No newline at end of file diff --git a/app/include/zmk/split/bluetooth/peripheral.h b/app/include/zmk/split/bluetooth/peripheral.h index 44ac8062..a650508a 100644 --- a/app/include/zmk/split/bluetooth/peripheral.h +++ b/app/include/zmk/split/bluetooth/peripheral.h @@ -6,6 +6,4 @@ #pragma once -bool zmk_split_bt_peripheral_is_connected(void); - -bool zmk_split_bt_peripheral_is_bonded(void); \ No newline at end of file +bool zmk_split_bt_peripheral_is_connected(void); \ No newline at end of file diff --git a/app/include/zmk/split/bluetooth/service.h b/app/include/zmk/split/bluetooth/service.h index 931385be..112cd552 100644 --- a/app/include/zmk/split/bluetooth/service.h +++ b/app/include/zmk/split/bluetooth/service.h @@ -20,7 +20,6 @@ struct sensor_event { struct zmk_split_run_behavior_data { uint8_t position; - uint8_t source; uint8_t state; uint32_t param1; uint32_t param2; @@ -31,9 +30,8 @@ struct zmk_split_run_behavior_payload { char behavior_dev[ZMK_SPLIT_RUN_BEHAVIOR_DEV_LEN]; } __packed; -struct zmk_split_input_event_payload { - uint8_t type; - uint16_t code; - uint32_t value; - uint8_t sync; -} __packed; +int zmk_split_bt_position_pressed(uint8_t position); +int zmk_split_bt_position_released(uint8_t position); +int zmk_split_bt_sensor_triggered(uint8_t sensor_index, + const struct zmk_sensor_channel_data channel_data[], + size_t channel_data_size); diff --git a/app/include/zmk/split/bluetooth/uuid.h b/app/include/zmk/split/bluetooth/uuid.h index c9a63efa..c38131dd 100644 --- a/app/include/zmk/split/bluetooth/uuid.h +++ b/app/include/zmk/split/bluetooth/uuid.h @@ -17,6 +17,3 @@ #define ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID ZMK_BT_SPLIT_UUID(0x00000001) #define ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID ZMK_BT_SPLIT_UUID(0x00000002) #define ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID ZMK_BT_SPLIT_UUID(0x00000003) -#define ZMK_SPLIT_BT_UPDATE_HID_INDICATORS_UUID ZMK_BT_SPLIT_UUID(0x00000004) -#define ZMK_SPLIT_BT_SELECT_PHYS_LAYOUT_UUID ZMK_BT_SPLIT_UUID(0x00000005) -#define ZMK_SPLIT_BT_INPUT_EVENT_UUID ZMK_BT_SPLIT_UUID(0x00000006) diff --git a/app/include/zmk/split/central.h b/app/include/zmk/split/central.h deleted file mode 100644 index ff971bfc..00000000 --- a/app/include/zmk/split/central.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) - -#include -#define BLE_PERIPHERAL_COUNT ZMK_SPLIT_BLE_PERIPHERAL_COUNT - -#else - -#define BLE_PERIPHERAL_COUNT 0 - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED) -#define WIRED_PERIPHERAL_COUNT 1 -#else -#define WIRED_PERIPHERAL_COUNT 0 -#endif - -#define ZMK_SPLIT_CENTRAL_PERIPHERAL_COUNT MAX(BLE_PERIPHERAL_COUNT, WIRED_PERIPHERAL_COUNT) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) -#include -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -int zmk_split_central_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, bool state); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -int zmk_split_central_update_hid_indicator(zmk_hid_indicators_t indicators); - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -int zmk_split_central_get_peripheral_battery_level(uint8_t source, uint8_t *level); - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) diff --git a/app/include/zmk/split/peripheral.h b/app/include/zmk/split/peripheral.h deleted file mode 100644 index 6fb2301c..00000000 --- a/app/include/zmk/split/peripheral.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -int zmk_split_peripheral_report_event(const struct zmk_split_transport_peripheral_event *event); diff --git a/app/include/zmk/split/transport/central.h b/app/include/zmk/split/transport/central.h deleted file mode 100644 index a6b819d1..00000000 --- a/app/include/zmk/split/transport/central.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -#include - -struct zmk_split_transport_central; - -typedef int (*zmk_split_transport_central_status_changed_cb_t)( - const struct zmk_split_transport_central *transport, struct zmk_split_transport_status status); - -typedef int (*zmk_split_transport_central_send_command_t)( - uint8_t source, struct zmk_split_transport_central_command cmd); -typedef int (*zmk_split_transport_central_get_available_source_ids_t)(uint8_t *sources); -typedef int (*zmk_split_transport_central_set_status_callback_t)( - zmk_split_transport_central_status_changed_cb_t cb); - -struct zmk_split_transport_central_api { - zmk_split_transport_central_send_command_t send_command; - zmk_split_transport_central_get_available_source_ids_t get_available_source_ids; - zmk_split_transport_set_enabled_t set_enabled; - zmk_split_transport_get_status_t get_status; - zmk_split_transport_central_set_status_callback_t set_status_callback; -}; - -struct zmk_split_transport_central { - const struct zmk_split_transport_central_api *api; -}; - -int zmk_split_transport_central_peripheral_event_handler( - const struct zmk_split_transport_central *transport, uint8_t source, - struct zmk_split_transport_peripheral_event ev); - -#define ZMK_SPLIT_TRANSPORT_CENTRAL_REGISTER(name, _api, priority) \ - STRUCT_SECTION_ITERABLE_NAMED(zmk_split_transport_central, _CONCAT(priority, _##name), \ - name) = { \ - .api = _api, \ - }; diff --git a/app/include/zmk/split/transport/peripheral.h b/app/include/zmk/split/transport/peripheral.h deleted file mode 100644 index fdc3943d..00000000 --- a/app/include/zmk/split/transport/peripheral.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -#include - -struct zmk_split_transport_peripheral; - -typedef int (*zmk_split_transport_peripheral_status_changed_cb_t)( - const struct zmk_split_transport_peripheral *transport, - struct zmk_split_transport_status status); - -typedef int (*zmk_split_transport_peripheral_report_event_callback_t)( - const struct zmk_split_transport_peripheral_event *event); -typedef int (*zmk_split_transport_peripheral_set_status_callback_t)( - zmk_split_transport_peripheral_status_changed_cb_t cb); - -struct zmk_split_transport_peripheral_api { - zmk_split_transport_peripheral_report_event_callback_t report_event; - zmk_split_transport_set_enabled_t set_enabled; - zmk_split_transport_get_status_t get_status; - zmk_split_transport_peripheral_set_status_callback_t set_status_callback; -}; - -struct zmk_split_transport_peripheral { - const struct zmk_split_transport_peripheral_api *api; -}; - -int zmk_split_transport_peripheral_command_handler( - const struct zmk_split_transport_peripheral *transport, - struct zmk_split_transport_central_command cmd); - -#define ZMK_SPLIT_TRANSPORT_PERIPHERAL_REGISTER(name, _api, priority) \ - STRUCT_SECTION_ITERABLE_NAMED(zmk_split_transport_peripheral, _CONCAT(priority, _##name), \ - name) = { \ - .api = _api, \ - }; diff --git a/app/include/zmk/split/transport/types.h b/app/include/zmk/split/transport/types.h deleted file mode 100644 index 1d6eb734..00000000 --- a/app/include/zmk/split/transport/types.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include -#include - -enum zmk_split_transport_connections_status { - ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED = 0, - ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_SOME_CONNECTED, - ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_ALL_CONNECTED, -}; - -struct zmk_split_transport_status { - bool available; - bool enabled; - enum zmk_split_transport_connections_status connections; -}; - -typedef struct zmk_split_transport_status (*zmk_split_transport_get_status_t)(void); -typedef int (*zmk_split_transport_set_enabled_t)(bool enabled); - -enum zmk_split_transport_peripheral_event_type { - ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT, - ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_SENSOR_EVENT, - ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_INPUT_EVENT, - ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT, -}; - -struct zmk_split_transport_peripheral_event { - enum zmk_split_transport_peripheral_event_type type; - - union { - struct { - uint8_t position; - uint8_t pressed; - } key_position_event; - - struct { - struct zmk_sensor_channel_data channel_data; - - uint8_t sensor_index; - } sensor_event; - - struct { - uint8_t reg; - uint8_t sync; - uint8_t type; - uint16_t code; - int32_t value; - } input_event; - - struct { - uint8_t level; - } battery_event; - } data; -} __packed; - -enum zmk_split_transport_central_command_type { - ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_POLL_EVENTS, - ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR, - ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_PHYSICAL_LAYOUT, - ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_HID_INDICATORS, -} __packed; - -struct zmk_split_transport_central_command { - enum zmk_split_transport_central_command_type type; - - union { - struct { - char behavior_dev[16]; - uint32_t param1, param2; - uint32_t position; - uint8_t event_source; - uint8_t state; - } invoke_behavior; - - struct { - uint8_t layout_idx; - } set_physical_layout; - - struct { - zmk_hid_indicators_t indicators; - } set_hid_indicators; - } data; -} __packed; \ No newline at end of file diff --git a/app/include/zmk/studio/core.h b/app/include/zmk/studio/core.h deleted file mode 100644 index a8fdc8ff..00000000 --- a/app/include/zmk/studio/core.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -enum zmk_studio_core_lock_state { - ZMK_STUDIO_CORE_LOCK_STATE_LOCKED = 0, - ZMK_STUDIO_CORE_LOCK_STATE_UNLOCKED = 1, -}; - -struct zmk_studio_core_lock_state_changed { - enum zmk_studio_core_lock_state state; -}; - -struct zmk_studio_core_unlock_requested {}; - -ZMK_EVENT_DECLARE(zmk_studio_core_lock_state_changed); - -enum zmk_studio_core_lock_state zmk_studio_core_get_lock_state(void); - -void zmk_studio_core_unlock(); -void zmk_studio_core_lock(); -void zmk_studio_core_initiate_unlock(); -void zmk_studio_core_complete_unlock(); - -void zmk_studio_core_reschedule_lock_timeout(); \ No newline at end of file diff --git a/app/include/zmk/studio/rpc.h b/app/include/zmk/studio/rpc.h deleted file mode 100644 index e223b7a5..00000000 --- a/app/include/zmk/studio/rpc.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -#include - -#include -#include -#include - -enum zmk_studio_rpc_handler_security { - ZMK_STUDIO_RPC_HANDLER_SECURED, - ZMK_STUDIO_RPC_HANDLER_UNSECURED, -}; - -struct zmk_studio_rpc_notification { - zmk_studio_Notification notification; -}; - -ZMK_EVENT_DECLARE(zmk_studio_rpc_notification); - -struct zmk_rpc_subsystem; - -typedef zmk_studio_Response(subsystem_func)(const struct zmk_rpc_subsystem *subsys, - const zmk_studio_Request *req); - -typedef zmk_studio_Response(rpc_func)(const zmk_studio_Request *neq); - -/** - * @brief An RPC subsystem is a cohesive collection of related RPCs. A specific RPC is identified by - * the pair or subsystem and request identifiers. This struct is the high level entity to - * aggregate all the possible handler functions for the request in the given subsystem. - */ -struct zmk_rpc_subsystem { - subsystem_func *func; - uint16_t handlers_start_index; - uint16_t handlers_end_index; - uint8_t subsystem_choice; -}; - -/** - * @brief An entry for a specific handler function in a given subsystem, including metadata - * indicating if the particular handler requires the device be unlock in order to be invoked. - */ -struct zmk_rpc_subsystem_handler { - rpc_func *func; - uint8_t subsystem_choice; - uint8_t request_choice; - enum zmk_studio_rpc_handler_security security; -}; - -typedef int (*zmk_rpc_subsystem_settings_reset_func)(void); - -struct zmk_rpc_subsystem_settings_reset { - zmk_rpc_subsystem_settings_reset_func callback; -}; - -/** - * @brief Generate a "meta" subsystem response indicating an "empty" response to an RPC request. - */ -#define ZMK_RPC_NO_RESPONSE() ZMK_RPC_RESPONSE(meta, no_response, true) - -/** - * @brief Generate a "meta" subsystem response with one of a few possible simple error responses. - * @see https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/meta.proto#L5 - */ -#define ZMK_RPC_SIMPLE_ERR(type) \ - ZMK_RPC_RESPONSE(meta, simple_error, zmk_meta_ErrorConditions_##type) - -/** - * @brief Register an RPC subsystem to aggregate handlers for request to that subsystem. - * @param prefix The identifier for the subsystem, e.g. `core`, `keymap`, etc. - * @see https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/studio.proto#L15 - */ -#define ZMK_RPC_SUBSYSTEM(prefix) \ - zmk_studio_Response subsystem_func_##prefix(const struct zmk_rpc_subsystem *subsys, \ - const zmk_studio_Request *req) { \ - uint8_t which_req = req->subsystem.prefix.which_request_type; \ - return zmk_rpc_subsystem_delegate_to_subs(subsys, req, which_req); \ - } \ - STRUCT_SECTION_ITERABLE(zmk_rpc_subsystem, prefix##_subsystem) = { \ - .func = subsystem_func_##prefix, \ - .subsystem_choice = zmk_studio_Request_##prefix##_tag, \ - }; - -/** - * @brief Register an RPC subsystem handler handler a specific request within the subsystem. - * @param prefix The identifier for the subsystem, e.g. `core`, `keymap`, etc. - * @param request_id The identifier for the request ID, e.g. `save_changes`. - * @param _secured Whether the handler requires the device be unlocked to allow invocation. - * - * @note A function with a name matching the request_id must be in-scope and will be used as the - * the callback handler. The function must have a signature of - * zmk_studio_Response (*func)(const zmk_studio_Request*) - */ -#define ZMK_RPC_SUBSYSTEM_HANDLER(prefix, request_id, _security) \ - STRUCT_SECTION_ITERABLE(zmk_rpc_subsystem_handler, \ - prefix##_subsystem_handler_##request_id) = { \ - .func = request_id, \ - .subsystem_choice = zmk_studio_Request_##prefix##_tag, \ - .request_choice = zmk_##prefix##_Request_##request_id##_tag, \ - .security = _security, \ - }; - -#define ZMK_RPC_SUBSYSTEM_SETTINGS_RESET(prefix, _callback) \ - STRUCT_SECTION_ITERABLE(zmk_rpc_subsystem_settings_reset, _##prefix##_settings_reset) = { \ - .callback = _callback, \ - }; - -#define ZMK_RPC_SUBSYSTEM_SETTINGS_RESET_FOREACH(_var) \ - STRUCT_SECTION_FOREACH(zmk_rpc_subsystem_settings_reset, _var) - -/** - * @brief Create a zmk_studio_Notification struct for the given subsystem and type, including - initialization of the inner fields. - * @param subsys The identifier for the subsystem, e.g. `core`, `keymap`, etc. - * @param _type The identifier for the notification type in that subsystem, e.g. - `unsaved_changes_status_changed`. - * - * @see example - https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/keymap.proto#L41C14-L41C44 - */ -#define ZMK_RPC_NOTIFICATION(subsys, _type, ...) \ - ((zmk_studio_Notification){ \ - .which_subsystem = zmk_studio_Notification_##subsys##_tag, \ - .subsystem = \ - { \ - .subsys = \ - { \ - .which_notification_type = zmk_##subsys##_Notification_##_type##_tag, \ - .notification_type = {._type = __VA_ARGS__}, \ - }, \ - }, \ - }) - -/** - * @brief Create a zmk_studio_Response struct for the given subsystem and type, including - initialization of the inner fields. - * @param subsys The identifier for the subsystem, e.g. `core`, `keymap`, etc. - * @param _type The identifier for the response type in that subsystem, e.g. `get_keymap`. - * - * @see example - https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/keymap.proto#L24 - */ -#define ZMK_RPC_RESPONSE(subsys, _type, ...) \ - ((zmk_studio_Response){ \ - .which_type = zmk_studio_Response_request_response_tag, \ - .type = \ - { \ - .request_response = \ - { \ - .which_subsystem = zmk_studio_RequestResponse_##subsys##_tag, \ - .subsystem = \ - { \ - .subsys = \ - { \ - .which_response_type = \ - zmk_##subsys##_Response_##_type##_tag, \ - .response_type = {._type = __VA_ARGS__}, \ - }, \ - }, \ - }, \ - }, \ - }) - -typedef int(zmk_rpc_event_mapper_cb)(const zmk_event_t *ev, zmk_studio_Notification *n); - -struct zmk_rpc_event_mapper { - zmk_rpc_event_mapper_cb *func; -}; - -/** - * @brief A single ZMK event listener is registered that will listen for events and map them to - * RPC notifications to be sent to the connected client. This macro adds additional - * subscriptions to that one single registered listener. - * @param _t The ZMK event type. - */ -#define ZMK_RPC_EVENT_MAPPER_ADD_LISTENER(_t) ZMK_SUBSCRIPTION(studio_rpc, _t) - -/** - * @brief Register a mapping function that can selectively map a given internal ZMK event type into - * a possible zmk_studio_Notification type. - * @param name A unique identifier for the mapper. Often a subsystem identifier like `core` is used. - * @param _func The `zmk_rpc_event_mapper_cb` function used to map the internal event type. - */ -#define ZMK_RPC_EVENT_MAPPER(name, _func, ...) \ - FOR_EACH_NONEMPTY_TERM(ZMK_RPC_EVENT_MAPPER_ADD_LISTENER, (;), __VA_ARGS__) \ - STRUCT_SECTION_ITERABLE(zmk_rpc_event_mapper, name) = { \ - .func = _func, \ - }; - -typedef int (*zmk_rpc_rx_start_stop_func)(void); - -typedef void (*zmk_rpc_tx_buffer_notify_func)(struct ring_buf *buf, size_t added, bool message_done, - void *user_data); -typedef void *(*zmk_rpc_tx_user_data_func)(void); - -struct zmk_rpc_transport { - enum zmk_transport transport; - - zmk_rpc_tx_user_data_func tx_user_data; - zmk_rpc_tx_buffer_notify_func tx_notify; - zmk_rpc_rx_start_stop_func rx_start; - zmk_rpc_rx_start_stop_func rx_stop; -}; - -zmk_studio_Response zmk_rpc_subsystem_delegate_to_subs(const struct zmk_rpc_subsystem *subsys, - const zmk_studio_Request *req, - uint8_t which_req); - -struct ring_buf *zmk_rpc_get_tx_buf(void); -struct ring_buf *zmk_rpc_get_rx_buf(void); -void zmk_rpc_rx_notify(void); - -#define ZMK_RPC_TRANSPORT(name, _transport, _rx_start, _rx_stop, _tx_user_data, _tx_notify) \ - STRUCT_SECTION_ITERABLE(zmk_rpc_transport, name) = { \ - .transport = _transport, \ - .rx_start = _rx_start, \ - .rx_stop = _rx_stop, \ - .tx_user_data = _tx_user_data, \ - .tx_notify = _tx_notify, \ - } diff --git a/app/include/zmk/usb.h b/app/include/zmk/usb.h index a5e5089f..9e92a836 100644 --- a/app/include/zmk/usb.h +++ b/app/include/zmk/usb.h @@ -18,10 +18,8 @@ enum zmk_usb_conn_state { ZMK_USB_CONN_HID, }; -enum usb_dc_status_code zmk_usb_get_status(void); -enum zmk_usb_conn_state zmk_usb_get_conn_state(void); +enum usb_dc_status_code zmk_usb_get_status(); +enum zmk_usb_conn_state zmk_usb_get_conn_state(); -static inline bool zmk_usb_is_powered(void) { - return zmk_usb_get_conn_state() != ZMK_USB_CONN_NONE; -} -bool zmk_usb_is_hid_ready(void); +static inline bool zmk_usb_is_powered() { return zmk_usb_get_conn_state() != ZMK_USB_CONN_NONE; } +static inline bool zmk_usb_is_hid_ready() { return zmk_usb_get_conn_state() == ZMK_USB_CONN_HID; } diff --git a/app/include/zmk/usb_hid.h b/app/include/zmk/usb_hid.h index 785f6af8..777f2b48 100644 --- a/app/include/zmk/usb_hid.h +++ b/app/include/zmk/usb_hid.h @@ -8,9 +8,6 @@ #include -int zmk_usb_hid_send_keyboard_report(void); -int zmk_usb_hid_send_consumer_report(void); -#if IS_ENABLED(CONFIG_ZMK_POINTING) -int zmk_usb_hid_send_mouse_report(void); -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) +int zmk_usb_hid_send_keyboard_report(); +int zmk_usb_hid_send_consumer_report(); void zmk_usb_hid_set_protocol(uint8_t protocol); diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h index 466ea3ef..b8f20683 100644 --- a/app/include/zmk/virtual_key_position.h +++ b/app/include/zmk/virtual_key_position.h @@ -7,8 +7,6 @@ #pragma once #include -#include -#include #include /** @@ -19,14 +17,9 @@ /** * Gets the sensor number from the virtual key position. */ -#define ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(vkp) ((vkp) - ZMK_KEYMAP_LEN) +#define ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(vkp) ((vkp)-ZMK_KEYMAP_LEN) /** * Gets the virtual key position to use for the combo with the given index. */ -#define ZMK_VIRTUAL_KEY_POSITION_COMBO(index) \ - (ZMK_VIRTUAL_KEY_POSITION_SENSOR(ZMK_KEYMAP_SENSORS_LEN) + (index)) - -#define ZMK_VIRTUAL_KEY_POSITION_BEHAVIOR_INPUT_PROCESSOR(listener_index, processor_index) \ - (ZMK_VIRTUAL_KEY_POSITION_COMBO(ZMK_COMBOS_LEN) + \ - (ZMK_INPUT_LISTENERS_LEN * (processor_index)) + (listener_index)) +#define ZMK_VIRTUAL_KEY_POSITION_COMBO(index) (ZMK_KEYMAP_LEN + ZMK_KEYMAP_SENSORS_LEN + (index)) diff --git a/app/include/zmk/workqueue.h b/app/include/zmk/workqueue.h index 5c9addad..41e94580 100644 --- a/app/include/zmk/workqueue.h +++ b/app/include/zmk/workqueue.h @@ -1 +1 @@ -struct k_work_q *zmk_workqueue_lowprio_work_q(void); +struct k_work_q *zmk_workqueue_lowprio_work_q(); diff --git a/app/keymap-module/modules/modules.cmake b/app/keymap-module/modules/modules.cmake deleted file mode 100644 index e19230c8..00000000 --- a/app/keymap-module/modules/modules.cmake +++ /dev/null @@ -1,61 +0,0 @@ -# TODO: Check for env or command line "ZMK_CONFIG" setting. -# * That directory should load -# * defconfigs, -# * .conf file, -# * single overlay, -# * or per board/shield. - -list(APPEND BOARD_ROOT ${APPLICATION_SOURCE_DIR}) -list(APPEND DTS_ROOT ${APPLICATION_SOURCE_DIR}) - -get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE) - -set(user_config_cli_argument ${cached_user_config_value}) # Either new or old -if(user_config_cli_argument STREQUAL CACHED_ZMK_CONFIG) - # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI - unset(user_config_cli_argument) -endif() - -set(user_config_app_cmake_lists ${ZMK_CONFIG}) -if(cached_user_config_value STREQUAL ZMK_CONFIG) - # The app build scripts did not set a default, The ZMK_CONFIG we are - # reading is the cached value from the CLI - unset(user_config_app_cmake_lists) -endif() - -if(CACHED_ZMK_CONFIG) - # Warn the user if it looks like he is trying to change the user_config - # without cleaning first - if(user_config_cli_argument) - if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) - message(WARNING "The build directory must be cleaned pristinely when changing user ZMK config") - endif() - endif() - - set(ZMK_CONFIG ${CACHED_ZMK_CONFIG}) -elseif(user_config_cli_argument) - set(ZMK_CONFIG ${user_config_cli_argument}) - -elseif(DEFINED ENV{ZMK_CONFIG}) - set(ZMK_CONFIG $ENV{ZMK_CONFIG}) - -elseif(user_config_app_cmake_lists) - set(ZMK_CONFIG ${user_config_app_cmake_lists}) -endif() - -# Store the selected user_config in the cache -set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config") - -if (ZMK_CONFIG) - set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") - if(EXISTS ${ZMK_CONFIG}/boards) - message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") - message(DEPRECATION "The `config/boards` folder is deprecated. Please use a module instead. See https://zmk.dev/docs/hardware-integration/new-shield and https://zmk.dev/docs/development/module-creation for more information.") - list(APPEND BOARD_ROOT ${ZMK_CONFIG}) - endif() - if(EXISTS ${ZMK_CONFIG}/dts) - message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") - message(DEPRECATION "The `config/dts` folder is deprecated. Please use a module instead. See https://zmk.dev/docs/hardware-integration/new-shield and https://zmk.dev/docs/development/module-creation for more information.") - list(APPEND DTS_ROOT ${ZMK_CONFIG}) - endif() -endif() diff --git a/app/keymap-module/zephyr/module.yml b/app/keymap-module/zephyr/module.yml deleted file mode 100644 index 9daa3a18..00000000 --- a/app/keymap-module/zephyr/module.yml +++ /dev/null @@ -1,5 +0,0 @@ -# This ensures our modules/modules.cmake file is loaded *after* all the other modules, -# To set up the various keymap DTS and overridden .conf files are located and chosen. -build: - settings: - module_ext_root: "." diff --git a/app/module/CMakeLists.txt b/app/module/CMakeLists.txt index 8c4afb06..db886ac6 100644 --- a/app/module/CMakeLists.txt +++ b/app/module/CMakeLists.txt @@ -1,5 +1,4 @@ zephyr_include_directories(include) add_subdirectory(drivers) -add_subdirectory(test-behaviors) add_subdirectory(lib) \ No newline at end of file diff --git a/app/module/Kconfig b/app/module/Kconfig index e86c0d6b..52c01315 100644 --- a/app/module/Kconfig +++ b/app/module/Kconfig @@ -1,4 +1,3 @@ rsource "drivers/Kconfig" -rsource "lib/Kconfig" -rsource "test-behaviors/Kconfig" \ No newline at end of file +rsource "lib/Kconfig" \ No newline at end of file diff --git a/app/module/boards/joric/nrfmicro/CMakeLists.txt b/app/module/boards/joric/nrfmicro/CMakeLists.txt deleted file mode 100644 index 05214a68..00000000 --- a/app/module/boards/joric/nrfmicro/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -zephyr_library() -zephyr_library_sources(pinmux.c) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file diff --git a/app/module/boards/joric/nrfmicro/Kconfig b/app/module/boards/joric/nrfmicro/Kconfig deleted file mode 100644 index f8e10e63..00000000 --- a/app/module/boards/joric/nrfmicro/Kconfig +++ /dev/null @@ -1,4 +0,0 @@ -config BOARD_NRFMICRO_CHARGER - bool "Enable battery charger" - default y - depends on (BOARD_NRFMICRO && BOARD_REVISION = "1.3.0") diff --git a/app/module/boards/joric/nrfmicro/Kconfig.defconfig b/app/module/boards/joric/nrfmicro/Kconfig.defconfig deleted file mode 100644 index 9207183e..00000000 --- a/app/module/boards/joric/nrfmicro/Kconfig.defconfig +++ /dev/null @@ -1,29 +0,0 @@ -# Electronut Labs Papyr board configuration - -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED || BOARD_NRFMICRO_NRF52833 - -config BOARD - default "nrfmicro" - -if USB_DEVICE_STACK - -config USB_NRFX - default y - -endif # USB_DEVICE_STACK - -config BT_CTLR - default BT - -if BOARD_REVISION = "1.3.0" - -config BOARD_NRFMICRO_CHARGER - default y - -endif # BOARD_REVISION = "1.3.0" - - -endif # BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED || BOARD_NRFMICRO_NRF52833 diff --git a/app/module/boards/joric/nrfmicro/Kconfig.nrfmicro b/app/module/boards/joric/nrfmicro/Kconfig.nrfmicro deleted file mode 100644 index 27eb747b..00000000 --- a/app/module/boards/joric/nrfmicro/Kconfig.nrfmicro +++ /dev/null @@ -1,9 +0,0 @@ -# nrfmicro board configuration - -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_NRFMICRO - select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840 - select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_FLIPPED - select SOC_NRF52833_QIAA if BOARD_NRFMICRO_NRF52833 diff --git a/app/module/boards/joric/nrfmicro/board.cmake b/app/module/boards/joric/nrfmicro/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/module/boards/joric/nrfmicro/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/joric/nrfmicro/board.yml b/app/module/boards/joric/nrfmicro/board.yml deleted file mode 100644 index 1cfcc492..00000000 --- a/app/module/boards/joric/nrfmicro/board.yml +++ /dev/null @@ -1,14 +0,0 @@ -board: - name: nrfmicro - vendor: joric - socs: - - name: nrf52840 - variants: - - name: flipped - - name: nrf52833 - revision: - format: major.minor.patch - default: 1.3.0 - revisions: - - name: 1.3.0 - - name: 1.1.0 diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0.overlay b/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0.overlay deleted file mode 100644 index 758f4ee8..00000000 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0.overlay +++ /dev/null @@ -1,6 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig b/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig deleted file mode 100644 index 5b140088..00000000 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay b/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay deleted file mode 100644 index ac8b2057..00000000 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/ { - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; -}; - diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig b/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig deleted file mode 100644 index 5b140088..00000000 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig b/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig deleted file mode 100644 index 5e669b34..00000000 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig b/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig deleted file mode 100644 index 5e669b34..00000000 --- a/app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/module/boards/joric/nrfmicro/pre_dt_board.cmake b/app/module/boards/joric/nrfmicro/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/module/boards/joric/nrfmicro/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/module/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 b/app/module/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 deleted file mode 100644 index fd2a9143..00000000 --- a/app/module/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2026 Pete Johanson, Derek Schmell -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_BLUEMICRO840 - select SOC_NRF52840_QIAA diff --git a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840.yaml b/app/module/boards/jpconstantineau/bluemicro840/bluemicro840.yaml deleted file mode 100644 index c36eee0c..00000000 --- a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840.yaml +++ /dev/null @@ -1,15 +0,0 @@ -identifier: bluemicro840 -name: BlueMicro840_V1 -type: mcu -arch: arm -toolchain: - - zephyr - - gnuarmemb - - xtools -supported: - - adc - - usb_device - - ble - - ieee802154 - - pwm - - watchdog diff --git a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig b/app/module/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig deleted file mode 100644 index 5b140088..00000000 --- a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - diff --git a/app/module/boards/jpconstantineau/bluemicro840/board.cmake b/app/module/boards/jpconstantineau/bluemicro840/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/module/boards/jpconstantineau/bluemicro840/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/jpconstantineau/bluemicro840/board.yml b/app/module/boards/jpconstantineau/bluemicro840/board.yml deleted file mode 100644 index 0a9ebdd5..00000000 --- a/app/module/boards/jpconstantineau/bluemicro840/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - name: bluemicro840 - vendor: jpconstantineau - socs: - - name: nrf52840 diff --git a/app/module/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake b/app/module/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake deleted file mode 100644 index b0c27aa5..00000000 --- a/app/module/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/app/module/boards/keycapsss/puchi_ble/CMakeLists.txt b/app/module/boards/keycapsss/puchi_ble/CMakeLists.txt deleted file mode 100644 index 05214a68..00000000 --- a/app/module/boards/keycapsss/puchi_ble/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -zephyr_library() -zephyr_library_sources(pinmux.c) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file diff --git a/app/module/boards/keycapsss/puchi_ble/Kconfig.defconfig b/app/module/boards/keycapsss/puchi_ble/Kconfig.defconfig deleted file mode 100644 index ee8bc573..00000000 --- a/app/module/boards/keycapsss/puchi_ble/Kconfig.defconfig +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if BOARD_PUCHI_BLE - -config BOARD - default "puchi_ble" - -if USB_DEVICE_STACK - -config USB_NRFX - default y - -endif # USB_DEVICE_STACK - -endif # BOARD_PUCHI_BLE diff --git a/app/module/boards/keycapsss/puchi_ble/Kconfig.puchi_ble b/app/module/boards/keycapsss/puchi_ble/Kconfig.puchi_ble deleted file mode 100644 index 4cd8b05b..00000000 --- a/app/module/boards/keycapsss/puchi_ble/Kconfig.puchi_ble +++ /dev/null @@ -1,10 +0,0 @@ -# Puchi-BLE board configuration - -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_PUCHI_BLE - select SOC_NRF52840_QIAA - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/module/boards/keycapsss/puchi_ble/board.yml b/app/module/boards/keycapsss/puchi_ble/board.yml deleted file mode 100644 index d192a306..00000000 --- a/app/module/boards/keycapsss/puchi_ble/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - name: puchi_ble - vendor: keycapsss - socs: - - name: nrf52840 diff --git a/app/module/boards/keycapsss/puchi_ble/pre_dt_board.cmake b/app/module/boards/keycapsss/puchi_ble/pre_dt_board.cmake deleted file mode 100644 index b0c27aa5..00000000 --- a/app/module/boards/keycapsss/puchi_ble/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble_defconfig b/app/module/boards/keycapsss/puchi_ble/puchi_ble_defconfig deleted file mode 100644 index 5d50cb25..00000000 --- a/app/module/boards/keycapsss/puchi_ble/puchi_ble_defconfig +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -# Use pinctrl -CONFIG_PINCTRL=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - diff --git a/app/module/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 b/app/module/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 deleted file mode 100644 index d4eb4c30..00000000 --- a/app/module/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_NRF52840_M2 - select SOC_NRF52840_QIAA diff --git a/app/module/boards/makerdiary/nrf52840_m2/board.yml b/app/module/boards/makerdiary/nrf52840_m2/board.yml deleted file mode 100644 index a1675e24..00000000 --- a/app/module/boards/makerdiary/nrf52840_m2/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - name: nrf52840_m2 - vendor: makerdiary - socs: - - name: nrf52840 diff --git a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml b/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml deleted file mode 100644 index 0a999bbf..00000000 --- a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml +++ /dev/null @@ -1,15 +0,0 @@ -identifier: nrf52840_m2 -name: Makerdiary nRF52840 M.2 module -type: mcu -arch: arm -toolchain: - - zephyr - - gnuarmemb - - xtools -supported: - - adc - - usb_device - - ble - - ieee802154 - - pwm - - watchdog diff --git a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2_defconfig b/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2_defconfig deleted file mode 100644 index c7dc6fcf..00000000 --- a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2_defconfig +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - diff --git a/app/module/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake b/app/module/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake deleted file mode 100644 index b0c27aa5..00000000 --- a/app/module/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/app/module/boards/mechwild/pillbug/Kconfig.pillbug b/app/module/boards/mechwild/pillbug/Kconfig.pillbug deleted file mode 100644 index d8967944..00000000 --- a/app/module/boards/mechwild/pillbug/Kconfig.pillbug +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PILLBUG - select SOC_NRF52840_QIAA - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE diff --git a/app/module/boards/mechwild/pillbug/board.yml b/app/module/boards/mechwild/pillbug/board.yml deleted file mode 100644 index abd15044..00000000 --- a/app/module/boards/mechwild/pillbug/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - name: pillbug - vendor: mechwild - socs: - - name: nrf52840 diff --git a/app/module/boards/mechwild/pillbug/pillbug-pinctrl.dtsi b/app/module/boards/mechwild/pillbug/pillbug-pinctrl.dtsi deleted file mode 100644 index 609c4a72..00000000 --- a/app/module/boards/mechwild/pillbug/pillbug-pinctrl.dtsi +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2026 The ZMK Contributors - * SPDX-License-Identifier: MIT - */ - -&pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; - - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; - - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; - - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; - - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; -}; diff --git a/app/module/boards/mechwild/pillbug/pillbug_defconfig b/app/module/boards/mechwild/pillbug/pillbug_defconfig deleted file mode 100644 index 8332d62b..00000000 --- a/app/module/boards/mechwild/pillbug/pillbug_defconfig +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# Use pinctrl -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/module/boards/mechwild/pillbug/pre_dt_board.cmake b/app/module/boards/mechwild/pillbug/pre_dt_board.cmake deleted file mode 100644 index 05b0efe5..00000000 --- a/app/module/boards/mechwild/pillbug/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/module/boards/nicekeyboards/nice_nano/Kconfig.nice_nano b/app/module/boards/nicekeyboards/nice_nano/Kconfig.nice_nano deleted file mode 100644 index 01a9329c..00000000 --- a/app/module/boards/nicekeyboards/nice_nano/Kconfig.nice_nano +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_NICE_NANO - select SOC_NRF52840_QIAA diff --git a/app/module/boards/nicekeyboards/nice_nano/board.cmake b/app/module/boards/nicekeyboards/nice_nano/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/module/boards/nicekeyboards/nice_nano/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/nicekeyboards/nice_nano/board.yml b/app/module/boards/nicekeyboards/nice_nano/board.yml deleted file mode 100644 index 89171957..00000000 --- a/app/module/boards/nicekeyboards/nice_nano/board.yml +++ /dev/null @@ -1,11 +0,0 @@ -board: - name: nice_nano - vendor: nicekeyboards - socs: - - name: nrf52840 - revision: - format: major.minor.patch - default: 2.0.0 - revisions: - - name: 1.0.0 - - name: 2.0.0 diff --git a/app/module/boards/nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig b/app/module/boards/nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig deleted file mode 100644 index 0779d359..00000000 --- a/app/module/boards/nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -# Use pinctrl -CONFIG_PINCTRL=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/module/boards/nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig b/app/module/boards/nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig deleted file mode 100644 index 73d6e98a..00000000 --- a/app/module/boards/nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y - -# Use pinctrl -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/module/boards/nicekeyboards/nice_nano/pre_dt_board.cmake b/app/module/boards/nicekeyboards/nice_nano/pre_dt_board.cmake deleted file mode 100644 index b0c27aa5..00000000 --- a/app/module/boards/nicekeyboards/nice_nano/pre_dt_board.cmake +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/app/module/boards/qmk/proton_c/Kconfig.proton_c b/app/module/boards/qmk/proton_c/Kconfig.proton_c deleted file mode 100644 index ba5edaf8..00000000 --- a/app/module/boards/qmk/proton_c/Kconfig.proton_c +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2020 Pete Johanson -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PROTON_C - select SOC_STM32F303XC diff --git a/app/module/boards/qmk/proton_c/board.yml b/app/module/boards/qmk/proton_c/board.yml deleted file mode 100644 index 54ecb64b..00000000 --- a/app/module/boards/qmk/proton_c/board.yml +++ /dev/null @@ -1,5 +0,0 @@ -board: - name: proton_c - vendor: qmk - socs: - - name: stm32f303xc diff --git a/app/module/boards/zhiayang/mikoto/CMakeLists.txt b/app/module/boards/zhiayang/mikoto/CMakeLists.txt deleted file mode 100644 index 05214a68..00000000 --- a/app/module/boards/zhiayang/mikoto/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -zephyr_library() -zephyr_library_sources(pinmux.c) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file diff --git a/app/module/boards/zhiayang/mikoto/Kconfig.mikoto b/app/module/boards/zhiayang/mikoto/Kconfig.mikoto deleted file mode 100644 index 2190c382..00000000 --- a/app/module/boards/zhiayang/mikoto/Kconfig.mikoto +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_MIKOTO - select SOC_NRF52840_QIAA diff --git a/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi b/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi deleted file mode 100644 index 79d8b155..00000000 --- a/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - - -/ { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 4 0> /* D0 */ - , <1 0 &gpio0 8 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 8 0> /* D6/A7 */ - , <7 0 &gpio1 2 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 13 0> /* D14 */ - , <15 0 &gpio0 2 0> /* D15 */ - , <18 0 &gpio0 29 0> /* D18/A0 */ - , <19 0 &gpio0 31 0> /* D19/A1 */ - , <20 0 &gpio0 25 0> /* D20/A2 */ - , <21 0 &gpio0 11 0> /* D21/A3 */ - ; - }; - - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 29 0> /* D18/A0 */ - , <1 0 &gpio0 31 0> /* D19/A1 */ - , <2 0 &gpio0 25 0> /* D20/A2 */ - , <3 0 &gpio0 11 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 8 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; -}; - - -pro_micro_d: &pro_micro {}; -pro_micro_i2c: &i2c0 {}; -pro_micro_spi: &spi0 {}; -pro_micro_serial: &uart0 {}; diff --git a/app/module/boards/zhiayang/mikoto/board.cmake b/app/module/boards/zhiayang/mikoto/board.cmake deleted file mode 100644 index 73fa64a9..00000000 --- a/app/module/boards/zhiayang/mikoto/board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/module/boards/zhiayang/mikoto/board.yml b/app/module/boards/zhiayang/mikoto/board.yml deleted file mode 100644 index d1f71557..00000000 --- a/app/module/boards/zhiayang/mikoto/board.yml +++ /dev/null @@ -1,14 +0,0 @@ -board: - name: mikoto - vendor: zhiayang - revision: - format: major.minor.patch - default: 5.20.0 - exact: false - revisions: - - name: 5.20.0 - - name: 6.1.0 - - name: 6.3.0 - - name: 7.2.0 - socs: - - name: nrf52840 diff --git a/app/module/boards/zhiayang/mikoto/mikoto.yaml b/app/module/boards/zhiayang/mikoto/mikoto.yaml deleted file mode 100644 index 7410471e..00000000 --- a/app/module/boards/zhiayang/mikoto/mikoto.yaml +++ /dev/null @@ -1,15 +0,0 @@ -identifier: mikoto -name: mikoto -type: mcu -arch: arm -toolchain: - - zephyr - - gnuarmemb - - xtools -supported: - - adc - - usb_device - - ble - - ieee802154 - - pwm - - watchdog diff --git a/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.conf b/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.conf deleted file mode 100644 index 8bf92886..00000000 --- a/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_I2C=y -CONFIG_ZMK_MAX17048=y diff --git a/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.overlay b/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.overlay deleted file mode 100644 index 30c05510..00000000 --- a/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.overlay +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "mikoto-pinctrl.dtsi" -#include "arduino_pro_micro_pins_v6.dtsi" - -&pinctrl { - i2c1_default: i2c1_default { - group1 { - psels = , - ; - bias-pull-up; - }; - }; - - i2c1_sleep: i2c1_sleep { - group1 { - psels = , - ; - low-power-enable; - bias-pull-up; - }; - }; -}; - -&i2c1 { - status = "okay"; - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c1_default>; - pinctrl-1 = <&i2c1_sleep>; - pinctrl-names = "default", "sleep"; - - builtin_fuel_gauge: max17048@36 { - compatible = "zmk,maxim-max17048"; - status = "okay"; - reg = <0x36>; - }; -}; - -/ { - chosen { - zmk,battery = &builtin_fuel_gauge; - }; -}; diff --git a/app/module/boards/zhiayang/mikoto/mikoto_defconfig b/app/module/boards/zhiayang/mikoto/mikoto_defconfig deleted file mode 100644 index 17ef2da4..00000000 --- a/app/module/boards/zhiayang/mikoto/mikoto_defconfig +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Enable MPU -CONFIG_ARM_MPU=y -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y - diff --git a/app/module/boards/zhiayang/mikoto/pre_dt_board.cmake b/app/module/boards/zhiayang/mikoto/pre_dt_board.cmake deleted file mode 100644 index d2d49226..00000000 --- a/app/module/boards/zhiayang/mikoto/pre_dt_board.cmake +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT -# - -# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller -# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html - -list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/app/module/drivers/CMakeLists.txt b/app/module/drivers/CMakeLists.txt index a3a15c65..5281c3dc 100644 --- a/app/module/drivers/CMakeLists.txt +++ b/app/module/drivers/CMakeLists.txt @@ -5,4 +5,3 @@ add_subdirectory_ifdef(CONFIG_GPIO gpio) add_subdirectory_ifdef(CONFIG_KSCAN kscan) add_subdirectory_ifdef(CONFIG_SENSOR sensor) add_subdirectory_ifdef(CONFIG_DISPLAY display) -add_subdirectory_ifdef(CONFIG_INPUT input) diff --git a/app/module/drivers/Kconfig b/app/module/drivers/Kconfig index db3f49a5..c57ed334 100644 --- a/app/module/drivers/Kconfig +++ b/app/module/drivers/Kconfig @@ -5,4 +5,3 @@ rsource "gpio/Kconfig" rsource "kscan/Kconfig" rsource "sensor/Kconfig" rsource "display/Kconfig" -rsource "input/Kconfig" diff --git a/app/module/drivers/display/il0323.c b/app/module/drivers/display/il0323.c index 3eeb26fd..6555e5c1 100644 --- a/app/module/drivers/display/il0323.c +++ b/app/module/drivers/display/il0323.c @@ -177,7 +177,6 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte line = k_malloc(IL0323_NUMOF_PAGES); if (line == NULL) { - LOG_ERR("Failed to allocate memory for the clear"); return -ENOMEM; } @@ -342,7 +341,7 @@ static int il0323_controller_init(const struct device *dev) { static int il0323_init(const struct device *dev) { const struct il0323_cfg *cfg = dev->config; - if (!spi_is_ready_dt(&cfg->spi)) { + if (!spi_is_ready(&cfg->spi)) { LOG_ERR("SPI device not ready for IL0323"); return -EIO; } @@ -371,14 +370,14 @@ static int il0323_init(const struct device *dev) { return il0323_controller_init(dev); } -static const struct il0323_cfg il0323_config = { +static struct il0323_cfg il0323_config = { .spi = SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8), 0), .reset = GPIO_DT_SPEC_INST_GET(0, reset_gpios), .busy = GPIO_DT_SPEC_INST_GET(0, busy_gpios), .dc = GPIO_DT_SPEC_INST_GET(0, dc_gpios), }; -static const struct display_driver_api il0323_driver_api = { +static struct display_driver_api il0323_driver_api = { .blanking_on = il0323_blanking_on, .blanking_off = il0323_blanking_off, .write = il0323_write, diff --git a/app/module/drivers/gpio/gpio_595.c b/app/module/drivers/gpio/gpio_595.c index e8c89e47..3d385844 100644 --- a/app/module/drivers/gpio/gpio_595.c +++ b/app/module/drivers/gpio/gpio_595.c @@ -89,6 +89,26 @@ static int setup_pin_dir(const struct device *dev, uint32_t pin, int flags) { return 0; } +static int reg_595_pin_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { + int ret; + + /* Can't do SPI bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + if ((flags & GPIO_OPEN_DRAIN) != 0U) { + return -ENOTSUP; + }; + + ret = setup_pin_dir(dev, pin, flags); + if (ret) { + LOG_ERR("595: error setting pin direction (%d)", ret); + } + + return ret; +} + static int reg_595_port_get_raw(const struct device *dev, uint32_t *value) { return -ENOTSUP; } static int reg_595_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { @@ -141,32 +161,6 @@ static int reg_595_port_toggle_bits(const struct device *dev, uint32_t mask) { return ret; } -static int reg_595_pin_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - if ((flags & GPIO_OPEN_DRAIN) != 0U) { - return -ENOTSUP; - }; - - ret = setup_pin_dir(dev, pin, flags); - if (ret) { - LOG_ERR("595: error setting pin direction (%d)", ret); - } - - if ((flags & GPIO_OUTPUT_INIT_LOW) != 0) { - return reg_595_port_clear_bits_raw(dev, BIT(pin)); - } else if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0) { - return reg_595_port_set_bits_raw(dev, BIT(pin)); - } - - return ret; -} - static const struct gpio_driver_api api_table = { .pin_configure = reg_595_pin_config, .port_get_raw = reg_595_port_get_raw, @@ -202,7 +196,7 @@ static int reg_595_init(const struct device *dev) { GPIO_PORT_PIN_MASK_FROM_NGPIOS(DT_INST_PROP(inst, ngpios)) #define REG_595_INIT(n) \ - static const struct reg_595_config reg_595_##n##_config = { \ + static struct reg_595_config reg_595_##n##_config = { \ .common = \ { \ .port_pin_mask = GPIO_PORT_PIN_MASK_FROM_DT_INST(n), \ diff --git a/app/module/drivers/gpio/gpio_max7318.c b/app/module/drivers/gpio/gpio_max7318.c index a0e1b39a..1842ce7b 100644 --- a/app/module/drivers/gpio/gpio_max7318.c +++ b/app/module/drivers/gpio/gpio_max7318.c @@ -322,7 +322,7 @@ static int max7318_init(const struct device *dev) { GPIO_PORT_PIN_MASK_FROM_NGPIOS(DT_INST_PROP(inst, ngpios)) #define MAX7318_INIT(inst) \ - static const struct max7318_config max7318_##inst##_config = { \ + static struct max7318_config max7318_##inst##_config = { \ .common = {.port_pin_mask = GPIO_PORT_PIN_MASK_FROM_DT_INST(inst)}, \ .i2c_bus = I2C_DT_SPEC_INST_GET(inst)}; \ \ diff --git a/app/module/drivers/input/CMakeLists.txt b/app/module/drivers/input/CMakeLists.txt deleted file mode 100644 index f8f5b231..00000000 --- a/app/module/drivers/input/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2020-2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -zephyr_library_amend() - -zephyr_library_sources_ifdef(CONFIG_ZMK_INPUT_MOCK input_mock.c) diff --git a/app/module/drivers/input/Kconfig b/app/module/drivers/input/Kconfig deleted file mode 100644 index 248805d1..00000000 --- a/app/module/drivers/input/Kconfig +++ /dev/null @@ -1,9 +0,0 @@ - -if INPUT - -config ZMK_INPUT_MOCK - bool "Input Mock" - default y - depends on DT_HAS_ZMK_INPUT_MOCK_ENABLED - -endif \ No newline at end of file diff --git a/app/module/drivers/input/input_mock.c b/app/module/drivers/input/input_mock.c deleted file mode 100644 index 23282cd0..00000000 --- a/app/module/drivers/input/input_mock.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_mock - -#include -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct input_mock_config { - uint16_t startup_delay; - uint16_t event_period; - bool exit_after; - const uint32_t *events; - size_t events_len; -}; - -struct input_mock_data { - size_t event_index; - struct k_work_delayable work; - const struct device *dev; -}; - -static void input_mock_work_cb(struct k_work *work) { - struct k_work_delayable *dwork = CONTAINER_OF(work, struct k_work_delayable, work); - struct input_mock_data *data = CONTAINER_OF(dwork, struct input_mock_data, work); - - const struct device *dev = data->dev; - - const struct input_mock_config *cfg = dev->config; - - data->event_index++; - - size_t base_idx = data->event_index * 4; - - if (base_idx >= cfg->events_len) { - if (cfg->exit_after) { - exit(0); - } else { - return; - } - } - - bool sync = cfg->events[base_idx + 3]; - input_report(dev, cfg->events[base_idx], cfg->events[base_idx + 1], cfg->events[base_idx + 2], - sync, K_NO_WAIT); - - if (sync) { - k_work_schedule(&data->work, K_MSEC(cfg->event_period)); - } else { - k_work_schedule(&data->work, K_NO_WAIT); - } -} - -int input_mock_init(const struct device *dev) { - struct input_mock_data *drv_data = dev->data; - const struct input_mock_config *drv_cfg = dev->config; - - drv_data->dev = dev; - drv_data->event_index = -1; - - k_work_init_delayable(&drv_data->work, input_mock_work_cb); - - k_work_schedule(&drv_data->work, K_MSEC(drv_cfg->startup_delay)); - - return 0; -} - -#define INPUT_MOCK_INST(n) \ - static struct input_mock_data input_mock_data_##n = {}; \ - static const uint32_t mock_data_##n[] = DT_INST_PROP(n, events); \ - static const struct input_mock_config input_mock_cfg_##n = { \ - .events = mock_data_##n, \ - .events_len = DT_INST_PROP_LEN(n, events), \ - .startup_delay = DT_INST_PROP(n, event_startup_delay), \ - .event_period = DT_INST_PROP(n, event_period), \ - .exit_after = DT_INST_PROP(n, exit_after), \ - }; \ - DEVICE_DT_INST_DEFINE(n, input_mock_init, NULL, &input_mock_data_##n, &input_mock_cfg_##n, \ - POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, NULL); - -DT_INST_FOREACH_STATUS_OKAY(INPUT_MOCK_INST) diff --git a/app/module/drivers/kscan/CMakeLists.txt b/app/module/drivers/kscan/CMakeLists.txt index 5b05af76..7ae9524c 100644 --- a/app/module/drivers/kscan/CMakeLists.txt +++ b/app/module/drivers/kscan/CMakeLists.txt @@ -1,11 +1,10 @@ -# Copyright (c) 2020-2023 The ZMK Contributors +# Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT zephyr_library_amend() zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_MATRIX kscan_gpio_matrix.c) -zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_CHARLIEPLEX kscan_gpio_charlieplex.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DIRECT kscan_gpio_direct.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DEMUX kscan_gpio_demux.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_MOCK_DRIVER kscan_mock.c) diff --git a/app/module/drivers/kscan/Kconfig b/app/module/drivers/kscan/Kconfig index 5ec00063..6f60b3f9 100644 --- a/app/module/drivers/kscan/Kconfig +++ b/app/module/drivers/kscan/Kconfig @@ -5,7 +5,6 @@ DT_COMPAT_ZMK_KSCAN_COMPOSITE := zmk,kscan-composite DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX := zmk,kscan-gpio-demux DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT := zmk,kscan-gpio-direct DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX := zmk,kscan-gpio-matrix -DT_COMPAT_ZMK_KSCAN_GPIO_CHARLIEPLEX := zmk,kscan-gpio-charlieplex DT_COMPAT_ZMK_KSCAN_MOCK := zmk,kscan-mock if KSCAN @@ -14,14 +13,6 @@ config ZMK_KSCAN_COMPOSITE_DRIVER bool default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) -if ZMK_KSCAN_COMPOSITE_DRIVER - -config ZMK_KSCAN_COMPOSITE_INIT_PRIORITY - int "Init Priority for the composite kscan driver" - default 95 - -endif - config ZMK_KSCAN_GPIO_DRIVER bool select GPIO @@ -42,11 +33,6 @@ config ZMK_KSCAN_GPIO_MATRIX default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) select ZMK_KSCAN_GPIO_DRIVER -config ZMK_KSCAN_GPIO_CHARLIEPLEX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_CHARLIEPLEX)) - select ZMK_KSCAN_GPIO_DRIVER - if ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS @@ -61,7 +47,7 @@ config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" - default 1 if SOC_RP2040 || SOC_SERIES_RP2350 + default 1 if SOC_RP2040 default 0 help When iterating over each output to drive it active, read inputs, then set @@ -72,30 +58,6 @@ config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS endif # ZMK_KSCAN_GPIO_MATRIX -if ZMK_KSCAN_GPIO_CHARLIEPLEX - -config ZMK_KSCAN_CHARLIEPLEX_WAIT_BEFORE_INPUTS - int "Ticks to wait before reading inputs after an output set active" - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for output to propagate to the - inputs. In that scenario, set this value to a positive value to configure - the number of ticks to wait after setting an output active before reading - the inputs for their active state. - -config ZMK_KSCAN_CHARLIEPLEX_WAIT_BETWEEN_OUTPUTS - int "Ticks to wait between each output when scanning charlieplex matrix" - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for the previous output to - "settle" before reading inputs for the next active output column. In that - scenario, set this value to a positive value to configure the number of - usecs to wait after reading each column of keys. - -endif # ZMK_KSCAN_GPIO_CHARLIEPLEX - config ZMK_KSCAN_MOCK_DRIVER bool default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) diff --git a/app/module/drivers/kscan/kscan_composite.c b/app/module/drivers/kscan/kscan_composite.c index 18d957ec..97311ef8 100644 --- a/app/module/drivers/kscan/kscan_composite.c +++ b/app/module/drivers/kscan/kscan_composite.c @@ -7,7 +7,6 @@ #define DT_DRV_COMPAT zmk_kscan_composite #include -#include #include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -25,12 +24,12 @@ struct kscan_composite_child_config { #define CHILD_CONFIG(inst) \ {.child = DEVICE_DT_GET(DT_PHANDLE(inst, kscan)), \ .row_offset = DT_PROP(inst, row_offset), \ - .column_offset = DT_PROP_OR(inst, col_offset, DT_PROP(inst, column_offset))}, + .column_offset = DT_PROP(inst, column_offset)}, -struct kscan_composite_config { - const struct kscan_composite_child_config *children; - size_t children_len; -}; +const struct kscan_composite_child_config kscan_composite_children[] = { + DT_FOREACH_CHILD(MATRIX_NODE_ID, CHILD_CONFIG)}; + +struct kscan_composite_config {}; struct kscan_composite_data { kscan_callback_t callback; @@ -39,95 +38,51 @@ struct kscan_composite_data { }; static int kscan_composite_enable_callback(const struct device *dev) { - const struct kscan_composite_config *cfg = dev->config; + for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { + const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - for (int i = 0; i < cfg->children_len; i++) { - const struct kscan_composite_child_config *child_cfg = &cfg->children[i]; - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) - if (pm_device_wakeup_is_enabled(dev) && pm_device_wakeup_is_capable(child_cfg->child) && - !pm_device_wakeup_enable(child_cfg->child, true)) { - LOG_ERR("Failed to enable wakeup for %s", child_cfg->child->name); - } -#endif // IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - if (!pm_device_runtime_is_enabled(dev) && pm_device_runtime_is_enabled(child_cfg->child)) { - pm_device_runtime_get(child_cfg->child); - } -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(child_cfg->child, PM_DEVICE_ACTION_RESUME); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - - kscan_enable_callback(child_cfg->child); + kscan_enable_callback(cfg->child); } return 0; } static int kscan_composite_disable_callback(const struct device *dev) { - const struct kscan_composite_config *cfg = dev->config; - for (int i = 0; i < cfg->children_len; i++) { - const struct kscan_composite_child_config *child_cfg = &cfg->children[i]; + for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { + const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) - if (pm_device_wakeup_is_capable(child_cfg->child) && - pm_device_wakeup_is_enabled(child_cfg->child) && - !pm_device_wakeup_enable(child_cfg->child, false)) { - LOG_ERR("Failed to disable wakeup for %s", child_cfg->child->name); - } -#endif // IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) || IS_ENABLED(CONFIG_PM_DEVICE) - - kscan_disable_callback(child_cfg->child); - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - if (!pm_device_runtime_is_enabled(dev) && pm_device_runtime_is_enabled(child_cfg->child)) { - pm_device_runtime_put(child_cfg->child); - } -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(child_cfg->child, PM_DEVICE_ACTION_SUSPEND); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) + kscan_disable_callback(cfg->child); } return 0; } -#define KSCAN_COMP_INST_DEV(n) DEVICE_DT_GET(DT_DRV_INST(n)), - -static const struct device *all_instances[] = {DT_INST_FOREACH_STATUS_OKAY(KSCAN_COMP_INST_DEV)}; - static void kscan_composite_child_callback(const struct device *child_dev, uint32_t row, uint32_t column, bool pressed) { // TODO: Ideally we can get this passed into our callback! - for (int i = 0; i < ARRAY_SIZE(all_instances); i++) { + const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(0)); + struct kscan_composite_data *data = dev->data; - const struct device *dev = all_instances[i]; - const struct kscan_composite_config *cfg = dev->config; - struct kscan_composite_data *data = dev->data; + for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { + const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - for (int c = 0; c < cfg->children_len; c++) { - const struct kscan_composite_child_config *child_cfg = &cfg->children[c]; - - if (child_cfg->child != child_dev) { - continue; - } - - data->callback(dev, row + child_cfg->row_offset, column + child_cfg->column_offset, - pressed); + if (cfg->child != child_dev) { + continue; } + + data->callback(dev, row + cfg->row_offset, column + cfg->column_offset, pressed); } } static int kscan_composite_configure(const struct device *dev, kscan_callback_t callback) { - const struct kscan_composite_config *cfg = dev->config; struct kscan_composite_data *data = dev->data; if (!callback) { return -EINVAL; } - for (int i = 0; i < cfg->children_len; i++) { - const struct kscan_composite_child_config *child_cfg = &cfg->children[i]; + for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { + const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - kscan_config(child_cfg->child, &kscan_composite_child_callback); + kscan_config(cfg->child, &kscan_composite_child_callback); } data->callback = callback; @@ -140,10 +95,6 @@ static int kscan_composite_init(const struct device *dev) { data->dev = dev; -#if IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_init_suspended(dev); -#endif - return 0; } @@ -153,32 +104,9 @@ static const struct kscan_driver_api mock_driver_api = { .disable_callback = kscan_composite_disable_callback, }; -#if IS_ENABLED(CONFIG_PM_DEVICE) +static const struct kscan_composite_config kscan_composite_config = {}; -static int kscan_composite_pm_action(const struct device *dev, enum pm_device_action action) { - switch (action) { - case PM_DEVICE_ACTION_SUSPEND: - return kscan_composite_disable_callback(dev); - case PM_DEVICE_ACTION_RESUME: - return kscan_composite_enable_callback(dev); - default: - return -ENOTSUP; - } -} +static struct kscan_composite_data kscan_composite_data; -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#define KSCAN_COMP_DEV(n) \ - static const struct kscan_composite_child_config kscan_composite_children_##n[] = { \ - DT_INST_FOREACH_CHILD(n, CHILD_CONFIG)}; \ - static const struct kscan_composite_config kscan_composite_config_##n = { \ - .children = kscan_composite_children_##n, \ - .children_len = ARRAY_SIZE(kscan_composite_children_##n), \ - }; \ - static struct kscan_composite_data kscan_composite_data_##n; \ - PM_DEVICE_DT_INST_DEFINE(n, kscan_composite_pm_action); \ - DEVICE_DT_INST_DEFINE(n, kscan_composite_init, PM_DEVICE_DT_INST_GET(n), \ - &kscan_composite_data_##n, &kscan_composite_config_##n, POST_KERNEL, \ - CONFIG_ZMK_KSCAN_COMPOSITE_INIT_PRIORITY, &mock_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(KSCAN_COMP_DEV) +DEVICE_DT_INST_DEFINE(0, kscan_composite_init, NULL, &kscan_composite_data, &kscan_composite_config, + POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, &mock_driver_api); diff --git a/app/module/drivers/kscan/kscan_gpio_charlieplex.c b/app/module/drivers/kscan/kscan_gpio_charlieplex.c deleted file mode 100644 index d0b0ae49..00000000 --- a/app/module/drivers/kscan/kscan_gpio_charlieplex.c +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright (c) 2020-2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#define DT_DRV_COMPAT zmk_kscan_gpio_charlieplex - -#define INST_LEN(n) DT_INST_PROP_LEN(n, gpios) -#define INST_CHARLIEPLEX_LEN(n) (INST_LEN(n) * INST_LEN(n)) - -#if CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS >= 0 -#define INST_DEBOUNCE_PRESS_MS(n) CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS -#else -#define INST_DEBOUNCE_PRESS_MS(n) \ - DT_INST_PROP_OR(n, debounce_period, DT_INST_PROP(n, debounce_press_ms)) -#endif - -#if CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS >= 0 -#define INST_DEBOUNCE_RELEASE_MS(n) CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS -#else -#define INST_DEBOUNCE_RELEASE_MS(n) \ - DT_INST_PROP_OR(n, debounce_period, DT_INST_PROP(n, debounce_release_ms)) -#endif - -#define KSCAN_GPIO_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), gpios, idx) - -#define INST_INTR_DEFINED(n) DT_INST_NODE_HAS_PROP(n, interrupt_gpios) - -#define WITH_INTR(n) COND_CODE_1(INST_INTR_DEFINED(n), (+1), (+0)) -#define WITHOUT_INTR(n) COND_CODE_0(INST_INTR_DEFINED(n), (+1), (+0)) - -#define USES_POLLING DT_INST_FOREACH_STATUS_OKAY(WITHOUT_INTR) > 0 -#define USES_INTERRUPT DT_INST_FOREACH_STATUS_OKAY(WITH_INTR) > 0 - -#define COND_ANY_POLLING(code) COND_CODE_1(USES_POLLING, code, ()) -#define COND_THIS_INTERRUPT(n, code) COND_CODE_1(INST_INTR_DEFINED(n), code, ()) - -#define KSCAN_INTR_CFG_INIT(inst_idx) GPIO_DT_SPEC_GET(DT_DRV_INST(inst_idx), interrupt_gpios) - -struct kscan_charlieplex_data { - const struct device *dev; - kscan_callback_t callback; - struct k_work_delayable work; - int64_t scan_time; /* Timestamp of the current or scheduled scan. */ - struct gpio_callback irq_callback; - /** - * Current state of the matrix as a flattened 2D array of length - * (config->cells.length ^2) - */ - struct zmk_debounce_state *charlieplex_state; -}; - -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - -struct kscan_charlieplex_config { - struct kscan_gpio_list cells; - struct zmk_debounce_config debounce_config; - int32_t debounce_scan_period_ms; - int32_t poll_period_ms; - bool use_interrupt; - const struct gpio_dt_spec interrupt; -}; - -/** - * Get the index into a matrix state array from a row and column. - * There are effectively (n) cols and (n-1) rows, but we use the full col x row space - * as a safety measure against someone accidentally defining a transform RC at (p,p) - */ -static int state_index(const struct kscan_charlieplex_config *config, const int row, - const int col) { - __ASSERT(row < config->cells.len, "Invalid row %i", row); - __ASSERT(col < config->cells.len, "Invalid column %i", col); - __ASSERT(col != row, "Invalid column row pair %i, %i", col, row); - - return (col * config->cells.len) + row; -} - -static int kscan_charlieplex_set_as_input(const struct gpio_dt_spec *gpio) { - if (!device_is_ready(gpio->port)) { - LOG_ERR("GPIO is not ready: %s", gpio->port->name); - return -ENODEV; - } - - gpio_flags_t pull_flag = - ((gpio->dt_flags & GPIO_ACTIVE_LOW) == GPIO_ACTIVE_LOW) ? GPIO_PULL_UP : GPIO_PULL_DOWN; - - int err = gpio_pin_configure_dt(gpio, GPIO_INPUT | pull_flag); - if (err) { - LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); - return err; - } - return 0; -} - -static int kscan_charlieplex_set_as_output(const struct gpio_dt_spec *gpio) { - if (!device_is_ready(gpio->port)) { - LOG_ERR("GPIO is not ready: %s", gpio->port->name); - return -ENODEV; - } - - int err = gpio_pin_configure_dt(gpio, GPIO_OUTPUT); - if (err) { - LOG_ERR("Unable to configure pin %u on %s for output", gpio->pin, gpio->port->name); - return err; - } - - err = gpio_pin_set_dt(gpio, 1); - if (err) { - LOG_ERR("Failed to set output pin %u active: %i", gpio->pin, err); - } - return err; -} - -static int kscan_charlieplex_set_all_as_input(const struct device *dev) { - const struct kscan_charlieplex_config *config = dev->config; - int err = 0; - for (int i = 0; i < config->cells.len; i++) { - err = kscan_charlieplex_set_as_input(&config->cells.gpios[i]); - if (err) { - return err; - } - } - - return 0; -} - -static int kscan_charlieplex_set_all_outputs(const struct device *dev, const int value) { - const struct kscan_charlieplex_config *config = dev->config; - - for (int i = 0; i < config->cells.len; i++) { - const struct gpio_dt_spec *gpio = &config->cells.gpios[i]; - int err = gpio_pin_configure_dt(gpio, GPIO_OUTPUT); - if (err) { - LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); - return err; - } - - err = gpio_pin_set_dt(gpio, value); - if (err) { - LOG_ERR("Failed to set output %i to %i: %i", i, value, err); - return err; - } - } - - return 0; -} - -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_charlieplex_disconnect_all(const struct device *dev) { - const struct kscan_charlieplex_config *config = dev->config; - - for (int i = 0; i < config->cells.len; i++) { - const struct gpio_dt_spec *gpio = &config->cells.gpios[i]; - int err = gpio_pin_configure_dt(gpio, GPIO_DISCONNECTED); - if (err) { - LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); - return err; - } - } - - return 0; -} - -#endif - -static int kscan_charlieplex_interrupt_configure(const struct device *dev, - const gpio_flags_t flags) { - const struct kscan_charlieplex_config *config = dev->config; - const struct gpio_dt_spec *gpio = &config->interrupt; - - int err = gpio_pin_interrupt_configure_dt(gpio, flags); - if (err) { - LOG_ERR("Unable to configure interrupt for pin %u on %s", gpio->pin, gpio->port->name); - return err; - } - - return 0; -} - -static int kscan_charlieplex_interrupt_enable(const struct device *dev) { - int err = kscan_charlieplex_interrupt_configure(dev, GPIO_INT_LEVEL_ACTIVE); - if (err) { - return err; - } - - // While interrupts are enabled, set all outputs active so an pressed key will trigger - return kscan_charlieplex_set_all_outputs(dev, 1); -} - -static void kscan_charlieplex_irq_callback(const struct device *port, struct gpio_callback *cb, - const gpio_port_pins_t _pin) { - struct kscan_charlieplex_data *data = - CONTAINER_OF(cb, struct kscan_charlieplex_data, irq_callback); - - // Disable our interrupt to avoid re-entry while we scan. - kscan_charlieplex_interrupt_configure(data->dev, GPIO_INT_DISABLE); - data->scan_time = k_uptime_get(); - k_work_reschedule(&data->work, K_NO_WAIT); -} - -static void kscan_charlieplex_read_continue(const struct device *dev) { - const struct kscan_charlieplex_config *config = dev->config; - struct kscan_charlieplex_data *data = dev->data; - - data->scan_time += config->debounce_scan_period_ms; - - k_work_reschedule(&data->work, K_TIMEOUT_ABS_MS(data->scan_time)); -} - -static void kscan_charlieplex_read_end(const struct device *dev) { - struct kscan_charlieplex_data *data = dev->data; - const struct kscan_charlieplex_config *config = dev->config; - - if (config->use_interrupt) { - // Return to waiting for an interrupt. - kscan_charlieplex_interrupt_enable(dev); - } else { - data->scan_time += config->poll_period_ms; - - // Return to polling slowly. - k_work_reschedule(&data->work, K_TIMEOUT_ABS_MS(data->scan_time)); - } -} - -static int kscan_charlieplex_read(const struct device *dev) { - struct kscan_charlieplex_data *data = dev->data; - const struct kscan_charlieplex_config *config = dev->config; - bool continue_scan = false; - - // NOTE: RR vs MATRIX: set all pins as input, in case there was a failure on a - // previous scan, and one of the pins is still set as output - int err = kscan_charlieplex_set_all_as_input(dev); - if (err) { - return err; - } - - // Scan the matrix. - for (int row = 0; row < config->cells.len; row++) { - const struct gpio_dt_spec *out_gpio = &config->cells.gpios[row]; - err = kscan_charlieplex_set_as_output(out_gpio); - if (err) { - return err; - } - -#if CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BEFORE_INPUTS > 0 - k_busy_wait(CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BEFORE_INPUTS); -#endif - - for (int col = 0; col < config->cells.len; col++) { - if (col == row) { - continue; // pin can't drive itself - } - const struct gpio_dt_spec *in_gpio = &config->cells.gpios[col]; - const int index = state_index(config, row, col); - - struct zmk_debounce_state *state = &data->charlieplex_state[index]; - zmk_debounce_update(state, gpio_pin_get_dt(in_gpio), config->debounce_scan_period_ms, - &config->debounce_config); - - // NOTE: RR vs MATRIX: because we don't need an input/output => row/column - // setup, we can update in the same loop. - if (zmk_debounce_get_changed(state)) { - const bool pressed = zmk_debounce_is_pressed(state); - - LOG_DBG("Sending event at %i,%i state %s", row, col, pressed ? "on" : "off"); - data->callback(dev, row, col, pressed); - } - continue_scan = continue_scan || zmk_debounce_is_active(state); - } - - err = kscan_charlieplex_set_as_input(out_gpio); - if (err) { - return err; - } -#if CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BETWEEN_OUTPUTS > 0 - k_busy_wait(CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BETWEEN_OUTPUTS); -#endif - } - - if (continue_scan) { - // At least one key is pressed or the debouncer has not yet decided if - // it is pressed. Poll quickly until everything is released. - kscan_charlieplex_read_continue(dev); - } else { - // All keys are released. Return to normal. - kscan_charlieplex_read_end(dev); - } - - return 0; -} - -static void kscan_charlieplex_work_handler(struct k_work *work) { - struct k_work_delayable *dwork = CONTAINER_OF(work, struct k_work_delayable, work); - struct kscan_charlieplex_data *data = CONTAINER_OF(dwork, struct kscan_charlieplex_data, work); - kscan_charlieplex_read(data->dev); -} - -static int kscan_charlieplex_configure(const struct device *dev, const kscan_callback_t callback) { - if (!callback) { - return -EINVAL; - } - - struct kscan_charlieplex_data *data = dev->data; - data->callback = callback; - return 0; -} - -static int kscan_charlieplex_enable(const struct device *dev) { - struct kscan_charlieplex_data *data = dev->data; - data->scan_time = k_uptime_get(); - - // Read will automatically start interrupts/polling once done. - return kscan_charlieplex_read(dev); -} - -static int kscan_charlieplex_disable(const struct device *dev) { - struct kscan_charlieplex_data *data = dev->data; - k_work_cancel_delayable(&data->work); - - const struct kscan_charlieplex_config *config = dev->config; - if (config->use_interrupt) { - return kscan_charlieplex_interrupt_configure(dev, GPIO_INT_DISABLE); - } - return 0; -} - -static int kscan_charlieplex_init_inputs(const struct device *dev) { - const struct kscan_charlieplex_config *config = dev->config; - - for (int i = 0; i < config->cells.len; i++) { - int err = kscan_charlieplex_set_as_input(&config->cells.gpios[i]); - if (err) { - return err; - } - } - - return 0; -} - -static int kscan_charlieplex_init_interrupt(const struct device *dev) { - struct kscan_charlieplex_data *data = dev->data; - - const struct kscan_charlieplex_config *config = dev->config; - const struct gpio_dt_spec *gpio = &config->interrupt; - int err = kscan_charlieplex_set_as_input(gpio); - if (err) { - return err; - } - - gpio_init_callback(&data->irq_callback, kscan_charlieplex_irq_callback, BIT(gpio->pin)); - err = gpio_add_callback(gpio->port, &data->irq_callback); - if (err) { - LOG_ERR("Error adding the callback to the input device: %i", err); - } - return err; -} - -static void kscan_charlieplex_setup_pins(const struct device *dev) { - kscan_charlieplex_init_inputs(dev); - kscan_charlieplex_set_all_outputs(dev, 0); - - const struct kscan_charlieplex_config *config = dev->config; - if (config->use_interrupt) { - kscan_charlieplex_init_interrupt(dev); - } -} - -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_charlieplex_pm_action(const struct device *dev, enum pm_device_action action) { - switch (action) { - case PM_DEVICE_ACTION_SUSPEND: - kscan_charlieplex_interrupt_configure(dev, GPIO_INT_DISABLE); - kscan_charlieplex_disconnect_all(dev); - - return kscan_charlieplex_disable(dev); - case PM_DEVICE_ACTION_RESUME: - kscan_charlieplex_setup_pins(dev); - - return kscan_charlieplex_enable(dev); - default: - return -ENOTSUP; - } -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_charlieplex_init(const struct device *dev) { - struct kscan_charlieplex_data *data = dev->data; - - data->dev = dev; - - k_work_init_delayable(&data->work, kscan_charlieplex_work_handler); - -#if IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_init_suspended(dev); - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_enable(dev); -#endif - -#else - kscan_charlieplex_setup_pins(dev); -#endif - - return 0; -} - -static const struct kscan_driver_api kscan_charlieplex_api = { - .config = kscan_charlieplex_configure, - .enable_callback = kscan_charlieplex_enable, - .disable_callback = kscan_charlieplex_disable, -}; - -#define KSCAN_CHARLIEPLEX_INIT(n) \ - BUILD_ASSERT(INST_DEBOUNCE_PRESS_MS(n) <= DEBOUNCE_COUNTER_MAX, \ - "ZMK_KSCAN_DEBOUNCE_PRESS_MS or debounce-press-ms is too large"); \ - BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ - "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ - \ - static struct zmk_debounce_state kscan_charlieplex_state_##n[INST_CHARLIEPLEX_LEN(n)]; \ - static const struct gpio_dt_spec kscan_charlieplex_cells_##n[] = { \ - LISTIFY(INST_LEN(n), KSCAN_GPIO_CFG_INIT, (, ), n)}; \ - static struct kscan_charlieplex_data kscan_charlieplex_data_##n = { \ - .charlieplex_state = kscan_charlieplex_state_##n, \ - }; \ - \ - static const struct kscan_charlieplex_config kscan_charlieplex_config_##n = { \ - .cells = KSCAN_GPIO_LIST(kscan_charlieplex_cells_##n), \ - .debounce_config = \ - { \ - .debounce_press_ms = INST_DEBOUNCE_PRESS_MS(n), \ - .debounce_release_ms = INST_DEBOUNCE_RELEASE_MS(n), \ - }, \ - .debounce_scan_period_ms = DT_INST_PROP(n, debounce_scan_period_ms), \ - COND_ANY_POLLING((.poll_period_ms = DT_INST_PROP(n, poll_period_ms), )) \ - COND_THIS_INTERRUPT(n, (.use_interrupt = INST_INTR_DEFINED(n), )) \ - COND_THIS_INTERRUPT(n, (.interrupt = KSCAN_INTR_CFG_INIT(n), ))}; \ - \ - PM_DEVICE_DT_INST_DEFINE(n, kscan_charlieplex_pm_action); \ - \ - DEVICE_DT_INST_DEFINE(n, &kscan_charlieplex_init, PM_DEVICE_DT_INST_GET(n), \ - &kscan_charlieplex_data_##n, &kscan_charlieplex_config_##n, POST_KERNEL, \ - CONFIG_KSCAN_INIT_PRIORITY, &kscan_charlieplex_api); - -DT_INST_FOREACH_STATUS_OKAY(KSCAN_CHARLIEPLEX_INIT); diff --git a/app/module/drivers/kscan/kscan_gpio_demux.c b/app/module/drivers/kscan/kscan_gpio_demux.c index 10433c5a..2cbe116d 100644 --- a/app/module/drivers/kscan/kscan_gpio_demux.c +++ b/app/module/drivers/kscan/kscan_gpio_demux.c @@ -9,7 +9,6 @@ #include #include #include -#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -106,8 +105,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); } \ \ static void kscan_gpio_work_handler_##n(struct k_work *work) { \ - struct k_work_delayable *d_work = k_work_delayable_from_work(work); \ - struct kscan_gpio_data_##n *data = CONTAINER_OF(d_work, struct kscan_gpio_data_##n, work); \ + struct kscan_gpio_data_##n *data = CONTAINER_OF(work, struct kscan_gpio_data_##n, work); \ kscan_gpio_read_##n(data->dev); \ } \ \ diff --git a/app/module/drivers/kscan/kscan_gpio_direct.c b/app/module/drivers/kscan/kscan_gpio_direct.c index 45fc8634..5b227784 100644 --- a/app/module/drivers/kscan/kscan_gpio_direct.c +++ b/app/module/drivers/kscan/kscan_gpio_direct.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -42,14 +41,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define COND_POLL_OR_INTERRUPTS(pollcode, intcode) \ COND_CODE_1(CONFIG_ZMK_KSCAN_DIRECT_POLLING, pollcode, intcode) -#define INST_INPUTS_LEN(n) \ - COND_CODE_1(DT_INST_NODE_HAS_PROP(n, input_gpios), (DT_INST_PROP_LEN(n, input_gpios)), \ - (DT_INST_PROP_LEN(n, input_keys))) - -#define KSCAN_GPIO_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ +#define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) +#define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) -#define KSCAN_KEY_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - KSCAN_GPIO_GET_BY_IDX(DT_INST_PROP_BY_IDX(inst_idx, input_keys, idx), gpios, 0) struct kscan_direct_irq_callback { const struct device *dev; @@ -198,10 +192,10 @@ static int kscan_direct_read(const struct device *dev) { for (int i = 0; i < data->inputs.len; i++) { const struct kscan_gpio *gpio = &data->inputs.gpios[i]; - struct zmk_debounce_state *deb_state = &data->pin_state[gpio->index]; + struct zmk_debounce_state *state = &data->pin_state[gpio->index]; - if (zmk_debounce_get_changed(deb_state)) { - const bool pressed = zmk_debounce_is_pressed(deb_state); + if (zmk_debounce_get_changed(state)) { + const bool pressed = zmk_debounce_is_pressed(state); LOG_DBG("Sending event at 0,%i state %s", gpio->index, pressed ? "on" : "off"); data->callback(dev, 0, gpio->index, pressed); @@ -210,7 +204,7 @@ static int kscan_direct_read(const struct device *dev) { } } - continue_scan = continue_scan || zmk_debounce_is_active(deb_state); + continue_scan = continue_scan || zmk_debounce_is_active(state); } if (continue_scan) { @@ -294,24 +288,6 @@ static int kscan_direct_init_input_inst(const struct device *dev, const struct g return 0; } -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_direct_disconnect_inputs(const struct device *dev) { - const struct kscan_direct_data *data = dev->data; - - for (int i = 0; i < data->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; - int err = gpio_pin_configure_dt(gpio, GPIO_DISCONNECTED); - if (err) { - return err; - } - } - - return 0; -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - static int kscan_direct_init_inputs(const struct device *dev) { const struct kscan_direct_data *data = dev->data; const struct kscan_direct_config *config = dev->config; @@ -335,41 +311,13 @@ static int kscan_direct_init(const struct device *dev) { // Sort inputs by port so we can read each port just once per scan. kscan_gpio_list_sort_by_port(&data->inputs); - k_work_init_delayable(&data->work, kscan_direct_work_handler); - -#if IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_init_suspended(dev); - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_enable(dev); -#endif - -#else - kscan_direct_init_inputs(dev); -#endif + k_work_init_delayable(&data->work, kscan_direct_work_handler); return 0; } -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_direct_pm_action(const struct device *dev, enum pm_device_action action) { - switch (action) { - case PM_DEVICE_ACTION_SUSPEND: - kscan_direct_disconnect_inputs(dev); - return kscan_direct_disable(dev); - case PM_DEVICE_ACTION_RESUME: - kscan_direct_init_inputs(dev); - return kscan_direct_enable(dev); - default: - return -ENOTSUP; - } -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - static const struct kscan_driver_api kscan_direct_api = { .config = kscan_direct_configure, .enable_callback = kscan_direct_enable, @@ -383,9 +331,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static struct kscan_gpio kscan_direct_inputs_##n[] = { \ - COND_CODE_1(DT_INST_NODE_HAS_PROP(n, input_gpios), \ - (LISTIFY(INST_INPUTS_LEN(n), KSCAN_GPIO_DIRECT_INPUT_CFG_INIT, (, ), n)), \ - (LISTIFY(INST_INPUTS_LEN(n), KSCAN_KEY_DIRECT_INPUT_CFG_INIT, (, ), n)))}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct zmk_debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ @@ -397,7 +343,7 @@ static const struct kscan_driver_api kscan_direct_api = { .pin_state = kscan_direct_state_##n, \ COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ \ - static const struct kscan_direct_config kscan_direct_config_##n = { \ + static struct kscan_direct_config kscan_direct_config_##n = { \ .debounce_config = \ { \ .debounce_press_ms = INST_DEBOUNCE_PRESS_MS(n), \ @@ -408,9 +354,7 @@ static const struct kscan_driver_api kscan_direct_api = { .toggle_mode = DT_INST_PROP(n, toggle_mode), \ }; \ \ - PM_DEVICE_DT_INST_DEFINE(n, kscan_direct_pm_action); \ - \ - DEVICE_DT_INST_DEFINE(n, &kscan_direct_init, PM_DEVICE_DT_INST_GET(n), &kscan_direct_data_##n, \ + DEVICE_DT_INST_DEFINE(n, &kscan_direct_init, NULL, &kscan_direct_data_##n, \ &kscan_direct_config_##n, POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, \ &kscan_direct_api); diff --git a/app/module/drivers/kscan/kscan_gpio_matrix.c b/app/module/drivers/kscan/kscan_gpio_matrix.c index d68f1593..0d8a3190 100644 --- a/app/module/drivers/kscan/kscan_gpio_matrix.c +++ b/app/module/drivers/kscan/kscan_gpio_matrix.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -291,7 +290,7 @@ static int kscan_matrix_read(const struct device *dev) { } static void kscan_matrix_work_handler(struct k_work *work) { - struct k_work_delayable *dwork = k_work_delayable_from_work(work); + struct k_work_delayable *dwork = CONTAINER_OF(work, struct k_work_delayable, work); struct kscan_matrix_data *data = CONTAINER_OF(dwork, struct kscan_matrix_data, work); kscan_matrix_read(data->dev); } @@ -405,44 +404,6 @@ static int kscan_matrix_init_outputs(const struct device *dev) { return 0; } -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_matrix_disconnect_inputs(const struct device *dev) { - const struct kscan_matrix_data *data = dev->data; - - for (int i = 0; i < data->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; - int err = gpio_pin_configure_dt(gpio, GPIO_DISCONNECTED); - if (err) { - return err; - } - } - - return 0; -} - -static int kscan_matrix_disconnect_outputs(const struct device *dev) { - const struct kscan_matrix_config *config = dev->config; - - for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; - int err = gpio_pin_configure_dt(gpio, GPIO_DISCONNECTED); - if (err) { - return err; - } - } - - return 0; -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -static void kscan_matrix_setup_pins(const struct device *dev) { - kscan_matrix_init_inputs(dev); - kscan_matrix_init_outputs(dev); - kscan_matrix_set_all_outputs(dev, 0); -} - static int kscan_matrix_init(const struct device *dev) { struct kscan_matrix_data *data = dev->data; @@ -451,41 +412,15 @@ static int kscan_matrix_init(const struct device *dev) { // Sort inputs by port so we can read each port just once per scan. kscan_gpio_list_sort_by_port(&data->inputs); + kscan_matrix_init_inputs(dev); + kscan_matrix_init_outputs(dev); + kscan_matrix_set_all_outputs(dev, 0); + k_work_init_delayable(&data->work, kscan_matrix_work_handler); -#if IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_init_suspended(dev); - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_enable(dev); -#endif - -#else - kscan_matrix_setup_pins(dev); -#endif - return 0; } -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int kscan_matrix_pm_action(const struct device *dev, enum pm_device_action action) { - switch (action) { - case PM_DEVICE_ACTION_SUSPEND: - kscan_matrix_disconnect_inputs(dev); - kscan_matrix_disconnect_outputs(dev); - - return kscan_matrix_disable(dev); - case PM_DEVICE_ACTION_RESUME: - kscan_matrix_setup_pins(dev); - return kscan_matrix_enable(dev); - default: - return -ENOTSUP; - } -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - static const struct kscan_driver_api kscan_matrix_api = { .config = kscan_matrix_configure, .enable_callback = kscan_matrix_enable, @@ -515,7 +450,7 @@ static const struct kscan_driver_api kscan_matrix_api = { .matrix_state = kscan_matrix_state_##n, \ COND_INTERRUPTS((.irqs = kscan_matrix_irqs_##n, ))}; \ \ - static const struct kscan_matrix_config kscan_matrix_config_##n = { \ + static struct kscan_matrix_config kscan_matrix_config_##n = { \ .rows = ARRAY_SIZE(kscan_matrix_rows_##n), \ .cols = ARRAY_SIZE(kscan_matrix_cols_##n), \ .outputs = \ @@ -530,9 +465,7 @@ static const struct kscan_driver_api kscan_matrix_api = { .diode_direction = INST_DIODE_DIR(n), \ }; \ \ - PM_DEVICE_DT_INST_DEFINE(n, kscan_matrix_pm_action); \ - \ - DEVICE_DT_INST_DEFINE(n, &kscan_matrix_init, PM_DEVICE_DT_INST_GET(n), &kscan_matrix_data_##n, \ + DEVICE_DT_INST_DEFINE(n, &kscan_matrix_init, NULL, &kscan_matrix_data_##n, \ &kscan_matrix_config_##n, POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, \ &kscan_matrix_api); diff --git a/app/module/drivers/kscan/kscan_mock.c b/app/module/drivers/kscan/kscan_mock.c index f4c9dced..604e164c 100644 --- a/app/module/drivers/kscan/kscan_mock.c +++ b/app/module/drivers/kscan/kscan_mock.c @@ -9,7 +9,6 @@ #include #include #include -#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -62,15 +61,8 @@ static int kscan_mock_configure(const struct device *dev, kscan_callback_t callb } \ } \ static void kscan_mock_work_handler_##n(struct k_work *work) { \ - struct k_work_delayable *d_work = k_work_delayable_from_work(work); \ - struct kscan_mock_data *data = CONTAINER_OF(d_work, struct kscan_mock_data, work); \ + struct kscan_mock_data *data = CONTAINER_OF(work, struct kscan_mock_data, work); \ const struct kscan_mock_config_##n *cfg = data->dev->config; \ - if (data->event_index >= DT_INST_PROP_LEN(n, events)) { \ - if (cfg->exit_after) \ - exit(0); \ - else \ - return; \ - } \ uint32_t ev = cfg->events[data->event_index]; \ LOG_DBG("ev %u row %d column %d state %d\n", ev, ZMK_MOCK_ROW(ev), ZMK_MOCK_COL(ev), \ ZMK_MOCK_IS_PRESS(ev)); \ diff --git a/app/module/drivers/sensor/CMakeLists.txt b/app/module/drivers/sensor/CMakeLists.txt index 370fe15a..9654600a 100644 --- a/app/module/drivers/sensor/CMakeLists.txt +++ b/app/module/drivers/sensor/CMakeLists.txt @@ -3,6 +3,4 @@ add_subdirectory_ifdef(CONFIG_ZMK_BATTERY battery) add_subdirectory_ifdef(CONFIG_EC11 ec11) -add_subdirectory_ifdef(CONFIG_ZMK_MAX17048 max17048) - -add_subdirectory_ifdef(CONFIG_ZMK_SENSOR_ENCODER_MOCK encoder_mock) +add_subdirectory_ifdef(CONFIG_MAX17048 max17048) diff --git a/app/module/drivers/sensor/Kconfig b/app/module/drivers/sensor/Kconfig index c5f4a721..ad570c58 100644 --- a/app/module/drivers/sensor/Kconfig +++ b/app/module/drivers/sensor/Kconfig @@ -7,6 +7,4 @@ rsource "battery/Kconfig" rsource "ec11/Kconfig" rsource "max17048/Kconfig" -rsource "encoder_mock/Kconfig" - endif # SENSOR diff --git a/app/module/drivers/sensor/ec11/Kconfig b/app/module/drivers/sensor/ec11/Kconfig index 7c10eaa9..5da32728 100644 --- a/app/module/drivers/sensor/ec11/Kconfig +++ b/app/module/drivers/sensor/ec11/Kconfig @@ -11,7 +11,7 @@ menuconfig EC11 if EC11 -choice EC11_TRIGGER_MODE +choice prompt "Trigger mode" default EC11_TRIGGER_NONE help diff --git a/app/module/drivers/sensor/ec11/ec11.c b/app/module/drivers/sensor/ec11/ec11.c index 3702d6e1..ee8b41e7 100644 --- a/app/module/drivers/sensor/ec11/ec11.c +++ b/app/module/drivers/sensor/ec11/ec11.c @@ -148,8 +148,8 @@ int ec11_init(const struct device *dev) { } #define EC11_INST(n) \ - static struct ec11_data ec11_data_##n; \ - static const struct ec11_config ec11_cfg_##n = { \ + struct ec11_data ec11_data_##n; \ + const struct ec11_config ec11_cfg_##n = { \ .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ .resolution = DT_INST_PROP_OR(n, resolution, 1), \ diff --git a/app/module/drivers/sensor/ec11/ec11.h b/app/module/drivers/sensor/ec11/ec11.h index d99ef606..4e2e5d26 100644 --- a/app/module/drivers/sensor/ec11/ec11.h +++ b/app/module/drivers/sensor/ec11/ec11.h @@ -33,7 +33,7 @@ struct ec11_data { const struct sensor_trigger *trigger; #if defined(CONFIG_EC11_TRIGGER_OWN_THREAD) - K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_EC11_THREAD_STACK_SIZE); + K_THREAD_STACK_MEMBER(thread_stack, CONFIG_EC11_THREAD_STACK_SIZE); struct k_sem gpio_sem; struct k_thread thread; #elif defined(CONFIG_EC11_TRIGGER_GLOBAL_THREAD) diff --git a/app/module/drivers/sensor/encoder_mock/CMakeLists.txt b/app/module/drivers/sensor/encoder_mock/CMakeLists.txt deleted file mode 100644 index 8271067e..00000000 --- a/app/module/drivers/sensor/encoder_mock/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -zephyr_include_directories(.) - -zephyr_library() - -zephyr_library_sources(encoder_mock.c) \ No newline at end of file diff --git a/app/module/drivers/sensor/encoder_mock/Kconfig b/app/module/drivers/sensor/encoder_mock/Kconfig deleted file mode 100644 index 9b9dd00a..00000000 --- a/app/module/drivers/sensor/encoder_mock/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config ZMK_SENSOR_ENCODER_MOCK - bool "Mock Encoder Sensor" - default y - depends on DT_HAS_ZMK_SENSOR_ENCODER_MOCK_ENABLED diff --git a/app/module/drivers/sensor/encoder_mock/encoder_mock.c b/app/module/drivers/sensor/encoder_mock/encoder_mock.c deleted file mode 100644 index 283ee916..00000000 --- a/app/module/drivers/sensor/encoder_mock/encoder_mock.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_sensor_encoder_mock - -#include -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct enc_mock_config { - uint16_t startup_delay; - uint16_t event_period; - bool exit_after; - const int16_t *events; - size_t events_len; -}; - -struct enc_mock_data { - const struct sensor_trigger *trigger; - sensor_trigger_handler_t handler; - - size_t event_index; - struct k_work_delayable work; - const struct device *dev; -}; - -static void enc_mock_work_cb(struct k_work *work) { - struct k_work_delayable *dwork = CONTAINER_OF(work, struct k_work_delayable, work); - struct enc_mock_data *data = CONTAINER_OF(dwork, struct enc_mock_data, work); - - const struct device *dev = data->dev; - - data->handler(dev, data->trigger); -} - -static int enc_mock_trigger_set(const struct device *dev, const struct sensor_trigger *trig, - sensor_trigger_handler_t handler) { - struct enc_mock_data *drv_data = dev->data; - const struct enc_mock_config *drv_cfg = dev->config; - - drv_data->trigger = trig; - drv_data->handler = handler; - - int ret = k_work_schedule(&drv_data->work, K_MSEC(drv_cfg->startup_delay)); - if (ret < 0) { - LOG_WRN("Failed to schedule next mock sensor event %d", ret); - return ret; - } - - return 0; -} - -static int enc_mock_sample_fetch(const struct device *dev, enum sensor_channel chan) { - struct enc_mock_data *drv_data = dev->data; - const struct enc_mock_config *drv_cfg = dev->config; - - drv_data->event_index++; - - if (drv_data->event_index < drv_cfg->events_len - 1) { - k_work_schedule(&drv_data->work, K_MSEC(drv_cfg->event_period)); - } else if (drv_cfg->exit_after) { - exit(0); - } - return 0; -} - -static int enc_mock_channel_get(const struct device *dev, enum sensor_channel chan, - struct sensor_value *val) { - struct enc_mock_data *drv_data = dev->data; - const struct enc_mock_config *drv_cfg = dev->config; - - val->val1 = drv_cfg->events[drv_data->event_index]; - - return 0; -} - -static const struct sensor_driver_api enc_mock_driver_api = { - .trigger_set = enc_mock_trigger_set, - .sample_fetch = enc_mock_sample_fetch, - .channel_get = enc_mock_channel_get, -}; - -int enc_mock_init(const struct device *dev) { - struct enc_mock_data *drv_data = dev->data; - - drv_data->dev = dev; - drv_data->event_index = -1; - - k_work_init_delayable(&drv_data->work, enc_mock_work_cb); - - return 0; -} - -#define ENC_MOCK_INST(n) \ - struct enc_mock_data enc_mock_data_##n = {}; \ - const int16_t mock_data_##n[] = DT_INST_PROP(n, events); \ - const struct enc_mock_config enc_mock_cfg_##n = { \ - .events = mock_data_##n, \ - .events_len = DT_INST_PROP_LEN(n, events), \ - .startup_delay = DT_INST_PROP(n, event_startup_delay), \ - .event_period = DT_INST_PROP(n, event_period), \ - .exit_after = DT_INST_PROP(n, exit_after), \ - }; \ - DEVICE_DT_INST_DEFINE(n, enc_mock_init, NULL, &enc_mock_data_##n, &enc_mock_cfg_##n, \ - POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &enc_mock_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(ENC_MOCK_INST) diff --git a/app/module/drivers/sensor/max17048/CMakeLists.txt b/app/module/drivers/sensor/max17048/CMakeLists.txt index 43b7af4d..e895fa11 100644 --- a/app/module/drivers/sensor/max17048/CMakeLists.txt +++ b/app/module/drivers/sensor/max17048/CMakeLists.txt @@ -5,5 +5,5 @@ zephyr_include_directories(.) zephyr_library() -zephyr_library_sources_ifdef(CONFIG_ZMK_MAX17048 max17048.c) -zephyr_library_sources_ifndef(CONFIG_ZMK_MAX17048 ${ZEPHYR_BASE}/misc/empty_file.c) +zephyr_library_sources_ifdef(CONFIG_MAX17048 max17048.c) +zephyr_library_sources_ifndef(CONFIG_MAX17048 ${ZEPHYR_BASE}/misc/empty_file.c) diff --git a/app/module/drivers/sensor/max17048/Kconfig b/app/module/drivers/sensor/max17048/Kconfig index 432949a2..8a7ec16e 100644 --- a/app/module/drivers/sensor/max17048/Kconfig +++ b/app/module/drivers/sensor/max17048/Kconfig @@ -1,16 +1,18 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -menuconfig ZMK_MAX17048 +DT_COMPAT_MAXIM_MAX17048 := maxim,max17048 + +menuconfig MAX17048 bool "MAX17048/9 I2C-based Fuel Gauge" - default y - depends on DT_HAS_ZMK_MAXIM_MAX17048_ENABLED && I2C + default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX17048)) + depends on I2C select ZMK_BATTERY help Enable driver for MAX17048/9 I2C-based Fuel Gauge. Supports measuring battery voltage and state-of-charge. -if ZMK_MAX17048 +if MAX17048 config SENSOR_MAX17048_INIT_PRIORITY int "Init priority" diff --git a/app/module/drivers/sensor/max17048/max17048.c b/app/module/drivers/sensor/max17048/max17048.c index 43d877c4..24cfe093 100644 --- a/app/module/drivers/sensor/max17048/max17048.c +++ b/app/module/drivers/sensor/max17048/max17048.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#define DT_DRV_COMPAT zmk_maxim_max17048 +#define DT_DRV_COMPAT maxim_max17048 #include #include @@ -205,8 +205,8 @@ static const struct sensor_driver_api max17048_api_table = {.sample_fetch = max1 .channel_get = max17048_channel_get}; #define MAX17048_INIT(inst) \ - static const struct max17048_config max17048_##inst##_config = { \ - .i2c_bus = I2C_DT_SPEC_INST_GET(inst)}; \ + static struct max17048_config max17048_##inst##_config = {.i2c_bus = \ + I2C_DT_SPEC_INST_GET(inst)}; \ \ static struct max17048_drv_data max17048_##inst##_drvdata = { \ .raw_state_of_charge = 0, \ diff --git a/app/module/dts/bindings/input/zmk,input-mock.yaml b/app/module/dts/bindings/input/zmk,input-mock.yaml deleted file mode 100644 index a7efe425..00000000 --- a/app/module/dts/bindings/input/zmk,input-mock.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Allows defining a mock input driver that simulates periodic input events. - -compatible: "zmk,input-mock" - -properties: - event-startup-delay: - type: int - default: 0 - description: Milliseconds to delay before starting generating the events - event-period: - type: int - description: Milliseconds between each generated event - events: - type: array - description: List of tuples of (type, code, value, sync) - exit-after: - type: boolean diff --git a/app/module/dts/bindings/kscan/zmk,kscan-gpio-charlieplex.yaml b/app/module/dts/bindings/kscan/zmk,kscan-gpio-charlieplex.yaml deleted file mode 100644 index f8da1d27..00000000 --- a/app/module/dts/bindings/kscan/zmk,kscan-gpio-charlieplex.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: GPIO keyboard charlieplex matrix controller - -compatible: "zmk,kscan-gpio-charlieplex" - -include: kscan.yaml - -properties: - gpios: - type: phandle-array - required: true - interrupt-gpios: - type: phandle-array - debounce-press-ms: - type: int - default: 5 - description: Debounce time for key press in milliseconds. Use 0 for eager debouncing. - debounce-release-ms: - type: int - default: 5 - description: Debounce time for key release in milliseconds. - debounce-scan-period-ms: - type: int - default: 1 - description: Time between reads in milliseconds when any key is pressed. - poll-period-ms: - type: int - default: 1 - description: Time between reads in milliseconds diff --git a/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml b/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml index 4953d5cf..f477b591 100644 --- a/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml +++ b/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml @@ -10,11 +10,7 @@ include: kscan.yaml properties: input-gpios: type: phandle-array - required: false - input-keys: - type: phandles - required: false - description: List of gpio-key references + required: true debounce-period: type: int required: false diff --git a/app/module/dts/bindings/sensor/alps,ec11.yaml b/app/module/dts/bindings/sensor/alps,ec11.yaml index 46dad31d..3672ea30 100644 --- a/app/module/dts/bindings/sensor/alps,ec11.yaml +++ b/app/module/dts/bindings/sensor/alps,ec11.yaml @@ -6,8 +6,7 @@ compatible: "alps,ec11" properties: label: type: string - required: false - deprecated: true + required: true a-gpios: type: phandle-array required: true diff --git a/app/module/dts/bindings/sensor/zmk,maxim-max17048.yml b/app/module/dts/bindings/sensor/maxim,max17048.yml similarity index 85% rename from app/module/dts/bindings/sensor/zmk,maxim-max17048.yml rename to app/module/dts/bindings/sensor/maxim,max17048.yml index 765aeee5..786f4b86 100644 --- a/app/module/dts/bindings/sensor/zmk,maxim-max17048.yml +++ b/app/module/dts/bindings/sensor/maxim,max17048.yml @@ -7,6 +7,6 @@ description: > This is a representation of the Maxim max17048 I2C Fuel Gauge. -compatible: "zmk,maxim-max17048" +compatible: "maxim,max17048" include: [i2c-device.yaml] diff --git a/app/module/dts/bindings/sensor/zmk,sensor-encoder-mock.yaml b/app/module/dts/bindings/sensor/zmk,sensor-encoder-mock.yaml deleted file mode 100644 index 74ff1f5b..00000000 --- a/app/module/dts/bindings/sensor/zmk,sensor-encoder-mock.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: | - Allows defining a mock sensor driver that simulates periodic encoder rotation events. - -compatible: "zmk,sensor-encoder-mock" - -properties: - event-startup-delay: - type: int - default: 0 - description: Milliseconds to delay before starting generating the events - event-period: - type: int - description: Milliseconds between each generated event - events: - type: array - description: List of angle events to generate - exit-after: - type: boolean diff --git a/app/module/dts/bindings/test-behaviors/zmk,behavior_add_layer.yaml b/app/module/dts/bindings/test-behaviors/zmk,behavior_add_layer.yaml deleted file mode 100644 index f07ef608..00000000 --- a/app/module/dts/bindings/test-behaviors/zmk,behavior_add_layer.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Layer Adder Behavior - -compatible: "zmk,behavior-add-layer" - -include: zero_param.yaml diff --git a/app/module/dts/bindings/test-behaviors/zmk,behavior_move_layer.yaml b/app/module/dts/bindings/test-behaviors/zmk,behavior_move_layer.yaml deleted file mode 100644 index b23448d6..00000000 --- a/app/module/dts/bindings/test-behaviors/zmk,behavior_move_layer.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Layer Mover Behavior - -compatible: "zmk,behavior-move-layer" - -include: two_param.yaml diff --git a/app/module/dts/bindings/test-behaviors/zmk,behavior_remove_layer.yaml b/app/module/dts/bindings/test-behaviors/zmk,behavior_remove_layer.yaml deleted file mode 100644 index cdc20a8a..00000000 --- a/app/module/dts/bindings/test-behaviors/zmk,behavior_remove_layer.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Layer Remover Behavior - -compatible: "zmk,behavior-remove-layer" - -include: one_param.yaml diff --git a/app/module/dts/bindings/test-behaviors/zmk,behavior_set_layer_binding_at_idx.yaml b/app/module/dts/bindings/test-behaviors/zmk,behavior_set_layer_binding_at_idx.yaml deleted file mode 100644 index 078587d4..00000000 --- a/app/module/dts/bindings/test-behaviors/zmk,behavior_set_layer_binding_at_idx.yaml +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Layer Binding Setter Behavior - -compatible: "zmk,behavior-set-layer-binding-at-idx" - -include: two_param.yaml - -properties: - bindings: - type: phandle-array - required: true diff --git a/app/module/test-behaviors/CMakeLists.txt b/app/module/test-behaviors/CMakeLists.txt deleted file mode 100644 index b228f581..00000000 --- a/app/module/test-behaviors/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -if (((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) AND CONFIG_ZMK_TEST_BEHAVIORS) - target_sources(app PRIVATE behavior_add_layer.c) - target_sources(app PRIVATE behavior_move_layer.c) - target_sources(app PRIVATE behavior_remove_layer.c) - target_sources(app PRIVATE behavior_set_layer_binding_at_idx.c) -endif() diff --git a/app/module/test-behaviors/Kconfig b/app/module/test-behaviors/Kconfig deleted file mode 100644 index 6a9458db..00000000 --- a/app/module/test-behaviors/Kconfig +++ /dev/null @@ -1,2 +0,0 @@ -config ZMK_TEST_BEHAVIORS - bool "Include behaviors used for testing purposes" \ No newline at end of file diff --git a/app/module/test-behaviors/behavior_add_layer.c b/app/module/test-behaviors/behavior_add_layer.c deleted file mode 100644 index 47927cb7..00000000 --- a/app/module/test-behaviors/behavior_add_layer.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_add_layer - -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if (IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)) && (DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)) - -static int on_add_layer_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - int new_layer = zmk_keymap_add_layer(); - if (new_layer >= 0) { - LOG_DBG("Added layer %d", new_layer); - return 0; - } - switch (new_layer) { - case -ENOSPC: - LOG_ERR("No more layers can be added. Out of memory."); - return -ENOSPC; - default: - LOG_ERR("Unknown error adding layer: %d", new_layer); - return new_layer; - } -} - -static int on_add_layer_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return 0; -} - -static const struct behavior_driver_api behavior_add_layer_driver_api = { - .binding_pressed = on_add_layer_binding_pressed, - .binding_released = on_add_layer_binding_released}; - -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_add_layer_driver_api); - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) AND - // DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) \ No newline at end of file diff --git a/app/module/test-behaviors/behavior_move_layer.c b/app/module/test-behaviors/behavior_move_layer.c deleted file mode 100644 index 74551629..00000000 --- a/app/module/test-behaviors/behavior_move_layer.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_move_layer - -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if (IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)) && (DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)) - -static int on_move_layer_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - int result = zmk_keymap_move_layer(binding->param1, binding->param2); - - if (result < 0) { - LOG_ERR("Failed to move layer from index %d to index %d (err: %d)", binding->param1, - binding->param2, result); - return result; - } - - LOG_DBG("Moved layer from index %d to index %d", binding->param1, binding->param2); - return 0; -} - -static int on_move_layer_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return 0; -} - -static const struct behavior_driver_api behavior_move_layer_driver_api = { - .binding_pressed = on_move_layer_binding_pressed, - .binding_released = on_move_layer_binding_released}; - -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_move_layer_driver_api); - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) AND - // DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) \ No newline at end of file diff --git a/app/module/test-behaviors/behavior_remove_layer.c b/app/module/test-behaviors/behavior_remove_layer.c deleted file mode 100644 index 58c7fafd..00000000 --- a/app/module/test-behaviors/behavior_remove_layer.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_remove_layer - -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if (IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)) && (DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)) - -static int on_remove_layer_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - int result = zmk_keymap_remove_layer(binding->param1); - if (result >= 0) { - LOG_DBG("Removed layer at index %d", binding->param1); - return 0; - } - switch (result) { - case -EINVAL: - LOG_ERR("Layer at index %d not found", binding->param1); - return -EINVAL; - default: - LOG_DBG("Unknown error removing layer at index %d: %d", binding->param1, result); - return result; - } -} - -static int on_remove_layer_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return 0; -} - -static const struct behavior_driver_api behavior_remove_layer_driver_api = { - .binding_pressed = on_remove_layer_binding_pressed, - .binding_released = on_remove_layer_binding_released}; - -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_remove_layer_driver_api); -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) AND - // DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) \ No newline at end of file diff --git a/app/module/test-behaviors/behavior_set_layer_binding_at_idx.c b/app/module/test-behaviors/behavior_set_layer_binding_at_idx.c deleted file mode 100644 index 49bf0dd3..00000000 --- a/app/module/test-behaviors/behavior_set_layer_binding_at_idx.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_set_layer_binding_at_idx - -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -struct behavior_set_layer_binding_at_idx_config { - size_t bindings_len; - struct zmk_behavior_binding *bindings; -}; - -struct behavior_set_layer_binding_at_idx_data { - size_t current_idx; -}; - -static int on_set_layer_binding_at_idx_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); - const struct behavior_set_layer_binding_at_idx_config *cfg = dev->config; - struct behavior_set_layer_binding_at_idx_data *data = dev->data; - - if (cfg->bindings_len == 0) { - LOG_ERR("No bindings configured"); - return -EINVAL; - } - - struct zmk_behavior_binding *binding_to_set = &cfg->bindings[data->current_idx]; - - int result = - zmk_keymap_set_layer_binding_at_idx(binding->param1, binding->param2, *binding_to_set); - - if (result < 0) { - LOG_ERR("Failed to set binding at layer %d, index %d (err: %d)", binding->param1, - binding->param2, result); - return result; - } - - LOG_DBG("Set binding at layer %d, index %d to binding %zu/%zu", binding->param1, - binding->param2, data->current_idx + 1, cfg->bindings_len); - - // Move to next binding, wrap around if at end - data->current_idx = (data->current_idx + 1) % cfg->bindings_len; - - return 0; -} - -static int on_set_layer_binding_at_idx_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return 0; -} - -static const struct behavior_driver_api behavior_set_layer_binding_at_idx_driver_api = { - .binding_pressed = on_set_layer_binding_at_idx_binding_pressed, - .binding_released = on_set_layer_binding_at_idx_binding_released}; - -static int behavior_set_layer_binding_at_idx_init(const struct device *dev) { - struct behavior_set_layer_binding_at_idx_data *data = dev->data; - data->current_idx = 0; - return 0; -}; - -#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) - -#define TRANSFORMED_BINDINGS(node) \ - {LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (, ), DT_DRV_INST(node))} - -#define SET_LAYER_BINDING_AT_IDX_INST(n) \ - static struct behavior_set_layer_binding_at_idx_data \ - behavior_set_layer_binding_at_idx_data_##n = {}; \ - \ - static const struct zmk_behavior_binding \ - behavior_set_layer_binding_at_idx_config_##n##_bindings[DT_INST_PROP_LEN(n, bindings)] = \ - TRANSFORMED_BINDINGS(n); \ - static const struct behavior_set_layer_binding_at_idx_config \ - behavior_set_layer_binding_at_idx_config_##n = { \ - .bindings_len = DT_INST_PROP_LEN(n, bindings), \ - .bindings = behavior_set_layer_binding_at_idx_config_##n##_bindings}; \ - \ - BEHAVIOR_DT_INST_DEFINE(n, behavior_set_layer_binding_at_idx_init, NULL, \ - &behavior_set_layer_binding_at_idx_data_##n, \ - &behavior_set_layer_binding_at_idx_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_set_layer_binding_at_idx_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(SET_LAYER_BINDING_AT_IDX_INST) - -#endif // DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/module/zephyr/module.yml b/app/module/zephyr/module.yml index 70de6620..219b2cfd 100644 --- a/app/module/zephyr/module.yml +++ b/app/module/zephyr/module.yml @@ -3,4 +3,3 @@ build: kconfig: Kconfig settings: dts_root: . - board_root: . diff --git a/app/prj.conf b/app/prj.conf index cd2bc13f..e69de29b 100644 --- a/app/prj.conf +++ b/app/prj.conf @@ -1 +0,0 @@ -CONFIG_APPLICATION_DEFINED_SYSCALL=y \ No newline at end of file diff --git a/app/run-ble-test.sh b/app/run-ble-test.sh deleted file mode 100755 index f8e70537..00000000 --- a/app/run-ble-test.sh +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if [ -z "$1" ]; then - echo "Usage: ./run-ble-test.sh " - exit 1 -fi - -path=$1 -if [ "$path" = "all" ]; then - path="tests" -fi - -if [ -z "${BSIM_OUT_PATH}" ]; then - echo "BSIM_OUT_PATH needs to be set before running this script." - exit 1 -fi - -if [ -z "$BLE_TESTS_NO_CENTRAL_BUILD" ]; then - if ! [ -e build/tests/ble/central ]; then - west build -d build/tests/ble/central -b nrf52_bsim tests/ble/central > /dev/null 2>&1 - else - west build -d build/tests/ble/central - fi - - cp build/tests/ble/central/zephyr/zephyr.exe "${BSIM_OUT_PATH}/bin/ble_test_central.exe" - - if ! [ -e build/tests/ble/private_central ]; then - west build -d build/tests/ble/private_central -b nrf52_bsim tests/ble/central -- -DCONFIG_BT_PRIVACY=y -DCONFIG_BT_SCAN_WITH_IDENTITY=n > /dev/null 2>&1 - else - west build -d build/tests/ble/private_central - fi - - cp build/tests/ble/private_central/zephyr/zephyr.exe "${BSIM_OUT_PATH}/bin/ble_test_private_central.exe" - - if ! [ -e build/tests/ble/no_auto_sec_central ]; then - west build -d build/tests/ble/no_auto_sec_central -b nrf52_bsim tests/ble/central -- -DCONFIG_BT_ATT_RETRY_ON_SEC_ERR=n > /dev/null 2>&1 - else - west build -d build/tests/ble/no_auto_sec_central - fi - - cp build/tests/ble/no_auto_sec_central/zephyr/zephyr.exe "${BSIM_OUT_PATH}/bin/ble_test_no_auto_sec_central.exe" -fi - -testcases=$(find $path -name nrf52_bsim.keymap -exec dirname \{\} \;) -num_cases=$(echo "$testcases" | wc -l) -if [ $num_cases -gt 1 ] || [ "$testcases" != "${path%%/}" ]; then - echo "$testcases" - echo "" > ./build/tests/pass-fail.log - echo "$testcases" | BLE_TESTS_QUIET_OUTPUT=y BLE_TESTS_NO_CENTRAL_BUILD=y xargs -L 1 -P ${J:-4} ./run-ble-test.sh - err=$? - sort -k2 ./build/tests/pass-fail.log - exit $err -fi - -testcase="$path" -echo "Running $testcase:" - -shopt -s nullglob -for file in $(pwd)/$testcase/peripheral*.overlay ; do - pn=$(basename -s .overlay ${file}) - west build -d build/${testcase%%/}_${pn}/ -b nrf52_bsim//zmk_test_mock -- -DZMK_CONFIG="$(pwd)/$testcase" -DEXTRA_DTC_OVERLAY_FILE="${file}" > /dev/null 2>&1 - - if [ $? -gt 0 ]; then - echo "FAILED: $testcase peripheral ${pn} did not build" | tee -a ./build/tests/pass-fail.log - exit 1 - fi -done -shopt -u nullglob - -extra_cmake_args="" -if ls $(pwd)/$testcase/peripheral*.overlay >/dev/null 2>&1; then - echo "Found peripheral overlays, building the test as a split central" - extra_cmake_args="-DCONFIG_ZMK_SPLIT_ROLE_CENTRAL=y" -fi - -west build -d build/$testcase -b nrf52_bsim//zmk_test_mock -- -DZMK_CONFIG="$(pwd)/$testcase" ${extra_cmake_args} > /dev/null 2>&1 -if [ $? -gt 0 ]; then - echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log - exit 1 -fi - -if [ -n "${BLE_TESTS_QUIET_OUTPUT}" ]; then - output_dev="/dev/null" -else - output_dev="/dev/stdout" -fi - -exe_name=${testcase//\//_} -# Remove trailing underscores -exe_name=${exe_name%%_} - -start_dir=$(pwd) -cp build/$testcase/zephyr/zmk.exe "${BSIM_OUT_PATH}/bin/${exe_name}" - -shopt -s nullglob -for file in $(pwd)/$testcase/peripheral*.overlay ; do - pn=$(basename -s .overlay ${file}) - cp ./build/${testcase%%/}_${pn}/zephyr/zmk.exe "${BSIM_OUT_PATH}/bin/${exe_name}_${pn}.exe" -done -shopt -u nullglob - -pushd "${BSIM_OUT_PATH}/bin" > /dev/null 2>&1 -if [ -e "${start_dir}/build/$testcase/output.log" ]; then - rm "${start_dir}/build/$testcase/output.log" -fi - -sibling_counts=$(wc -l ${start_dir}/${testcase}/siblings.txt | cut -d' ' -f1) -./${exe_name} -d=0 -s=${exe_name} | tee -a "${start_dir}/build/$testcase/output.log" > "${output_dev}" & -./bs_device_handbrake -s=${exe_name} -d=1 -r=10 > "${output_dev}" & - -cat "${start_dir}/${testcase}/siblings.txt" | -while IFS= read -r line -do - ${line} -s=${exe_name} | tee -a "${start_dir}/build/$testcase/output.log" > "${output_dev}" & -done - -./bs_2G4_phy_v1 -s=${exe_name} -D=$(( 2 + sibling_counts )) -sim_length=50e6 > "${output_dev}" 2>&1 - -popd > /dev/null 2>&1 - -cat build/$testcase/output.log | sed -E -n -f $testcase/events.patterns > build/$testcase/filtered_output.log - -diff -auZ $testcase/snapshot.log build/$testcase/filtered_output.log -if [ $? -gt 0 ]; then - if [ -f $testcase/pending ]; then - echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log - exit 0 - fi - - if [ -n "${ZMK_TESTS_AUTO_ACCEPT}" ]; then - echo "Auto-accepting failure for $testcase" - cp build/$testcase/filtered_output.log $testcase/snapshot.log - else - echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log - exit 1 - fi -fi - -echo "PASS: $testcase" | tee -a ./build/tests/pass-fail.log -exit 0 diff --git a/app/run-test.sh b/app/run-test.sh index aa84ed69..6935f2c8 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -3,14 +3,6 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -## -# Optional environment variables, paths can be absolute or relative to $(pwd): -# ZMK_SRC_DIR: Path to zmk/app (default is ./) -# ZMK_BUILD_DIR: Path to build directory (default is $ZMK_SRC_DIR/build) -# ZMK_EXTRA_MODULES: Path to at most one module (in addition to any in west.yml) -# ZMK_TESTS_AUTO_ACCEPT: Replace snapshot files with new key events -# J: Number of parallel jobs (default is 4) - if [ -z "$1" ]; then echo "Usage: ./run-test.sh " exit 1 @@ -18,68 +10,38 @@ fi path="$1" if [ $path = "all" ]; then - path="${ZMK_SRC_DIR-.}/tests" + path="tests" fi -ZMK_BUILD_DIR=${ZMK_BUILD_DIR:-${ZMK_SRC_DIR:-.}/build} -mkdir -p ${ZMK_BUILD_DIR}/tests - -testcases=$(find $path -name native_sim.keymap -exec dirname \{\} \;) +testcases=$(find $path -name native_posix_64.keymap -exec dirname \{\} \;) num_cases=$(echo "$testcases" | wc -l) if [ $num_cases -gt 1 ] || [ "$testcases" != "$path" ]; then - echo "" >${ZMK_BUILD_DIR}/tests/pass-fail.log - echo "$testcases" | xargs -L 1 -P ${J:-4} ${0} + echo "" > ./build/tests/pass-fail.log + echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh err=$? - sort -k2 ${ZMK_BUILD_DIR}/tests/pass-fail.log + sort -k2 ./build/tests/pass-fail.log exit $err fi -testcase=$(realpath $path | sed -n -e "s|.*/tests/||p") +testcase="$path" echo "Running $testcase:" -build_cmd="west build ${ZMK_SRC_DIR:+-s $ZMK_SRC_DIR} -d ${ZMK_BUILD_DIR}/tests/$testcase \ - -b native_sim//zmk_test_mock -p -- -DCONFIG_ASSERT=y -DZMK_CONFIG="$(realpath $path)" \ - ${ZMK_EXTRA_MODULES:+-DZMK_EXTRA_MODULES="$(realpath ${ZMK_EXTRA_MODULES})"}" - -# Add extra cmake arguments from file if it exists -if [ -f "$path/extra-cmake-args" ]; then - extra_args=$(cat "$path/extra-cmake-args" | tr '\n' ' ') - build_cmd="$build_cmd $extra_args" -fi - -build_log_tmp="${ZMK_BUILD_DIR}/tmp/$testcase/build.log" -build_log="${ZMK_BUILD_DIR}/tests/$testcase/build.log" -mkdir -p $(dirname $build_log_tmp) -$build_cmd >"$build_log_tmp" 2>&1 -build_exit_code=$? -mv "$build_log_tmp" "$build_log" -rmdir -p $(dirname $build_log_tmp) 2>/dev/null || true - -if [ $build_exit_code -gt 0 ]; then - echo "FAILED: $testcase did not build (see ${build_log})" | tee -a ${ZMK_BUILD_DIR}/tests/pass-fail.log +west build -d build/$testcase -b native_posix_64 -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1 +if [ $? -gt 0 ]; then + echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log exit 1 fi -${ZMK_BUILD_DIR}/tests/$testcase/zephyr/zmk.exe | - sed -e "s/.*> //" | - tee ${ZMK_BUILD_DIR}/tests/$testcase/keycode_events_full.log | - sed -n -f $path/events.patterns >${ZMK_BUILD_DIR}/tests/$testcase/keycode_events.log - -diff -auZ $path/keycode_events.snapshot ${ZMK_BUILD_DIR}/tests/$testcase/keycode_events.log +./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log +diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then - if [ -f $path/pending ]; then - echo "PENDING: $testcase" | tee -a ${ZMK_BUILD_DIR}/tests/pass-fail.log + if [ -f $testcase/pending ]; then + echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log exit 0 fi - - if [ -n "${ZMK_TESTS_AUTO_ACCEPT}" ]; then - echo "Auto-accepting failure for $testcase" - cp ${ZMK_BUILD_DIR}/tests/$testcase/keycode_events.log $path/keycode_events.snapshot - else - echo "FAILED: $testcase" | tee -a ${ZMK_BUILD_DIR}/tests/pass-fail.log - exit 1 - fi + echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log + exit 1 fi -echo "PASS: $testcase" | tee -a ${ZMK_BUILD_DIR}/tests/pass-fail.log +echo "PASS: $testcase" | tee -a ./build/tests/pass-fail.log exit 0 diff --git a/app/scripts/west_commands/test.py b/app/scripts/west_commands/test.py index 737622de..53133491 100644 --- a/app/scripts/west_commands/test.py +++ b/app/scripts/west_commands/test.py @@ -2,11 +2,11 @@ # SPDX-License-Identifier: MIT """Test runner for ZMK.""" +import os import subprocess -from pathlib import Path -from west import log # use this for user output from west.commands import WestCommand +from west import log # use this for user output class Test(WestCommand): @@ -17,8 +17,6 @@ class Test(WestCommand): description="Run the ZMK testsuite.", ) - self.appdir = Path(__file__).resolve().parents[2] - def do_add_parser(self, parser_adder): parser = parser_adder.add_parser( self.name, @@ -36,7 +34,8 @@ class Test(WestCommand): def do_run(self, args, unknown_args): # the run-test script assumes the app directory is the current dir. + os.chdir(f"{self.topdir}/app") completed_process = subprocess.run( - ["./run-test.sh", args.test_path], cwd=self.appdir + [f"{self.topdir}/app/run-test.sh", args.test_path] ) exit(completed_process.returncode) diff --git a/app/snippets/nrf52833-nosd/nrf52833-nosd.overlay b/app/snippets/nrf52833-nosd/nrf52833-nosd.overlay deleted file mode 100644 index 8eb41693..00000000 --- a/app/snippets/nrf52833-nosd/nrf52833-nosd.overlay +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/delete-node/ &sd_partition; -/delete-node/ &code_partition; - -&flash0 { - partitions { - sd_partition: partition@0 { - reg = <0x0 DT_SIZE_K(4)>; - }; - code_partition: partition@1000 { - reg = ; - }; - /* - * 32KB storage partition at 0x6c000 is unchanged - */ - }; -}; diff --git a/app/snippets/nrf52833-nosd/snippet.yml b/app/snippets/nrf52833-nosd/snippet.yml deleted file mode 100644 index f20ace16..00000000 --- a/app/snippets/nrf52833-nosd/snippet.yml +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -name: nrf52833-nosd -append: - EXTRA_DTC_OVERLAY_FILE: nrf52833-nosd.overlay diff --git a/app/snippets/nrf52840-nosd/nrf52840-nosd.overlay b/app/snippets/nrf52840-nosd/nrf52840-nosd.overlay deleted file mode 100644 index ec339e8f..00000000 --- a/app/snippets/nrf52840-nosd/nrf52840-nosd.overlay +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/delete-node/ &sd_partition; -/delete-node/ &code_partition; -/delete-node/ &storage_partition; - -&flash0 { - partitions { - sd_partition: partition@0 { - reg = <0x0 DT_SIZE_K(4)>; - }; - - code_partition: partition@1000 { - reg = ; - }; - - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ - - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - reg = ; - }; - }; -}; diff --git a/app/snippets/nrf52840-nosd/snippet.yml b/app/snippets/nrf52840-nosd/snippet.yml deleted file mode 100644 index 620e3227..00000000 --- a/app/snippets/nrf52840-nosd/snippet.yml +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -name: nrf52840-nosd -append: - EXTRA_DTC_OVERLAY_FILE: nrf52840-nosd.overlay diff --git a/app/snippets/studio-rpc-usb-uart/snippet.yml b/app/snippets/studio-rpc-usb-uart/snippet.yml deleted file mode 100644 index ea5a17b2..00000000 --- a/app/snippets/studio-rpc-usb-uart/snippet.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -name: studio-rpc-usb-uart -append: - DTS_EXTRA_CPPFLAGS: -DZMK_BEHAVIORS_KEEP_ALL - EXTRA_DTC_OVERLAY_FILE: studio-rpc-usb-uart.overlay - EXTRA_CONF_FILE: studio-rpc-usb-uart.conf diff --git a/app/snippets/studio-rpc-usb-uart/studio-rpc-usb-uart.conf b/app/snippets/studio-rpc-usb-uart/studio-rpc-usb-uart.conf deleted file mode 100644 index 84f25e09..00000000 --- a/app/snippets/studio-rpc-usb-uart/studio-rpc-usb-uart.conf +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -CONFIG_ZMK_USB=y -CONFIG_USB_DEVICE_STACK=y -CONFIG_USB_CDC_ACM=y -CONFIG_SERIAL=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y diff --git a/app/snippets/studio-rpc-usb-uart/studio-rpc-usb-uart.overlay b/app/snippets/studio-rpc-usb-uart/studio-rpc-usb-uart.overlay deleted file mode 100644 index 82da5a10..00000000 --- a/app/snippets/studio-rpc-usb-uart/studio-rpc-usb-uart.overlay +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/ { - chosen { - zmk,studio-rpc-uart = &snippet_studio_rpc_usb_uart; - }; -}; - -&zephyr_udc0 { - snippet_studio_rpc_usb_uart: snippet_studio_rpc_usb_uart { - compatible = "zephyr,cdc-acm-uart"; - }; -}; - diff --git a/app/snippets/zmk-usb-logging/snippet.yml b/app/snippets/zmk-usb-logging/snippet.yml deleted file mode 100644 index 8f218085..00000000 --- a/app/snippets/zmk-usb-logging/snippet.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: zmk-usb-logging -append: - EXTRA_CONF_FILE: zmk-usb-logging.conf - EXTRA_DTC_OVERLAY_FILE: zmk-usb-logging.overlay diff --git a/app/snippets/zmk-usb-logging/zmk-usb-logging.conf b/app/snippets/zmk-usb-logging/zmk-usb-logging.conf deleted file mode 100644 index 57893df5..00000000 --- a/app/snippets/zmk-usb-logging/zmk-usb-logging.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_ZMK_USB_LOGGING=y - diff --git a/app/snippets/zmk-usb-logging/zmk-usb-logging.overlay b/app/snippets/zmk-usb-logging/zmk-usb-logging.overlay deleted file mode 100644 index 5ceda583..00000000 --- a/app/snippets/zmk-usb-logging/zmk-usb-logging.overlay +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/ { - chosen { - zephyr,console = &snippet_zmk_usb_logging_uart; - zephyr,shell-uart = &snippet_zmk_usb_logging_uart; - }; -}; - -&zephyr_udc0 { - snippet_zmk_usb_logging_uart: snippet_zmk_usb_logging_uart { - compatible = "zephyr,cdc-acm-uart"; - }; -}; diff --git a/app/src/activity.c b/app/src/activity.c index f4dc3562..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include @@ -18,19 +18,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#include - #include #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) #include #endif -#if IS_ENABLED(CONFIG_ZMK_POINTING) -#include -#endif - -bool is_usb_power_present(void) { +bool is_usb_power_present() { #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) return zmk_usb_is_powered(); #else @@ -48,9 +42,9 @@ static uint32_t activity_last_uptime; #define MAX_SLEEP_MS CONFIG_ZMK_IDLE_SLEEP_TIMEOUT #endif -int raise_event(void) { - return raise_zmk_activity_state_changed( - (struct zmk_activity_state_changed){.state = activity_state}); +int raise_event() { + return ZMK_EVENT_RAISE(new_zmk_activity_state_changed( + (struct zmk_activity_state_changed){.state = activity_state})); } int set_state(enum zmk_activity_state state) { @@ -61,16 +55,14 @@ int set_state(enum zmk_activity_state state) { return raise_event(); } -enum zmk_activity_state zmk_activity_get_state(void) { return activity_state; } +enum zmk_activity_state zmk_activity_get_state() { return activity_state; } -static int note_activity(void) { +int activity_event_listener(const zmk_event_t *eh) { activity_last_uptime = k_uptime_get(); return set_state(ZMK_ACTIVITY_ACTIVE); } -static int activity_event_listener(const zmk_event_t *eh) { return note_activity(); } - void activity_work_handler(struct k_work *work) { int32_t current = k_uptime_get(); int32_t inactive_time = current - activity_last_uptime; @@ -78,14 +70,7 @@ void activity_work_handler(struct k_work *work) { if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { // Put devices in suspend power mode before sleeping set_state(ZMK_ACTIVITY_SLEEP); - - if (zmk_pm_suspend_devices() < 0) { - LOG_ERR("Failed to suspend all the devices"); - zmk_pm_resume_devices(); - return; - } - - sys_poweroff(); + pm_state_force(0U, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { @@ -95,11 +80,11 @@ void activity_work_handler(struct k_work *work) { K_WORK_DEFINE(activity_work, activity_work_handler); -void activity_expiry_function(struct k_timer *_timer) { k_work_submit(&activity_work); } +void activity_expiry_function() { k_work_submit(&activity_work); } K_TIMER_DEFINE(activity_timer, activity_expiry_function, NULL); -static int activity_init(void) { +int activity_init() { activity_last_uptime = k_uptime_get(); k_timer_start(&activity_timer, K_SECONDS(1), K_SECONDS(1)); @@ -110,18 +95,4 @@ ZMK_LISTENER(activity, activity_event_listener); ZMK_SUBSCRIPTION(activity, zmk_position_state_changed); ZMK_SUBSCRIPTION(activity, zmk_sensor_event); -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -static void note_activity_work_cb(struct k_work *_work) { note_activity(); } - -K_WORK_DEFINE(note_activity_work, note_activity_work_cb); - -static void activity_input_listener(struct input_event *ev, void *user_data) { - k_work_submit(¬e_activity_work); -} - -INPUT_CALLBACK_DEFINE(NULL, activity_input_listener, NULL); - -#endif - SYS_INIT(activity_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/src/backlight.c b/app/src/backlight.c index 22b73066..f633ddb7 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -42,7 +42,7 @@ struct backlight_state { static struct backlight_state state = {.brightness = CONFIG_ZMK_BACKLIGHT_BRT_START, .on = IS_ENABLED(CONFIG_ZMK_BACKLIGHT_ON_START)}; -static int zmk_backlight_update(void) { +static int zmk_backlight_update() { uint8_t brt = zmk_backlight_get_brt(); LOG_DBG("Update backlight brightness: %d%%", brt); @@ -58,7 +58,7 @@ static int zmk_backlight_update(void) { #if IS_ENABLED(CONFIG_SETTINGS) static int backlight_settings_load_cb(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { + void *cb_arg, void *param) { const char *next; if (settings_name_steq(name, "state", &next) && !next) { if (len != sizeof(state)) { @@ -66,18 +66,11 @@ static int backlight_settings_load_cb(const char *name, size_t len, settings_rea } int rc = read_cb(cb_arg, &state, sizeof(state)); - if (rc >= 0) { - rc = zmk_backlight_update(); - } - return MIN(rc, 0); } return -ENOENT; } -SETTINGS_STATIC_HANDLER_DEFINE(backlight, "backlight", NULL, backlight_settings_load_cb, NULL, - NULL); - static void backlight_save_work_handler(struct k_work *work) { settings_save_one("backlight/state", &state, sizeof(state)); } @@ -85,13 +78,18 @@ static void backlight_save_work_handler(struct k_work *work) { static struct k_work_delayable backlight_save_work; #endif -static int zmk_backlight_init(void) { +static int zmk_backlight_init(const struct device *_arg) { if (!device_is_ready(backlight_dev)) { LOG_ERR("Backlight device \"%s\" is not ready", backlight_dev->name); return -ENODEV; } #if IS_ENABLED(CONFIG_SETTINGS) + settings_subsys_init(); + int rc = settings_load_subtree_direct("backlight", backlight_settings_load_cb, NULL); + if (rc != 0) { + LOG_ERR("Failed to load backlight settings: %d", rc); + } k_work_init_delayable(&backlight_save_work, backlight_save_work_handler); #endif #if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB) @@ -100,7 +98,7 @@ static int zmk_backlight_init(void) { return zmk_backlight_update(); } -static int zmk_backlight_update_and_save(void) { +static int zmk_backlight_update_and_save() { int rc = zmk_backlight_update(); if (rc != 0) { return rc; @@ -114,20 +112,20 @@ static int zmk_backlight_update_and_save(void) { #endif } -int zmk_backlight_on(void) { +int zmk_backlight_on() { state.brightness = MAX(state.brightness, CONFIG_ZMK_BACKLIGHT_BRT_STEP); state.on = true; return zmk_backlight_update_and_save(); } -int zmk_backlight_off(void) { +int zmk_backlight_off() { state.on = false; return zmk_backlight_update_and_save(); } -int zmk_backlight_toggle(void) { return state.on ? zmk_backlight_off() : zmk_backlight_on(); } +int zmk_backlight_toggle() { return state.on ? zmk_backlight_off() : zmk_backlight_on(); } -bool zmk_backlight_is_on(void) { return state.on; } +bool zmk_backlight_is_on() { return state.on; } int zmk_backlight_set_brt(uint8_t brightness) { state.brightness = MIN(brightness, BRT_MAX); @@ -135,14 +133,14 @@ int zmk_backlight_set_brt(uint8_t brightness) { return zmk_backlight_update_and_save(); } -uint8_t zmk_backlight_get_brt(void) { return state.on ? state.brightness : 0; } +uint8_t zmk_backlight_get_brt() { return state.on ? state.brightness : 0; } uint8_t zmk_backlight_calc_brt(int direction) { int brt = state.brightness + (direction * CONFIG_ZMK_BACKLIGHT_BRT_STEP); return CLAMP(brt, 0, BRT_MAX); } -uint8_t zmk_backlight_calc_brt_cycle(void) { +uint8_t zmk_backlight_calc_brt_cycle() { if (state.brightness == BRT_MAX) { return 0; } else { diff --git a/app/src/battery.c b/app/src/battery.c index 811baf8e..87a25e08 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -18,13 +18,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include -#include #include static uint8_t last_state_of_charge = 0; -uint8_t zmk_battery_state_of_charge(void) { return last_state_of_charge; } +uint8_t zmk_battery_state_of_charge() { return last_state_of_charge; } #if DT_HAS_CHOSEN(zmk_battery) static const struct device *const battery = DEVICE_DT_GET(DT_CHOSEN(zmk_battery)); @@ -34,29 +32,11 @@ static const struct device *const battery = DEVICE_DT_GET(DT_CHOSEN(zmk_battery) static const struct device *battery; #endif -#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING_FETCH_MODE_LITHIUM_VOLTAGE) -static uint8_t lithium_ion_mv_to_pct(int16_t bat_mv) { - // Simple linear approximation of a battery based off adafruit's discharge graph: - // https://learn.adafruit.com/li-ion-and-lipoly-batteries/voltages - - if (bat_mv >= 4200) { - return 100; - } else if (bat_mv <= 3450) { - return 0; - } - - return bat_mv * 2 / 15 - 459; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING_FETCH_MODE_LITHIUM_VOLTAGE) - static int zmk_battery_update(const struct device *battery) { struct sensor_value state_of_charge; - int rc; -#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING_FETCH_MODE_STATE_OF_CHARGE) + int rc = sensor_sample_fetch_chan(battery, SENSOR_CHAN_GAUGE_STATE_OF_CHARGE); - rc = sensor_sample_fetch_chan(battery, SENSOR_CHAN_GAUGE_STATE_OF_CHARGE); if (rc != 0) { LOG_DBG("Failed to fetch battery values: %d", rc); return rc; @@ -68,43 +48,10 @@ static int zmk_battery_update(const struct device *battery) { LOG_DBG("Failed to get battery state of charge: %d", rc); return rc; } -#elif IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING_FETCH_MODE_LITHIUM_VOLTAGE) - rc = sensor_sample_fetch_chan(battery, SENSOR_CHAN_VOLTAGE); - if (rc != 0) { - LOG_DBG("Failed to fetch battery values: %d", rc); - return rc; - } - - struct sensor_value voltage; - rc = sensor_channel_get(battery, SENSOR_CHAN_VOLTAGE, &voltage); - - if (rc != 0) { - LOG_DBG("Failed to get battery voltage: %d", rc); - return rc; - } - - uint16_t mv = voltage.val1 * 1000 + (voltage.val2 / 1000); - state_of_charge.val1 = lithium_ion_mv_to_pct(mv); - - LOG_DBG("State of change %d from %d mv", state_of_charge.val1, mv); -#else -#error "Not a supported reporting fetch mode" -#endif if (last_state_of_charge != state_of_charge.val1) { last_state_of_charge = state_of_charge.val1; - rc = raise_zmk_battery_state_changed( - (struct zmk_battery_state_changed){.state_of_charge = last_state_of_charge}); - - if (rc != 0) { - LOG_ERR("Failed to raise battery state changed event: %d", rc); - return rc; - } - } - -#if IS_ENABLED(CONFIG_BT_BAS) - if (bt_bas_get_battery_level() != last_state_of_charge) { LOG_DBG("Setting BAS GATT battery level to %d.", last_state_of_charge); rc = bt_bas_set_battery_level(last_state_of_charge); @@ -113,8 +60,10 @@ static int zmk_battery_update(const struct device *battery) { LOG_WRN("Failed to set BAS GATT battery level (err %d)", rc); return rc; } + + rc = ZMK_EVENT_RAISE(new_zmk_battery_state_changed( + (struct zmk_battery_state_changed){.state_of_charge = last_state_of_charge})); } -#endif return rc; } @@ -135,13 +84,7 @@ static void zmk_battery_timer(struct k_timer *timer) { K_TIMER_DEFINE(battery_timer, zmk_battery_timer, NULL); -static void zmk_battery_start_reporting() { - if (device_is_ready(battery)) { - k_timer_start(&battery_timer, K_NO_WAIT, K_SECONDS(CONFIG_ZMK_BATTERY_REPORT_INTERVAL)); - } -} - -static int zmk_battery_init(void) { +static int zmk_battery_init(const struct device *_arg) { #if !DT_HAS_CHOSEN(zmk_battery) battery = device_get_binding("BATTERY"); @@ -157,30 +100,9 @@ static int zmk_battery_init(void) { return -ENODEV; } - zmk_battery_start_reporting(); + k_timer_start(&battery_timer, K_NO_WAIT, K_SECONDS(CONFIG_ZMK_BATTERY_REPORT_INTERVAL)); + return 0; } -static int battery_event_listener(const zmk_event_t *eh) { - - if (as_zmk_activity_state_changed(eh)) { - switch (zmk_activity_get_state()) { - case ZMK_ACTIVITY_ACTIVE: - zmk_battery_start_reporting(); - return 0; - case ZMK_ACTIVITY_IDLE: - case ZMK_ACTIVITY_SLEEP: - k_timer_stop(&battery_timer); - return 0; - default: - break; - } - } - return -ENOTSUP; -} - -ZMK_LISTENER(battery, battery_event_listener); - -ZMK_SUBSCRIPTION(battery, zmk_activity_state_changed); - SYS_INIT(zmk_battery_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/src/behavior.c b/app/src/behavior.c deleted file mode 100644 index c7899d62..00000000 --- a/app/src/behavior.c +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS) && \ - IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_ID_TYPE_SETTINGS_TABLE) - -#include - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -#include -#endif - -#include -#include -#include -#include - -#include - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -const struct device *zmk_behavior_get_binding(const char *name) { - return behavior_get_binding(name); -} - -const struct device *z_impl_behavior_get_binding(const char *name) { - if (name == NULL || name[0] == '\0') { - return NULL; - } - - STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { - if (device_is_ready(item->device) && item->device->name == name) { - return item->device; - } - } - - STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { - if (device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { - return item->device; - } - } - - return NULL; -} - -static int invoke_locally(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, bool pressed) { - if (pressed) { - return behavior_keymap_binding_pressed(binding, event); - } else { - return behavior_keymap_binding_released(binding, event); - } -} - -int zmk_behavior_invoke_binding(const struct zmk_behavior_binding *src_binding, - struct zmk_behavior_binding_event event, bool pressed) { - // We want to make a copy of this, since it may be converted from - // relative to absolute before being invoked - struct zmk_behavior_binding binding = *src_binding; - - const struct device *behavior = zmk_behavior_get_binding(binding.behavior_dev); - - if (!behavior) { - LOG_WRN("No behavior assigned to %d on layer %d", event.position, event.layer); - return 1; - } - - int err = behavior_keymap_binding_convert_central_state_dependent_params(&binding, event); - if (err) { - LOG_ERR("Failed to convert relative to absolute behavior binding (err %d)", err); - return err; - } - - enum behavior_locality locality = BEHAVIOR_LOCALITY_CENTRAL; - err = behavior_get_locality(behavior, &locality); - if (err) { - LOG_ERR("Failed to get behavior locality %d", err); - return err; - } - - switch (locality) { - case BEHAVIOR_LOCALITY_CENTRAL: - return invoke_locally(&binding, event, pressed); - case BEHAVIOR_LOCALITY_EVENT_SOURCE: -#if IS_ENABLED(CONFIG_ZMK_SPLIT) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - if (event.source == ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL) { - return invoke_locally(&binding, event, pressed); - } else { - return zmk_split_central_invoke_behavior(event.source, &binding, event, pressed); - } -#else - return invoke_locally(&binding, event, pressed); -#endif - case BEHAVIOR_LOCALITY_GLOBAL: -#if IS_ENABLED(CONFIG_ZMK_SPLIT) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - for (int i = 0; i < ZMK_SPLIT_CENTRAL_PERIPHERAL_COUNT; i++) { - zmk_split_central_invoke_behavior(i, &binding, event, pressed); - } -#endif - return invoke_locally(&binding, event, pressed); - } - - return -ENOTSUP; -} - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -int zmk_behavior_get_empty_param_metadata(const struct device *dev, - struct behavior_parameter_metadata *metadata) { - metadata->sets_len = 0; - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -static int validate_hid_usage(uint16_t usage_page, uint16_t usage_id) { - LOG_DBG("Validate usage %d in page %d", usage_id, usage_page); - switch (usage_page) { - case HID_USAGE_KEY: - if (usage_id == 0 || (usage_id > ZMK_HID_KEYBOARD_NKRO_MAX_USAGE && - usage_id < LEFT_CONTROL && usage_id > RIGHT_GUI)) { - return -EINVAL; - } - break; - case HID_USAGE_CONSUMER: - if (usage_id > - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC), (0xFF), (0xFFF))) { - return -EINVAL; - } - break; - default: - LOG_WRN("Unsupported HID usage page %d", usage_page); - return -EINVAL; - } - - return 0; -} - -#define PARAM_MATCHES 0 - -static int check_param_matches_value(const struct behavior_parameter_value_metadata *value_meta, - uint32_t param) { - switch (value_meta->type) { - case BEHAVIOR_PARAMETER_VALUE_TYPE_NIL: - if (param == 0) { - return PARAM_MATCHES; - } - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_HID_USAGE: - if (validate_hid_usage(ZMK_HID_USAGE_PAGE(param), ZMK_HID_USAGE_ID(param)) >= 0) { - return PARAM_MATCHES; - } - - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_LAYER_ID: - if (param >= 0 && param < ZMK_KEYMAP_LEN) { - return PARAM_MATCHES; - } - break; - /* TODO: Restore with HSV -> RGB refactor - case BEHAVIOR_PARAMETER_STANDARD_DOMAIN_HSV: - // TODO: No real way to validate? Maybe max brightness? - break; - */ - case BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE: - if (param == value_meta->value) { - return PARAM_MATCHES; - } - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_RANGE: - if (param >= value_meta->range.min && param <= value_meta->range.max) { - return PARAM_MATCHES; - } - break; - default: - LOG_WRN("Unknown type %d", value_meta->type); - break; - } - - return -ENOTSUP; -} - -int zmk_behavior_validate_param_values(const struct behavior_parameter_value_metadata *values, - size_t values_len, uint32_t param) { - if (values_len == 0) { - return -ENODEV; - } - - for (int v = 0; v < values_len; v++) { - int ret = check_param_matches_value(&values[v], param); - if (ret >= 0) { - return ret; - } - } - - return -EINVAL; -} - -int zmk_behavior_check_params_match_metadata(const struct behavior_parameter_metadata *metadata, - uint32_t param1, uint32_t param2) { - if (!metadata || metadata->sets_len == 0) { - if (!metadata) { - LOG_ERR("No metadata to check against"); - } - - return (param1 == 0 && param2 == 0) ? 0 : -ENODEV; - } - - for (int s = 0; s < metadata->sets_len; s++) { - const struct behavior_parameter_metadata_set *set = &metadata->sets[s]; - int param1_ret = - zmk_behavior_validate_param_values(set->param1_values, set->param1_values_len, param1); - int param2_ret = - zmk_behavior_validate_param_values(set->param2_values, set->param2_values_len, param2); - - if ((param1_ret >= 0 || (param1_ret == -ENODEV && param1 == 0)) && - (param2_ret >= 0 || (param2_ret == -ENODEV && param2 == 0))) { - return 0; - } - } - - return -EINVAL; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -int zmk_behavior_validate_binding(const struct zmk_behavior_binding *binding) { -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - const struct device *behavior = zmk_behavior_get_binding(binding->behavior_dev); - - if (!behavior) { - return -ENODEV; - } - - struct behavior_parameter_metadata metadata; - int ret = behavior_get_parameter_metadata(behavior, &metadata); - - if (ret < 0) { - LOG_WRN("Failed getting metadata for %s: %d", binding->behavior_dev, ret); - return ret; - } - - return zmk_behavior_check_params_match_metadata(&metadata, binding->param1, binding->param2); -#else - return 0; -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -} - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS) - -zmk_behavior_local_id_t zmk_behavior_get_local_id(const char *name) { - if (!name) { - return UINT16_MAX; - } - - STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, item) { - if (device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { - return item->local_id; - } - } - - return UINT16_MAX; -} - -const char *zmk_behavior_find_behavior_name_from_local_id(zmk_behavior_local_id_t local_id) { - STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, item) { - if (device_is_ready(item->device) && item->local_id == local_id) { - return item->device->name; - } - } - - return NULL; -} - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_ID_TYPE_CRC16) - -static int behavior_local_id_init(void) { - STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, item) { - item->local_id = crc16_ansi(item->device->name, strlen(item->device->name)); - } - - return 0; -} - -SYS_INIT(behavior_local_id_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); - -#elif IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_ID_TYPE_SETTINGS_TABLE) - -static zmk_behavior_local_id_t largest_local_id = 0; - -static int behavior_handle_set(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { - const char *next; - - if (settings_name_steq(name, "local_id", &next) && next) { - char *endptr; - zmk_behavior_local_id_t local_id = strtoul(next, &endptr, 10); - if (*endptr != '\0') { - LOG_WRN("Invalid behavior local ID: %s with endptr %s", next, endptr); - return -EINVAL; - } - - if (len >= 64) { - LOG_ERR("Too large binding setting size (got %d expected less than %d)", len, 64); - return -EINVAL; - } - - char name[len + 1]; - - int err = read_cb(cb_arg, name, len); - if (err <= 0) { - LOG_ERR("Failed to handle keymap binding from settings (err %d)", err); - return err; - } - - name[len] = '\0'; - STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, item) { - if (strcmp(name, item->device->name) == 0) { - item->local_id = local_id; - largest_local_id = MAX(largest_local_id, local_id); - return 0; - } - } - - return -EINVAL; - } - - return 0; -} - -static int behavior_handle_commit(void) { - STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, item) { - if (item->local_id != 0) { - continue; - } - - if (!item->device || !item->device->name || !device_is_ready(item->device)) { - LOG_WRN("Skipping ID for device that doesn't exist or isn't ready"); - continue; - } - - item->local_id = ++largest_local_id; - char setting_name[32]; - sprintf(setting_name, "behavior/local_id/%d", item->local_id); - - // If the `device->name` is readonly in flash, settings save can fail to copy/read it while - // persisting to flash, so copy the device name into memory first before saving. - char device_name[32]; - snprintf(device_name, ARRAY_SIZE(device_name), "%s", item->device->name); - - settings_save_one(setting_name, device_name, strlen(device_name)); - } - - return 0; -} - -SETTINGS_STATIC_HANDLER_DEFINE(behavior, "behavior", NULL, behavior_handle_set, - behavior_handle_commit, NULL); - -#else - -#error "A behavior local ID mechanism must be selected" - -#endif - -#endif - -#if IS_ENABLED(CONFIG_LOG) -static int check_behavior_names(void) { - // Behavior names must be unique, but we don't have a good way to enforce this - // at compile time, so log an error at runtime if they aren't unique. - ptrdiff_t count; - STRUCT_SECTION_COUNT(zmk_behavior_ref, &count); - - for (ptrdiff_t i = 0; i < count; i++) { - const struct zmk_behavior_ref *current; - STRUCT_SECTION_GET(zmk_behavior_ref, i, ¤t); - - for (ptrdiff_t j = i + 1; j < count; j++) { - const struct zmk_behavior_ref *other; - STRUCT_SECTION_GET(zmk_behavior_ref, j, &other); - - if (strcmp(current->device->name, other->device->name) == 0) { - LOG_ERR("Multiple behaviors have the same name '%s'", current->device->name); - } - } - } - - return 0; -} - -SYS_INIT(check_behavior_names, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); -#endif // IS_ENABLED(CONFIG_LOG) diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 82c58ca8..1511e755 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -5,7 +5,6 @@ */ #include -#include #include #include @@ -15,9 +14,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct q_item { uint32_t position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - uint8_t source; -#endif struct zmk_behavior_binding binding; bool press : 1; uint32_t wait : 31; @@ -36,16 +32,12 @@ static void behavior_queue_process_next(struct k_work *work) { item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, - .timestamp = k_uptime_get(), -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = item.source -#endif - }; + .timestamp = k_uptime_get()}; if (item.press) { - zmk_behavior_invoke_binding(&item.binding, event, true); + behavior_keymap_binding_pressed(&item.binding, event); } else { - zmk_behavior_invoke_binding(&item.binding, event, false); + behavior_keymap_binding_released(&item.binding, event); } LOG_DBG("Processing next queued behavior in %dms", item.wait); @@ -57,17 +49,9 @@ static void behavior_queue_process_next(struct k_work *work) { } } -int zmk_behavior_queue_add(const struct zmk_behavior_binding_event *event, - const struct zmk_behavior_binding binding, bool press, uint32_t wait) { - struct q_item item = { - .press = press, - .binding = binding, - .wait = wait, - .position = event->position, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = event->source, -#endif - }; +int zmk_behavior_queue_add(uint32_t position, const struct zmk_behavior_binding binding, bool press, + uint32_t wait) { + struct q_item item = {.press = press, .binding = binding, .wait = wait}; const int ret = k_msgq_put(&zmk_behavior_queue_msgq, &item, K_NO_WAIT); if (ret < 0) { diff --git a/app/src/behaviors/behavior_backlight.c b/app/src/behaviors/behavior_backlight.c index 30f91474..fe2155b7 100644 --- a/app/src/behaviors/behavior_backlight.c +++ b/app/src/behaviors/behavior_backlight.c @@ -18,81 +18,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata no_arg_values[] = { - { - .display_name = "Toggle On/Off", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_TOG_CMD, - }, - { - .display_name = "Turn On", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_ON_CMD, - }, - { - .display_name = "Turn OFF", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_OFF_CMD, - }, - { - .display_name = "Increase Brightness", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_INC_CMD, - }, - { - .display_name = "Decrease Brightness", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_DEC_CMD, - }, - { - .display_name = "Cycle Brightness", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_CYCLE_CMD, - }, -}; - -static const struct behavior_parameter_value_metadata one_arg_p1_values[] = { - { - .display_name = "Set Brightness", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BL_SET_CMD, - }, -}; - -static const struct behavior_parameter_value_metadata one_arg_p2_values[] = { - { - .display_name = "Brightness", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_RANGE, - .range = - { - .min = 0, - .max = 100, - }, - }, -}; - -static const struct behavior_parameter_metadata_set no_args_set = { - .param1_values = no_arg_values, - .param1_values_len = ARRAY_SIZE(no_arg_values), -}; - -static const struct behavior_parameter_metadata_set one_args_set = { - .param1_values = one_arg_p1_values, - .param1_values_len = ARRAY_SIZE(one_arg_p1_values), - .param2_values = one_arg_p2_values, - .param2_values_len = ARRAY_SIZE(one_arg_p2_values), -}; - -static const struct behavior_parameter_metadata_set sets[] = {no_args_set, one_args_set}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(sets), - .sets = sets, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) +static int behavior_backlight_init(const struct device *dev) { return 0; } static int on_keymap_binding_convert_central_state_dependent_params(struct zmk_behavior_binding *binding, @@ -163,12 +89,9 @@ static const struct behavior_driver_api behavior_backlight_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, .locality = BEHAVIOR_LOCALITY_GLOBAL, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_backlight_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_backlight_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_backlight_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 5b15abff..6d44b5f5 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -20,91 +20,17 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata no_arg_values[] = { - { - .display_name = "Next Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_NXT_CMD, - }, - { - .display_name = "Previous Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_PRV_CMD, - }, - { - .display_name = "Clear All Profiles", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_CLR_ALL_CMD, - }, - { - .display_name = "Clear Selected Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_CLR_CMD, - }, -}; - -static const struct behavior_parameter_metadata_set no_args_set = { - .param1_values = no_arg_values, - .param1_values_len = ARRAY_SIZE(no_arg_values), -}; - -static const struct behavior_parameter_value_metadata prof_index_param1_values[] = { - { - .display_name = "Select Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_SEL_CMD, - }, - { - .display_name = "Disconnect Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_DISC_CMD, - }, -}; - -static const struct behavior_parameter_value_metadata prof_index_param2_values[] = { - { - .display_name = "Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_RANGE, - .range = {.min = 0, .max = ZMK_BLE_PROFILE_COUNT}, - }, -}; - -static const struct behavior_parameter_metadata_set profile_index_metadata_set = { - .param1_values = prof_index_param1_values, - .param1_values_len = ARRAY_SIZE(prof_index_param1_values), - .param2_values = prof_index_param2_values, - .param2_values_len = ARRAY_SIZE(prof_index_param2_values), -}; - -static const struct behavior_parameter_metadata_set metadata_sets[] = {no_args_set, - profile_index_metadata_set}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(metadata_sets), - .sets = metadata_sets, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { switch (binding->param1) { case BT_CLR_CMD: - zmk_ble_clear_bonds(); - return 0; + return zmk_ble_clear_bonds(); case BT_NXT_CMD: return zmk_ble_prof_next(); case BT_PRV_CMD: return zmk_ble_prof_prev(); case BT_SEL_CMD: return zmk_ble_prof_select(binding->param2); - case BT_CLR_ALL_CMD: - zmk_ble_clear_all_bonds(); - return 0; - case BT_DISC_CMD: - return zmk_ble_prof_disconnect(binding->param2); default: LOG_ERR("Unknown BT command: %d", binding->param1); } @@ -112,6 +38,8 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, return -ENOTSUP; } +static int behavior_bt_init(const struct device *dev) { return 0; }; + static int on_keymap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { return ZMK_BEHAVIOR_OPAQUE; @@ -120,12 +48,9 @@ static int on_keymap_binding_released(struct zmk_behavior_binding *binding, static const struct behavior_driver_api behavior_bt_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_bt_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_bt_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_bt_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 2f64f4d7..4c9fd711 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -32,6 +32,7 @@ struct caps_word_continue_item { struct behavior_caps_word_config { zmk_mod_flags_t mods; + uint8_t index; uint8_t continuations_count; struct caps_word_continue_item continuations[]; }; @@ -54,7 +55,7 @@ static void deactivate_caps_word(const struct device *dev) { static int on_caps_word_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_caps_word_data *data = dev->data; if (data->active) { @@ -74,9 +75,6 @@ static int on_caps_word_binding_released(struct zmk_behavior_binding *binding, static const struct behavior_driver_api behavior_caps_word_driver_api = { .binding_pressed = on_caps_word_binding_pressed, .binding_released = on_caps_word_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh); @@ -84,8 +82,7 @@ static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh); ZMK_LISTENER(behavior_caps_word, caps_word_keycode_state_changed_listener); ZMK_SUBSCRIPTION(behavior_caps_word, zmk_keycode_state_changed); -#define GET_DEV(inst) DEVICE_DT_INST_GET(inst), -static const struct device *devs[] = {DT_INST_FOREACH_STATUS_OKAY(GET_DEV)}; +static const struct device *devs[DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT)]; static bool caps_word_is_caps_includelist(const struct behavior_caps_word_config *config, uint16_t usage_page, uint8_t usage_id, @@ -133,8 +130,11 @@ static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } - for (int i = 0; i < ARRAY_SIZE(devs); i++) { + for (int i = 0; i < DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT); i++) { const struct device *dev = devs[i]; + if (dev == NULL) { + continue; + } struct behavior_caps_word_data *data = dev->data; if (!data->active) { @@ -157,23 +157,33 @@ static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } +static int behavior_caps_word_init(const struct device *dev) { + const struct behavior_caps_word_config *config = dev->config; + devs[config->index] = dev; + return 0; +} + #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) #define PARSE_BREAK(i) \ - {.page = ZMK_HID_USAGE_PAGE(i), .id = ZMK_HID_USAGE_ID(i), .implicit_modifiers = SELECT_MODS(i)} + { \ + .page = ZMK_HID_USAGE_PAGE(i), .id = ZMK_HID_USAGE_ID(i), \ + .implicit_modifiers = SELECT_MODS(i) \ + } #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) #define KP_INST(n) \ static struct behavior_caps_word_data behavior_caps_word_data_##n = {.active = false}; \ - static const struct behavior_caps_word_config behavior_caps_word_config_##n = { \ + static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ + .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, &behavior_caps_word_data_##n, \ - &behavior_caps_word_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_caps_word_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ + &behavior_caps_word_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_caps_word_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_ext_power.c b/app/src/behaviors/behavior_ext_power.c index 6995d946..690ac971 100644 --- a/app/src/behaviors/behavior_ext_power.c +++ b/app/src/behaviors/behavior_ext_power.c @@ -64,6 +64,8 @@ static int on_keymap_binding_released(struct zmk_behavior_binding *binding, return ZMK_BEHAVIOR_OPAQUE; } +static int behavior_ext_power_init(const struct device *dev) { return 0; }; + static const struct behavior_driver_api behavior_ext_power_driver_api = { .binding_convert_central_state_dependent_params = on_keymap_binding_convert_central_state_dependent_params, @@ -72,7 +74,7 @@ static const struct behavior_driver_api behavior_ext_power_driver_api = { .locality = BEHAVIOR_LOCALITY_GLOBAL, }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_ext_power_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_ext_power_init, NULL, NULL, NULL, APPLICATION, + CONFIG_APPLICATION_INIT_PRIORITY, &behavior_ext_power_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 3df3bc86..d4aa0dce 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -18,13 +18,14 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#define ZMK_BHV_HOLD_TAP_MAX_HELD CONFIG_ZMK_BEHAVIOR_HOLD_TAP_MAX_HELD -#define ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS CONFIG_ZMK_BEHAVIOR_HOLD_TAP_MAX_CAPTURED_EVENTS +#define ZMK_BHV_HOLD_TAP_MAX_HELD 10 +#define ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS 40 // increase if you have keyboard with more keys. #define ZMK_BHV_HOLD_TAP_POSITION_NOT_USED 9999 @@ -44,7 +45,6 @@ enum status { }; enum decision_moment { - HT_KEY_DOWN, HT_KEY_UP, HT_OTHER_KEY_DOWN, HT_OTHER_KEY_UP, @@ -59,26 +59,15 @@ struct behavior_hold_tap_config { int quick_tap_ms; int require_prior_idle_ms; enum flavor flavor; - bool hold_while_undecided; - bool hold_while_undecided_linger; bool retro_tap; bool hold_trigger_on_release; int32_t hold_trigger_key_positions_len; int32_t hold_trigger_key_positions[]; }; -struct behavior_hold_tap_data { -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - struct behavior_parameter_metadata_set set; -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; - // this data is specific for each hold-tap struct active_hold_tap { int32_t position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - uint8_t source; -#endif uint32_t param_hold; uint32_t param_tap; int64_t timestamp; @@ -99,24 +88,7 @@ struct active_hold_tap { struct active_hold_tap *undecided_hold_tap = NULL; struct active_hold_tap active_hold_taps[ZMK_BHV_HOLD_TAP_MAX_HELD] = {}; // We capture most position_state_changed events and some modifiers_state_changed events. - -enum captured_event_tag { - ET_NONE, - ET_POS_CHANGED, - ET_CODE_CHANGED, -}; - -union captured_event_data { - struct zmk_position_state_changed_event position; - struct zmk_keycode_state_changed_event keycode; -}; - -struct captured_event { - enum captured_event_tag tag; - union captured_event_data data; -}; - -struct captured_event captured_events[ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS] = {}; +const zmk_event_t *captured_events[ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS] = {}; // Keep track of which key was tapped most recently for the standard, if it is a hold-tap // a position, will be given, if not it will just be INT32_MIN @@ -150,32 +122,33 @@ static bool is_quick_tap(struct active_hold_tap *hold_tap) { } } -static int capture_event(struct captured_event *data) { +static int capture_event(const zmk_event_t *event) { for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS; i++) { - if (captured_events[i].tag == ET_NONE) { - captured_events[i] = *data; + if (captured_events[i] == NULL) { + captured_events[i] = event; return 0; } } return -ENOMEM; } -static bool have_captured_keydown_event(uint32_t position) { +static struct zmk_position_state_changed *find_captured_keydown_event(uint32_t position) { + struct zmk_position_state_changed *last_match = NULL; for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS; i++) { - struct captured_event *ev = &captured_events[i]; - if (ev->tag == ET_NONE) { - return false; + const zmk_event_t *eh = captured_events[i]; + if (eh == NULL) { + return last_match; } - - if (ev->tag != ET_POS_CHANGED) { + struct zmk_position_state_changed *position_event = as_zmk_position_state_changed(eh); + if (position_event == NULL) { continue; } - if (ev->data.position.data.position == position && ev->data.position.data.state) { - return true; + if (position_event->position == position && position_event->state) { + last_match = position_event; } } - return false; + return last_match; } const struct zmk_listener zmk_listener_behavior_hold_tap; @@ -189,7 +162,7 @@ static void release_captured_events() { // // Events for different mod-tap instances are separated by a NULL pointer. // - // The first event popped will never be caught by the next active hold-tap + // The first event popped will never be catched by the next active hold-tap // because to start capturing a mod-tap-key-down event must first completely // go through the events queue. // @@ -211,35 +184,25 @@ static void release_captured_events() { // [k1_down, k1_up, null, null, null, ...] // now mt2 will start releasing it's own captured positions. for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS; i++) { - struct captured_event *captured_event = &captured_events[i]; - enum captured_event_tag tag = captured_event->tag; - - if (tag == ET_NONE) { + const zmk_event_t *captured_event = captured_events[i]; + if (captured_event == NULL) { return; } - - captured_events[i].tag = ET_NONE; + captured_events[i] = NULL; if (undecided_hold_tap != NULL) { k_msleep(10); } - switch (tag) { - case ET_CODE_CHANGED: - LOG_DBG("Releasing mods changed event 0x%02X %s", - captured_event->data.keycode.data.keycode, - (captured_event->data.keycode.data.state ? "pressed" : "released")); - ZMK_EVENT_RAISE_AT(captured_event->data.keycode, behavior_hold_tap); - break; - case ET_POS_CHANGED: - LOG_DBG("Releasing key position event for position %d %s", - captured_event->data.position.data.position, - (captured_event->data.position.data.state ? "pressed" : "released")); - ZMK_EVENT_RAISE_AT(captured_event->data.position, behavior_hold_tap); - break; - default: - LOG_ERR("Unhandled captured event type"); - break; + struct zmk_position_state_changed *position_event; + struct zmk_keycode_state_changed *modifier_event; + if ((position_event = as_zmk_position_state_changed(captured_event)) != NULL) { + LOG_DBG("Releasing key position event for position %d %s", position_event->position, + (position_event->state ? "pressed" : "released")); + } else if ((modifier_event = as_zmk_keycode_state_changed(captured_event)) != NULL) { + LOG_DBG("Releasing mods changed event 0x%02X %s", modifier_event->keycode, + (modifier_event->state ? "pressed" : "released")); } + ZMK_EVENT_RAISE_AT(captured_event, behavior_hold_tap); } } @@ -252,22 +215,19 @@ static struct active_hold_tap *find_hold_tap(uint32_t position) { return NULL; } -static struct active_hold_tap *store_hold_tap(struct zmk_behavior_binding_event *event, - uint32_t param_hold, uint32_t param_tap, +static struct active_hold_tap *store_hold_tap(uint32_t position, uint32_t param_hold, + uint32_t param_tap, int64_t timestamp, const struct behavior_hold_tap_config *config) { for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_HELD; i++) { if (active_hold_taps[i].position != ZMK_BHV_HOLD_TAP_POSITION_NOT_USED) { continue; } - active_hold_taps[i].position = event->position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - active_hold_taps[i].source = event->source; -#endif + active_hold_taps[i].position = position; active_hold_taps[i].status = STATUS_UNDECIDED; active_hold_taps[i].config = config; active_hold_taps[i].param_hold = param_hold; active_hold_taps[i].param_tap = param_tap; - active_hold_taps[i].timestamp = event->timestamp; + active_hold_taps[i].timestamp = timestamp; active_hold_taps[i].position_of_first_other_key_pressed = -1; return &active_hold_taps[i]; } @@ -401,83 +361,26 @@ static inline const char *decision_moment_str(enum decision_moment decision_mome } } -static int press_hold_binding(struct active_hold_tap *hold_tap) { - struct zmk_behavior_binding_event event = { - .position = hold_tap->position, - .timestamp = hold_tap->timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = hold_tap->source, -#endif - }; - - struct zmk_behavior_binding binding = {.behavior_dev = hold_tap->config->hold_behavior_dev, - .param1 = hold_tap->param_hold}; - return zmk_behavior_invoke_binding(&binding, event, true); -} - -static int press_tap_binding(struct active_hold_tap *hold_tap) { - struct zmk_behavior_binding_event event = { - .position = hold_tap->position, - .timestamp = hold_tap->timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = hold_tap->source, -#endif - }; - - struct zmk_behavior_binding binding = {.behavior_dev = hold_tap->config->tap_behavior_dev, - .param1 = hold_tap->param_tap}; - store_last_hold_tapped(hold_tap); - return zmk_behavior_invoke_binding(&binding, event, true); -} - -static int release_hold_binding(struct active_hold_tap *hold_tap) { - struct zmk_behavior_binding_event event = { - .position = hold_tap->position, - .timestamp = hold_tap->timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = hold_tap->source, -#endif - }; - - struct zmk_behavior_binding binding = {.behavior_dev = hold_tap->config->hold_behavior_dev, - .param1 = hold_tap->param_hold}; - return zmk_behavior_invoke_binding(&binding, event, false); -} - -static int release_tap_binding(struct active_hold_tap *hold_tap) { - struct zmk_behavior_binding_event event = { - .position = hold_tap->position, - .timestamp = hold_tap->timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = hold_tap->source, -#endif - }; - - struct zmk_behavior_binding binding = {.behavior_dev = hold_tap->config->tap_behavior_dev, - .param1 = hold_tap->param_tap}; - return zmk_behavior_invoke_binding(&binding, event, false); -} - static int press_binding(struct active_hold_tap *hold_tap) { if (hold_tap->config->retro_tap && hold_tap->status == STATUS_HOLD_TIMER) { return 0; } + struct zmk_behavior_binding_event event = { + .position = hold_tap->position, + .timestamp = hold_tap->timestamp, + }; + + struct zmk_behavior_binding binding = {0}; if (hold_tap->status == STATUS_HOLD_TIMER || hold_tap->status == STATUS_HOLD_INTERRUPT) { - if (hold_tap->config->hold_while_undecided) { - // the hold is already active, so we don't need to press it again - return 0; - } else { - return press_hold_binding(hold_tap); - } + binding.behavior_dev = hold_tap->config->hold_behavior_dev; + binding.param1 = hold_tap->param_hold; } else { - if (hold_tap->config->hold_while_undecided && - !hold_tap->config->hold_while_undecided_linger) { - // time to release the hold before pressing the tap - release_hold_binding(hold_tap); - } - return press_tap_binding(hold_tap); + binding.behavior_dev = hold_tap->config->tap_behavior_dev; + binding.param1 = hold_tap->param_tap; + store_last_hold_tapped(hold_tap); } + return behavior_keymap_binding_pressed(&binding, event); } static int release_binding(struct active_hold_tap *hold_tap) { @@ -485,11 +388,20 @@ static int release_binding(struct active_hold_tap *hold_tap) { return 0; } + struct zmk_behavior_binding_event event = { + .position = hold_tap->position, + .timestamp = hold_tap->timestamp, + }; + + struct zmk_behavior_binding binding = {0}; if (hold_tap->status == STATUS_HOLD_TIMER || hold_tap->status == STATUS_HOLD_INTERRUPT) { - return release_hold_binding(hold_tap); + binding.behavior_dev = hold_tap->config->hold_behavior_dev; + binding.param1 = hold_tap->param_hold; } else { - return release_tap_binding(hold_tap); + binding.behavior_dev = hold_tap->config->tap_behavior_dev; + binding.param1 = hold_tap->param_tap; } + return behavior_keymap_binding_released(&binding, event); } static bool is_first_other_key_pressed_trigger_key(struct active_hold_tap *hold_tap) { @@ -536,12 +448,6 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, return; } - if (hold_tap->config->hold_while_undecided && decision_moment == HT_KEY_DOWN) { - LOG_DBG("%d hold behavior pressed while undecided", hold_tap->position); - press_hold_binding(hold_tap); - return; - } - // If the hold-tap behavior is still undecided, attempt to decide it. switch (hold_tap->config->flavor) { case FLAVOR_HOLD_PREFERRED: @@ -605,7 +511,7 @@ static void update_hold_status_for_retro_tap(uint32_t ignore_position) { static int on_hold_tap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_hold_tap_config *cfg = dev->config; if (undecided_hold_tap != NULL) { @@ -615,8 +521,7 @@ static int on_hold_tap_binding_pressed(struct zmk_behavior_binding *binding, } struct active_hold_tap *hold_tap = - store_hold_tap(&event, binding->param1, binding->param2, cfg); - + store_hold_tap(event.position, binding->param1, binding->param2, event.timestamp, cfg); if (hold_tap == NULL) { LOG_ERR("unable to store hold-tap info, did you press more than %d hold-taps?", ZMK_BHV_HOLD_TAP_MAX_HELD); @@ -630,8 +535,6 @@ static int on_hold_tap_binding_pressed(struct zmk_behavior_binding *binding, decide_hold_tap(hold_tap, HT_QUICK_TAP); } - decide_hold_tap(hold_tap, HT_KEY_DOWN); - // if this behavior was queued we have to adjust the timer to only // wait for the remaining time. int32_t tapping_term_ms_left = (hold_tap->timestamp + cfg->tapping_term_ms) - k_uptime_get(); @@ -659,10 +562,6 @@ static int on_hold_tap_binding_released(struct zmk_behavior_binding *binding, decide_retro_tap(hold_tap); release_binding(hold_tap); - if (hold_tap->config->hold_while_undecided && hold_tap->config->hold_while_undecided_linger) { - release_hold_binding(hold_tap); - } - if (work_cancel_result == -EINPROGRESS) { // let the timer handler clean up // if we'd clear now, the timer may call back for an uninitialized active_hold_tap. @@ -676,52 +575,9 @@ static int on_hold_tap_binding_released(struct zmk_behavior_binding *binding, return ZMK_BEHAVIOR_OPAQUE; } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -static int hold_tap_parameter_metadata(const struct device *hold_tap, - struct behavior_parameter_metadata *param_metadata) { - const struct behavior_hold_tap_config *cfg = hold_tap->config; - struct behavior_hold_tap_data *data = hold_tap->data; - int err; - struct behavior_parameter_metadata child_meta; - - err = behavior_get_parameter_metadata(zmk_behavior_get_binding(cfg->hold_behavior_dev), - &child_meta); - if (err < 0) { - LOG_WRN("Failed to get the hold behavior parameter: %d", err); - return err; - } - - if (child_meta.sets_len > 0) { - data->set.param1_values = child_meta.sets[0].param1_values; - data->set.param1_values_len = child_meta.sets[0].param1_values_len; - } - - err = behavior_get_parameter_metadata(zmk_behavior_get_binding(cfg->tap_behavior_dev), - &child_meta); - if (err < 0) { - LOG_WRN("Failed to get the tap behavior parameter: %d", err); - return err; - } - - if (child_meta.sets_len > 0) { - data->set.param2_values = child_meta.sets[0].param1_values; - data->set.param2_values_len = child_meta.sets[0].param1_values_len; - } - - param_metadata->sets = &data->set; - param_metadata->sets_len = 1; - - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - static const struct behavior_driver_api behavior_hold_tap_driver_api = { .binding_pressed = on_hold_tap_binding_pressed, .binding_released = on_hold_tap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = hold_tap_parameter_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; static int position_state_changed_listener(const zmk_event_t *eh) { @@ -766,7 +622,7 @@ static int position_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } - if (!ev->state && !have_captured_keydown_event(ev->position)) { + if (!ev->state && find_captured_keydown_event(ev->position) == NULL) { // no keydown event has been captured, let it bubble. // we'll catch modifiers later in modifier_state_changed_listener LOG_DBG("%d bubbling %d %s event", undecided_hold_tap->position, ev->position, @@ -776,11 +632,7 @@ static int position_state_changed_listener(const zmk_event_t *eh) { LOG_DBG("%d capturing %d %s event", undecided_hold_tap->position, ev->position, ev->state ? "down" : "up"); - struct captured_event capture = { - .tag = ET_POS_CHANGED, - .data = {.position = copy_raised_zmk_position_state_changed(ev)}, - }; - capture_event(&capture); + capture_event(eh); decide_hold_tap(undecided_hold_tap, ev->state ? HT_OTHER_KEY_DOWN : HT_OTHER_KEY_UP); return ZMK_EV_EVENT_CAPTURED; } @@ -803,19 +655,11 @@ static int keycode_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } - // hold-while-undecided can produce a mod, but we don't want to capture it. - if (undecided_hold_tap->config->hold_while_undecided && - undecided_hold_tap->status == STATUS_UNDECIDED) { - return ZMK_EV_EVENT_BUBBLE; - } - // only key-up events will bubble through position_state_changed_listener // if a undecided_hold_tap is active. LOG_DBG("%d capturing 0x%02X %s event", undecided_hold_tap->position, ev->keycode, ev->state ? "down" : "up"); - struct captured_event capture = { - .tag = ET_CODE_CHANGED, .data = {.keycode = copy_raised_zmk_keycode_state_changed(ev)}}; - capture_event(&capture); + capture_event(eh); return ZMK_EV_EVENT_CAPTURED; } @@ -834,8 +678,7 @@ ZMK_SUBSCRIPTION(behavior_hold_tap, zmk_position_state_changed); ZMK_SUBSCRIPTION(behavior_hold_tap, zmk_keycode_state_changed); void behavior_hold_tap_timer_work_handler(struct k_work *item) { - struct k_work_delayable *d_work = k_work_delayable_from_work(item); - struct active_hold_tap *hold_tap = CONTAINER_OF(d_work, struct active_hold_tap, work); + struct active_hold_tap *hold_tap = CONTAINER_OF(item, struct active_hold_tap, work); if (hold_tap->work_is_cancelled) { clear_hold_tap(hold_tap); @@ -858,26 +701,23 @@ static int behavior_hold_tap_init(const struct device *dev) { } #define KP_INST(n) \ - static const struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ + static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DEVICE_DT_NAME(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DEVICE_DT_NAME(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .require_prior_idle_ms = DT_INST_PROP(n, global_quick_tap) \ ? DT_INST_PROP(n, quick_tap_ms) \ : DT_INST_PROP(n, require_prior_idle_ms), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ - .hold_while_undecided = DT_INST_PROP(n, hold_while_undecided), \ - .hold_while_undecided_linger = DT_INST_PROP(n, hold_while_undecided_linger), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ .hold_trigger_on_release = DT_INST_PROP(n, hold_trigger_on_release), \ .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ }; \ - static struct behavior_hold_tap_data behavior_hold_tap_data_##n = {}; \ - BEHAVIOR_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, &behavior_hold_tap_data_##n, \ - &behavior_hold_tap_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_hold_tap_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, NULL, &behavior_hold_tap_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_hold_tap_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_input_two_axis.c b/app/src/behaviors/behavior_input_two_axis.c deleted file mode 100644 index 40e82a8e..00000000 --- a/app/src/behaviors/behavior_input_two_axis.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_input_two_axis - -#include -#include -#include -#include -#include // CLAMP - -#include -#include - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) -#include -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct vector2d { - float x; - float y; -}; - -struct movement_state_1d { - float remainder; - int16_t speed; - int64_t start_time; -}; - -struct movement_state_2d { - struct movement_state_1d x; - struct movement_state_1d y; -}; - -struct behavior_input_two_axis_data { - struct k_work_delayable tick_work; - const struct device *dev; - - struct movement_state_2d state; -}; - -struct behavior_input_two_axis_config { - int16_t x_code; - int16_t y_code; - uint16_t delay_ms; - uint16_t time_to_max_speed_ms; - uint8_t trigger_period_ms; - // acceleration exponent 0: uniform speed - // acceleration exponent 1: uniform acceleration - // acceleration exponent 2: uniform jerk - uint8_t acceleration_exponent; -}; - -#if CONFIG_MINIMAL_LIBC -static float powf(float base, float exponent) { - // poor man's power implementation rounds the exponent down to the nearest integer. - float power = 1.0f; - for (; exponent >= 1.0f; exponent--) { - power = power * base; - } - return power; -} -#else -#include -#endif - -static int64_t ticks_since_start(int64_t start, int64_t now, int64_t delay) { - if (start == 0) { - return 0; - } - int64_t move_duration = now - (start + delay); - // start can be in the future if there's a delay - if (move_duration < 0) { - move_duration = 0; - } - return move_duration; -} - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -static uint8_t get_acceleration_exponent(const struct behavior_input_two_axis_config *config, - uint16_t code) { - switch (code) { - case INPUT_REL_WHEEL: - return (zmk_pointing_resolution_multipliers_get_current_profile().wheel > 0) - ? 0 - : config->acceleration_exponent; - case INPUT_REL_HWHEEL: - return (zmk_pointing_resolution_multipliers_get_current_profile().hor_wheel > 0) - ? 0 - : config->acceleration_exponent; - default: - return config->acceleration_exponent; - } -} - -#else - -static inline uint8_t get_acceleration_exponent(const struct behavior_input_two_axis_config *config, - uint16_t code) { - return config->acceleration_exponent; -} - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -static float speed(const struct behavior_input_two_axis_config *config, uint16_t code, - float max_speed, int64_t duration_ticks) { - uint8_t accel_exp = get_acceleration_exponent(config, code); - - if ((1000 * duration_ticks / CONFIG_SYS_CLOCK_TICKS_PER_SEC) > config->time_to_max_speed_ms || - config->time_to_max_speed_ms == 0 || accel_exp == 0) { - return max_speed; - } - - // Calculate the speed based on MouseKeysAccel - // See https://en.wikipedia.org/wiki/Mouse_keys - if (duration_ticks == 0) { - return 0; - } - - float time_fraction = (float)(1000 * duration_ticks / CONFIG_SYS_CLOCK_TICKS_PER_SEC) / - config->time_to_max_speed_ms; - return max_speed * powf(time_fraction, accel_exp); -} - -static void track_remainder(float *move, float *remainder) { - float new_move = *move + *remainder; - *remainder = new_move - (int)new_move; - *move = (int)new_move; -} - -static float update_movement_1d(const struct behavior_input_two_axis_config *config, uint16_t code, - struct movement_state_1d *state, int64_t now) { - float move = 0; - if (state->speed == 0) { - state->remainder = 0; - return move; - } - - int64_t move_duration = ticks_since_start(state->start_time, now, config->delay_ms); - LOG_DBG("Calculated speed: %f", (double)speed(config, code, state->speed, move_duration)); - move = - (move_duration > 0) - ? (speed(config, code, state->speed, move_duration) * config->trigger_period_ms / 1000) - : 0; - - track_remainder(&(move), &(state->remainder)); - - return move; -} -static struct vector2d update_movement_2d(const struct behavior_input_two_axis_config *config, - struct movement_state_2d *state, int64_t now) { - struct vector2d move = {0}; - - move = (struct vector2d){ - .x = update_movement_1d(config, config->x_code, &state->x, now), - .y = update_movement_1d(config, config->y_code, &state->y, now), - }; - - return move; -} - -static bool is_non_zero_1d_movement(int16_t speed) { return speed != 0; } - -static bool is_non_zero_2d_movement(struct movement_state_2d *state) { - return is_non_zero_1d_movement(state->x.speed) || is_non_zero_1d_movement(state->y.speed); -} - -static bool should_be_working(struct behavior_input_two_axis_data *data) { - return is_non_zero_2d_movement(&data->state); -} - -static void tick_work_cb(struct k_work *work) { - struct k_work_delayable *d_work = k_work_delayable_from_work(work); - struct behavior_input_two_axis_data *data = - CONTAINER_OF(d_work, struct behavior_input_two_axis_data, tick_work); - const struct device *dev = data->dev; - const struct behavior_input_two_axis_config *cfg = dev->config; - - uint64_t timestamp = k_uptime_ticks(); - - // LOG_INF("x start: %llu, y start: %llu, current timestamp: %llu", data->state.x.start_time, - // data->state.y.start_time, timestamp); - - struct vector2d move = update_movement_2d(cfg, &data->state, timestamp); - - int ret = 0; - bool have_x = is_non_zero_1d_movement(move.x); - bool have_y = is_non_zero_1d_movement(move.y); - if (have_x) { - ret = input_report_rel(dev, cfg->x_code, (int16_t)CLAMP(move.x, INT16_MIN, INT16_MAX), - !have_y, K_NO_WAIT); - } - if (have_y) { - ret = input_report_rel(dev, cfg->y_code, (int16_t)CLAMP(move.y, INT16_MIN, INT16_MAX), true, - K_NO_WAIT); - } - - if (should_be_working(data)) { - k_work_schedule(&data->tick_work, K_MSEC(cfg->trigger_period_ms)); - } -} - -static void set_start_times_for_activity_1d(struct movement_state_1d *state) { - if (state->speed != 0 && state->start_time == 0) { - state->start_time = k_uptime_ticks(); - } else if (state->speed == 0) { - state->start_time = 0; - } -} -static void set_start_times_for_activity(struct movement_state_2d *state) { - set_start_times_for_activity_1d(&state->x); - set_start_times_for_activity_1d(&state->y); -} - -static void update_work_scheduling(const struct device *dev) { - struct behavior_input_two_axis_data *data = dev->data; - const struct behavior_input_two_axis_config *cfg = dev->config; - - set_start_times_for_activity(&data->state); - - if (should_be_working(data)) { - k_work_schedule(&data->tick_work, K_MSEC(cfg->trigger_period_ms)); - } else { - k_work_cancel_delayable(&data->tick_work); - data->state.y.remainder = 0; - data->state.x.remainder = 0; - } -} - -int behavior_input_two_axis_adjust_speed(const struct device *dev, int16_t dx, int16_t dy) { - struct behavior_input_two_axis_data *data = dev->data; - - LOG_DBG("Adjusting: %d %d", dx, dy); - data->state.x.speed += dx; - data->state.y.speed += dy; - - LOG_DBG("After: %d %d", data->state.x.speed, data->state.y.speed); - - update_work_scheduling(dev); - - return 0; -} - -static int behavior_input_two_axis_init(const struct device *dev) { - struct behavior_input_two_axis_data *data = dev->data; - - data->dev = dev; - k_work_init_delayable(&data->tick_work, tick_work_cb); - - return 0; -}; - -static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - - const struct device *behavior_dev = zmk_behavior_get_binding(binding->behavior_dev); - - LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - - int16_t x = MOVE_X_DECODE(binding->param1); - int16_t y = MOVE_Y_DECODE(binding->param1); - - behavior_input_two_axis_adjust_speed(behavior_dev, x, y); - return 0; -} - -static int on_keymap_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - const struct device *behavior_dev = zmk_behavior_get_binding(binding->behavior_dev); - - LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - - int16_t x = MOVE_X_DECODE(binding->param1); - int16_t y = MOVE_Y_DECODE(binding->param1); - - behavior_input_two_axis_adjust_speed(behavior_dev, -x, -y); - return 0; -} - -static const struct behavior_driver_api behavior_input_two_axis_driver_api = { - .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released}; - -#define ITA_INST(n) \ - static struct behavior_input_two_axis_data behavior_input_two_axis_data_##n = {}; \ - static struct behavior_input_two_axis_config behavior_input_two_axis_config_##n = { \ - .x_code = DT_INST_PROP(n, x_input_code), \ - .y_code = DT_INST_PROP(n, y_input_code), \ - .trigger_period_ms = DT_INST_PROP(n, trigger_period_ms), \ - .delay_ms = DT_INST_PROP_OR(n, delay_ms, 0), \ - .time_to_max_speed_ms = DT_INST_PROP(n, time_to_max_speed_ms), \ - .acceleration_exponent = DT_INST_PROP_OR(n, acceleration_exponent, 1), \ - }; \ - BEHAVIOR_DT_INST_DEFINE( \ - n, behavior_input_two_axis_init, NULL, &behavior_input_two_axis_data_##n, \ - &behavior_input_two_axis_config_##n, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_input_two_axis_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(ITA_INST) diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index b2a23900..2765db9f 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -16,49 +16,27 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata param_values[] = { - { - .display_name = "Key", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_HID_USAGE, - }, -}; - -static const struct behavior_parameter_metadata_set param_metadata_set[] = {{ - .param1_values = param_values, - .param1_values_len = ARRAY_SIZE(param_values), -}}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(param_metadata_set), - .sets = param_metadata_set, -}; - -#endif +static int behavior_key_press_init(const struct device *dev) { return 0; }; static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp); + return ZMK_EVENT_RAISE( + zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp)); } static int on_keymap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp); + return ZMK_EVENT_RAISE( + zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp)); } static const struct behavior_driver_api behavior_key_press_driver_api = { - .binding_pressed = on_keymap_binding_pressed, - .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; + .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released}; #define KP_INST(n) \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, NULL, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_press_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_key_press_init, NULL, NULL, NULL, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_press_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_key_repeat.c b/app/src/behaviors/behavior_key_repeat.c index 853f00f3..033f498b 100644 --- a/app/src/behaviors/behavior_key_repeat.c +++ b/app/src/behaviors/behavior_key_repeat.c @@ -32,7 +32,7 @@ struct behavior_key_repeat_data { static int on_key_repeat_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_key_repeat_data *data = dev->data; if (data->last_keycode_pressed.usage_page == 0) { @@ -43,14 +43,14 @@ static int on_key_repeat_binding_pressed(struct zmk_behavior_binding *binding, sizeof(struct zmk_keycode_state_changed)); data->current_keycode_pressed.timestamp = k_uptime_get(); - raise_zmk_keycode_state_changed(data->current_keycode_pressed); + ZMK_EVENT_RAISE(new_zmk_keycode_state_changed(data->current_keycode_pressed)); return ZMK_BEHAVIOR_OPAQUE; } static int on_key_repeat_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_key_repeat_data *data = dev->data; if (data->current_keycode_pressed.usage_page == 0) { @@ -60,16 +60,13 @@ static int on_key_repeat_binding_released(struct zmk_behavior_binding *binding, data->current_keycode_pressed.timestamp = k_uptime_get(); data->current_keycode_pressed.state = false; - raise_zmk_keycode_state_changed(data->current_keycode_pressed); + ZMK_EVENT_RAISE(new_zmk_keycode_state_changed(data->current_keycode_pressed)); return ZMK_BEHAVIOR_OPAQUE; } static const struct behavior_driver_api behavior_key_repeat_driver_api = { .binding_pressed = on_key_repeat_binding_pressed, .binding_released = on_key_repeat_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; static int key_repeat_keycode_state_changed_listener(const zmk_event_t *eh); @@ -77,8 +74,7 @@ static int key_repeat_keycode_state_changed_listener(const zmk_event_t *eh); ZMK_LISTENER(behavior_key_repeat, key_repeat_keycode_state_changed_listener); ZMK_SUBSCRIPTION(behavior_key_repeat, zmk_keycode_state_changed); -#define GET_DEV(inst) DEVICE_DT_INST_GET(inst), -static const struct device *devs[] = {DT_INST_FOREACH_STATUS_OKAY(GET_DEV)}; +static const struct device *devs[DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT)]; static int key_repeat_keycode_state_changed_listener(const zmk_event_t *eh) { struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); @@ -86,8 +82,11 @@ static int key_repeat_keycode_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } - for (int i = 0; i < ARRAY_SIZE(devs); i++) { + for (int i = 0; i < DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT); i++) { const struct device *dev = devs[i]; + if (dev == NULL) { + continue; + } struct behavior_key_repeat_data *data = dev->data; const struct behavior_key_repeat_config *config = dev->config; @@ -104,15 +103,22 @@ static int key_repeat_keycode_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } +static int behavior_key_repeat_init(const struct device *dev) { + const struct behavior_key_repeat_config *config = dev->config; + devs[config->index] = dev; + return 0; +} + #define KR_INST(n) \ static struct behavior_key_repeat_data behavior_key_repeat_data_##n = {}; \ static struct behavior_key_repeat_config behavior_key_repeat_config_##n = { \ + .index = n, \ .usage_pages = DT_INST_PROP(n, usage_pages), \ .usage_pages_count = DT_INST_PROP_LEN(n, usage_pages), \ }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, &behavior_key_repeat_data_##n, \ - &behavior_key_repeat_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_repeat_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_key_repeat_init, NULL, &behavior_key_repeat_data_##n, \ + &behavior_key_repeat_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_repeat_driver_api); DT_INST_FOREACH_STATUS_OKAY(KR_INST) diff --git a/app/src/behaviors/behavior_key_toggle.c b/app/src/behaviors/behavior_key_toggle.c index ae06b14f..cbbdd0d9 100644 --- a/app/src/behaviors/behavior_key_toggle.c +++ b/app/src/behaviors/behavior_key_toggle.c @@ -17,75 +17,28 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -enum toggle_mode { - ON, - OFF, - FLIP, -}; - -struct behavior_key_toggle_config { - enum toggle_mode toggle_mode; -}; +static int behavior_key_toggle_init(const struct device *dev) { return 0; } static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - const struct behavior_key_toggle_config *cfg = - zmk_behavior_get_binding(binding->behavior_dev)->config; - switch (cfg->toggle_mode) { - case ON: - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp); - case OFF: - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, false, - event.timestamp); - case FLIP: - bool pressed = zmk_hid_is_pressed(binding->param1); - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, !pressed, - event.timestamp); - default: - return -ENOTSUP; - }; + bool pressed = zmk_hid_is_pressed(binding->param1); + return ZMK_EVENT_RAISE( + zmk_keycode_state_changed_from_encoded(binding->param1, !pressed, event.timestamp)); } static int on_keymap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - return ZMK_BEHAVIOR_OPAQUE; + return 0; } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata param_values[] = { - { - .display_name = "Key", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_HID_USAGE, - }, -}; - -static const struct behavior_parameter_metadata_set param_metadata_set[] = {{ - .param1_values = param_values, - .param1_values_len = ARRAY_SIZE(param_values), -}}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(param_metadata_set), - .sets = param_metadata_set, -}; - -#endif - static const struct behavior_driver_api behavior_key_toggle_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; #define KT_INST(n) \ - static const struct behavior_key_toggle_config behavior_key_toggle_config_##n = { \ - .toggle_mode = DT_ENUM_IDX(DT_DRV_INST(n), toggle_mode), \ - }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_key_toggle_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_toggle_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_key_toggle_init, NULL, NULL, NULL, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_toggle_driver_api); DT_INST_FOREACH_STATUS_OKAY(KT_INST) diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 3e4d1732..c4728453 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -34,10 +34,6 @@ struct behavior_macro_trigger_state { struct behavior_macro_state { struct behavior_macro_trigger_state release_state; -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - struct behavior_parameter_metadata_set set; -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - uint32_t press_bindings_count; }; @@ -48,18 +44,18 @@ struct behavior_macro_config { struct zmk_behavior_binding bindings[]; }; -#define TAP_MODE DEVICE_DT_NAME(DT_INST(0, zmk_macro_control_mode_tap)) -#define PRESS_MODE DEVICE_DT_NAME(DT_INST(0, zmk_macro_control_mode_press)) -#define REL_MODE DEVICE_DT_NAME(DT_INST(0, zmk_macro_control_mode_release)) +#define TAP_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_tap), label) +#define PRESS_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_press), label) +#define REL_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_release), label) -#define TAP_TIME DEVICE_DT_NAME(DT_INST(0, zmk_macro_control_tap_time)) -#define WAIT_TIME DEVICE_DT_NAME(DT_INST(0, zmk_macro_control_wait_time)) -#define WAIT_REL DEVICE_DT_NAME(DT_INST(0, zmk_macro_pause_for_release)) +#define TAP_TIME DT_PROP(DT_INST(0, zmk_macro_control_tap_time), label) +#define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) +#define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) -#define P1TO1 DEVICE_DT_NAME(DT_INST(0, zmk_macro_param_1to1)) -#define P1TO2 DEVICE_DT_NAME(DT_INST(0, zmk_macro_param_1to2)) -#define P2TO1 DEVICE_DT_NAME(DT_INST(0, zmk_macro_param_2to1)) -#define P2TO2 DEVICE_DT_NAME(DT_INST(0, zmk_macro_param_2to2)) +#define P1TO1 DT_PROP(DT_INST(0, zmk_macro_param_1to1), label) +#define P1TO2 DT_PROP(DT_INST(0, zmk_macro_param_1to2), label) +#define P2TO1 DT_PROP(DT_INST(0, zmk_macro_param_2to1), label) +#define P2TO2 DT_PROP(DT_INST(0, zmk_macro_param_2to2), label) #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) @@ -129,9 +125,7 @@ static int behavior_macro_init(const struct device *dev) { LOG_DBG("Release will resume at %d", state->release_state.start_index); break; } else { - // Mostly ignore regular invokable bindings, except they will consume macro parameters - state->release_state.param1_source = PARAM_SOURCE_BINDING; - state->release_state.param2_source = PARAM_SOURCE_BINDING; + // Ignore regular invokable bindings } } @@ -160,8 +154,7 @@ static void replace_params(struct behavior_macro_trigger_state *state, state->param2_source = PARAM_SOURCE_BINDING; } -static void queue_macro(struct zmk_behavior_binding_event *event, - const struct zmk_behavior_binding bindings[], +static void queue_macro(uint32_t position, const struct zmk_behavior_binding bindings[], struct behavior_macro_trigger_state state, const struct zmk_behavior_binding *macro_binding) { LOG_DBG("Iterating macro bindings - starting: %d, count: %d", state.start_index, state.count); @@ -172,14 +165,14 @@ static void queue_macro(struct zmk_behavior_binding_event *event, switch (state.mode) { case MACRO_MODE_TAP: - zmk_behavior_queue_add(event, binding, true, state.tap_ms); - zmk_behavior_queue_add(event, binding, false, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.tap_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; case MACRO_MODE_PRESS: - zmk_behavior_queue_add(event, binding, true, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.wait_ms); break; case MACRO_MODE_RELEASE: - zmk_behavior_queue_add(event, binding, false, state.wait_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; default: LOG_ERR("Unknown macro mode: %d", state.mode); @@ -191,7 +184,7 @@ static void queue_macro(struct zmk_behavior_binding_event *event, static int on_macro_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_macro_config *cfg = dev->config; struct behavior_macro_state *state = dev->data; struct behavior_macro_trigger_state trigger_state = {.mode = MACRO_MODE_TAP, @@ -200,116 +193,25 @@ static int on_macro_binding_pressed(struct zmk_behavior_binding *binding, .start_index = 0, .count = state->press_bindings_count}; - queue_macro(&event, cfg->bindings, trigger_state, binding); + queue_macro(event.position, cfg->bindings, trigger_state, binding); return ZMK_BEHAVIOR_OPAQUE; } static int on_macro_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_macro_config *cfg = dev->config; struct behavior_macro_state *state = dev->data; - queue_macro(&event, cfg->bindings, state->release_state, binding); + queue_macro(event.position, cfg->bindings, state->release_state, binding); return ZMK_BEHAVIOR_OPAQUE; } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static void assign_values_to_set(enum param_source param_source, - struct behavior_parameter_metadata_set *set, - const struct behavior_parameter_value_metadata *values, - size_t values_len) { - if (param_source == PARAM_SOURCE_MACRO_1ST) { - set->param1_values = values; - set->param1_values_len = values_len; - } else { - set->param2_values = values; - set->param2_values_len = values_len; - } -} - -// This function will dynamically determine the parameter metadata for a particular macro by -// inspecting the macro *bindings* to see what behaviors in that list receive the macro parameters, -// and then using the metadata from those behaviors for the macro itself. -// -// Care need be taken, where a behavior in the list takes two parameters, and the macro passes along -// a value for the *second* parameter, we need to make sure we find the right metadata set for the -// referenced behavior that matches the first parameter. -static int get_macro_parameter_metadata(const struct device *macro, - struct behavior_parameter_metadata *param_metadata) { - const struct behavior_macro_config *cfg = macro->config; - struct behavior_macro_state *data = macro->data; - struct behavior_macro_trigger_state state = {0}; - - for (int i = 0; (i < cfg->count) && (!data->set.param1_values || !data->set.param2_values); - i++) { - if (handle_control_binding(&state, &cfg->bindings[i]) || - (state.param1_source == PARAM_SOURCE_BINDING && - state.param2_source == PARAM_SOURCE_BINDING)) { - continue; - } - - LOG_DBG("checking %d for the given state", i); - - struct behavior_parameter_metadata binding_meta; - int err = behavior_get_parameter_metadata( - zmk_behavior_get_binding(cfg->bindings[i].behavior_dev), &binding_meta); - if (err < 0 || binding_meta.sets_len == 0) { - LOG_WRN("Failed to fetch macro binding parameter details %d", err); - return -ENOTSUP; - } - - // If both macro parameters get passed to this one entry, use - // the metadata for this behavior verbatim. - if (state.param1_source != PARAM_SOURCE_BINDING && - state.param2_source != PARAM_SOURCE_BINDING) { - param_metadata->sets_len = binding_meta.sets_len; - param_metadata->sets = binding_meta.sets; - return 0; - } - - if (state.param1_source != PARAM_SOURCE_BINDING) { - assign_values_to_set(state.param1_source, &data->set, - binding_meta.sets[0].param1_values, - binding_meta.sets[0].param1_values_len); - } - - if (state.param2_source != PARAM_SOURCE_BINDING) { - // For the param2 metadata, we need to find a set that matches fully bound first - // parameter of our macro entry, and use the metadata from that set. - for (int s = 0; s < binding_meta.sets_len; s++) { - if (zmk_behavior_validate_param_values(binding_meta.sets[s].param1_values, - binding_meta.sets[s].param1_values_len, - cfg->bindings[i].param1) >= 0) { - assign_values_to_set(state.param2_source, &data->set, - binding_meta.sets[s].param2_values, - binding_meta.sets[s].param2_values_len); - break; - } - } - } - - state.param1_source = PARAM_SOURCE_BINDING; - state.param2_source = PARAM_SOURCE_BINDING; - } - - param_metadata->sets_len = 1; - param_metadata->sets = &data->set; - - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - static const struct behavior_driver_api behavior_macro_driver_api = { .binding_pressed = on_macro_binding_pressed, .binding_released = on_macro_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = get_macro_parameter_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; #define TRANSFORMED_BEHAVIORS(n) \ @@ -322,9 +224,9 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .default_tap_ms = DT_PROP_OR(inst, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ .count = DT_PROP_LEN(inst, bindings), \ .bindings = TRANSFORMED_BEHAVIORS(inst)}; \ - BEHAVIOR_DT_DEFINE(inst, behavior_macro_init, NULL, &behavior_macro_state_##inst, \ - &behavior_macro_config_##inst, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); + DEVICE_DT_DEFINE(inst, behavior_macro_init, NULL, &behavior_macro_state_##inst, \ + &behavior_macro_config_##inst, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); DT_FOREACH_STATUS_OKAY(zmk_behavior_macro, MACRO_INST) DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_one_param, MACRO_INST) diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index f532f970..d540abd9 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -36,7 +36,7 @@ struct behavior_mod_morph_data { static int on_mod_morph_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_mod_morph_config *cfg = dev->config; struct behavior_mod_morph_data *data = dev->data; @@ -51,12 +51,12 @@ static int on_mod_morph_binding_pressed(struct zmk_behavior_binding *binding, } else { data->pressed_binding = (struct zmk_behavior_binding *)&cfg->normal_binding; } - return zmk_behavior_invoke_binding(data->pressed_binding, event, true); + return behavior_keymap_binding_pressed(data->pressed_binding, event); } static int on_mod_morph_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_mod_morph_data *data = dev->data; if (data->pressed_binding == NULL) { @@ -67,7 +67,7 @@ static int on_mod_morph_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding *pressed_binding = data->pressed_binding; data->pressed_binding = NULL; int err; - err = zmk_behavior_invoke_binding(pressed_binding, event, false); + err = behavior_keymap_binding_released(pressed_binding, event); zmk_hid_masked_modifiers_clear(); return err; } @@ -75,14 +75,13 @@ static int on_mod_morph_binding_released(struct zmk_behavior_binding *binding, static const struct behavior_driver_api behavior_mod_morph_driver_api = { .binding_pressed = on_mod_morph_binding_pressed, .binding_released = on_mod_morph_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; +static int behavior_mod_morph_init(const struct device *dev) { return 0; } + #define _TRANSFORM_ENTRY(idx, node) \ { \ - .behavior_dev = DEVICE_DT_NAME(DT_INST_PHANDLE_BY_IDX(node, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ @@ -98,9 +97,9 @@ static const struct behavior_driver_api behavior_mod_morph_driver_api = { (DT_INST_PROP(n, mods) & ~DT_INST_PROP(n, keep_mods))), \ }; \ static struct behavior_mod_morph_data behavior_mod_morph_data_##n = {}; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, &behavior_mod_morph_data_##n, \ - &behavior_mod_morph_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mod_morph_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_mod_morph_init, NULL, &behavior_mod_morph_data_##n, \ + &behavior_mod_morph_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mod_morph_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 61575d91..c2bd0ffc 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -15,62 +15,29 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) +struct behavior_mo_config {}; +struct behavior_mo_data {}; -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata param_values[] = { - { - .display_name = "Layer", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_LAYER_ID, - }, -}; - -static const struct behavior_parameter_metadata_set param_metadata_set[] = {{ - .param1_values = param_values, - .param1_values_len = ARRAY_SIZE(param_values), -}}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(param_metadata_set), - .sets = param_metadata_set, -}; - -#endif - -struct behavior_mo_config { - bool locking; -}; +static int behavior_mo_init(const struct device *dev) { return 0; }; static int mo_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d layer %d", event.position, binding->param1); - const struct behavior_mo_config *cfg = zmk_behavior_get_binding(binding->behavior_dev)->config; - return zmk_keymap_layer_activate(binding->param1, cfg->locking); + return zmk_keymap_layer_activate(binding->param1); } static int mo_keymap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d layer %d", event.position, binding->param1); - const struct behavior_mo_config *cfg = zmk_behavior_get_binding(binding->behavior_dev)->config; - return zmk_keymap_layer_deactivate(binding->param1, cfg->locking); + return zmk_keymap_layer_deactivate(binding->param1); } static const struct behavior_driver_api behavior_mo_driver_api = { - .binding_pressed = mo_keymap_binding_pressed, - .binding_released = mo_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; + .binding_pressed = mo_keymap_binding_pressed, .binding_released = mo_keymap_binding_released}; -#define MO_INST(n) \ - static const struct behavior_mo_config behavior_mo_config_##n = { \ - .locking = DT_INST_PROP_OR(n, locking, false), \ - }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_mo_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mo_driver_api); +static const struct behavior_mo_config behavior_mo_config = {}; -DT_INST_FOREACH_STATUS_OKAY(MO_INST) +static struct behavior_mo_data behavior_mo_data; -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ \ No newline at end of file +DEVICE_DT_INST_DEFINE(0, behavior_mo_init, NULL, &behavior_mo_data, &behavior_mo_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mo_driver_api); diff --git a/app/src/behaviors/behavior_mouse_key_press.c b/app/src/behaviors/behavior_mouse_key_press.c deleted file mode 100644 index e62fca36..00000000 --- a/app/src/behaviors/behavior_mouse_key_press.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_mouse_key_press - -#include -#include -#include - -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata param_values[] = { - {.display_name = "MB1", .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, .value = MB1}, - {.display_name = "MB2", .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, .value = MB2}, - {.display_name = "MB3", .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, .value = MB3}, - {.display_name = "MB4", .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, .value = MB4}, - {.display_name = "MB5", .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, .value = MB5}}; - -static const struct behavior_parameter_metadata_set param_metadata_set[] = {{ - .param1_values = param_values, - .param1_values_len = ARRAY_SIZE(param_values), -}}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(param_metadata_set), - .sets = param_metadata_set, -}; - -#endif - -static void process_key_state(const struct device *dev, int32_t val, bool pressed) { - for (int i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { - if (val & BIT(i)) { - WRITE_BIT(val, i, 0); - input_report_key(dev, INPUT_BTN_0 + i, pressed ? 1 : 0, val == 0, K_FOREVER); - } - } -} - -static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - - process_key_state(zmk_behavior_get_binding(binding->behavior_dev), binding->param1, true); - - return 0; -} - -static int on_keymap_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - - process_key_state(zmk_behavior_get_binding(binding->behavior_dev), binding->param1, false); - - return 0; -} - -static const struct behavior_driver_api behavior_mouse_key_press_driver_api = { - .binding_pressed = on_keymap_binding_pressed, - .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; - -#define MKP_INST(n) \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, NULL, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_mouse_key_press_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(MKP_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c index 30429c94..613ecbad 100644 --- a/app/src/behaviors/behavior_none.c +++ b/app/src/behaviors/behavior_none.c @@ -16,6 +16,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) +static int behavior_none_init(const struct device *dev) { return 0; }; + static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { return ZMK_BEHAVIOR_OPAQUE; @@ -29,12 +31,9 @@ static int on_keymap_binding_released(struct zmk_behavior_binding *binding, static const struct behavior_driver_api behavior_none_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_none_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_none_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_none_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index e6b51d0c..6ae81a0f 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -20,58 +20,15 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata std_values[] = { - { - .value = OUT_TOG, - .display_name = "Toggle Outputs", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - }, -#if IS_ENABLED(CONFIG_ZMK_USB) - { - .value = OUT_USB, - .display_name = "USB Output", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - }, -#endif // IS_ENABLED(CONFIG_ZMK_USB) -#if IS_ENABLED(CONFIG_ZMK_BLE) - { - .value = OUT_BLE, - .display_name = "BLE Output", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - }, -#endif // IS_ENABLED(CONFIG_ZMK_BLE) - { - .value = OUT_NONE, - .display_name = "No Output", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - }, -}; - -static const struct behavior_parameter_metadata_set std_set = { - .param1_values = std_values, - .param1_values_len = ARRAY_SIZE(std_values), -}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = 1, - .sets = &std_set, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { switch (binding->param1) { case OUT_TOG: - return zmk_endpoint_toggle_preferred_transport(); + return zmk_endpoints_toggle_transport(); case OUT_USB: - return zmk_endpoint_set_preferred_transport(ZMK_TRANSPORT_USB); + return zmk_endpoints_select_transport(ZMK_TRANSPORT_USB); case OUT_BLE: - return zmk_endpoint_set_preferred_transport(ZMK_TRANSPORT_BLE); - case OUT_NONE: - return zmk_endpoint_set_preferred_transport(ZMK_TRANSPORT_NONE); + return zmk_endpoints_select_transport(ZMK_TRANSPORT_BLE); default: LOG_ERR("Unknown output command: %d", binding->param1); } @@ -79,14 +36,13 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, return -ENOTSUP; } +static int behavior_out_init(const struct device *dev) { return 0; } + static const struct behavior_driver_api behavior_outputs_driver_api = { .binding_pressed = on_keymap_binding_pressed, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_outputs_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_out_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_outputs_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 67f33aae..0b983c84 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -14,62 +14,38 @@ #include -#if IS_ENABLED(CONFIG_RETENTION_BOOT_MODE) - -#include - -#endif /* IS_ENABLED(CONFIG_RETENTION_BOOT_MODE) */ - LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) struct behavior_reset_config { -#if IS_ENABLED(CONFIG_RETENTION_BOOT_MODE) - enum BOOT_MODE_TYPES boot_mode; -#else int type; -#endif /* IS_ENABLED(CONFIG_RETENTION_BOOT_MODE) */ }; +static int behavior_reset_init(const struct device *dev) { return 0; }; + static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_reset_config *cfg = dev->config; -#if IS_ENABLED(CONFIG_RETENTION_BOOT_MODE) - int ret = bootmode_set(cfg->boot_mode); - if (ret < 0) { - LOG_ERR("Failed to set the bootloader mode (%d)", ret); - return ZMK_BEHAVIOR_OPAQUE; - } - - sys_reboot(SYS_REBOOT_WARM); -#else + // TODO: Correct magic code for going into DFU? // See // https://github.com/adafruit/Adafruit_nRF52_Bootloader/blob/d6b28e66053eea467166f44875e3c7ec741cb471/src/main.c#L107 sys_reboot(cfg->type); -#endif /* IS_ENABLED(CONFIG_RETENTION_BOOT_MODE) */ - return ZMK_BEHAVIOR_OPAQUE; } static const struct behavior_driver_api behavior_reset_driver_api = { .binding_pressed = on_keymap_binding_pressed, .locality = BEHAVIOR_LOCALITY_EVENT_SOURCE, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; #define RST_INST(n) \ static const struct behavior_reset_config behavior_reset_config_##n = { \ - COND_CODE_1( \ - IS_ENABLED(CONFIG_RETENTION_BOOT_MODE), \ - (DT_INST_PROP(n, bootloader) ? BOOT_MODE_TYPE_BOOTLOADER : BOOT_MODE_TYPE_NORMAL), \ - (.type = DT_INST_PROP(n, type))), \ - }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_reset_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_reset_driver_api); + .type = DT_INST_PROP(n, type)}; \ + DEVICE_DT_INST_DEFINE(n, behavior_reset_init, NULL, NULL, &behavior_reset_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_reset_driver_api); DT_INST_FOREACH_STATUS_OKAY(RST_INST) diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 80cd5182..0af07f81 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -18,118 +18,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata no_arg_values[] = { - { - .display_name = "Toggle On/Off", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_TOG_CMD, - }, - { - .display_name = "Turn On", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_ON_CMD, - }, - { - .display_name = "Turn OFF", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_OFF_CMD, - }, - { - .display_name = "Hue Up", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_HUI_CMD, - }, - { - .display_name = "Hue Down", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_HUD_CMD, - }, - { - .display_name = "Saturation Up", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_SAI_CMD, - }, - { - .display_name = "Saturation Down", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_SAD_CMD, - }, - { - .display_name = "Brightness Up", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_BRI_CMD, - }, - { - .display_name = "Brightness Down", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_BRD_CMD, - }, - { - .display_name = "Speed Up", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_SPI_CMD, - }, - { - .display_name = "Speed Down", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_SPD_CMD, - }, - { - .display_name = "Next Effect", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_EFF_CMD, - }, - { - .display_name = "Previous Effect", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_EFR_CMD, - }, -}; - -static const struct behavior_parameter_metadata_set no_args_set = { - .param1_values = no_arg_values, - .param1_values_len = ARRAY_SIZE(no_arg_values), -}; - -/* -static const struct behavior_parameter_value_metadata hsv_p1_value_metadata_values[] = { - { - .display_name = "Set Color", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = RGB_COLOR_HSB_CMD, - }, -}; - -static const struct behavior_parameter_value_metadata hsv_p2_value_metadata_values[] = { - { - .display_name = "Color", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_STANDARD, - .standard = BEHAVIOR_PARAMETER_STANDARD_DOMAIN_HSV, - }, -}; - -static const struct behavior_parameter_metadata_set hsv_value_metadata_set = { - .param1_values = hsv_p1_value_metadata_values, - .param1_values_len = ARRAY_SIZE(hsv_p1_value_metadata_values), - .param_values = hsv_p2_value_metadata_values, - .param_values_len = ARRAY_SIZE(hsv_p2_value_metadata_values), -}; - -*/ - -static const struct behavior_parameter_metadata_set sets[] = { - no_args_set, - // hsv_value_metadata_set, -}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(sets), - .sets = sets, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) +static int behavior_rgb_underglow_init(const struct device *dev) { return 0; } static int on_keymap_binding_convert_central_state_dependent_params(struct zmk_behavior_binding *binding, @@ -258,12 +147,9 @@ static const struct behavior_driver_api behavior_rgb_underglow_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, .locality = BEHAVIOR_LOCALITY_GLOBAL, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_rgb_underglow_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_rgb_underglow_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_rgb_underglow_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 4a59c5df..822bc206 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -16,9 +16,11 @@ static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; +static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; + #define _TRANSFORM_ENTRY(idx, node) \ { \ - .behavior_dev = DEVICE_DT_NAME(DT_INST_PHANDLE_BY_IDX(node, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ @@ -33,8 +35,9 @@ static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { .override_params = false, \ }; \ static struct behavior_sensor_rotate_data behavior_sensor_rotate_data_##n = {}; \ - BEHAVIOR_DT_INST_DEFINE( \ - n, NULL, NULL, &behavior_sensor_rotate_data_##n, &behavior_sensor_rotate_config_##n, \ - POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_init, NULL, &behavior_sensor_rotate_data_##n, \ + &behavior_sensor_rotate_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 72461286..98b4aec1 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -6,7 +6,6 @@ #include #include -#include #include "behavior_sensor_rotate_common.h" @@ -16,7 +15,7 @@ int zmk_behavior_sensor_rotate_common_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_sensor_rotate_data *data = dev->data; const struct sensor_value value = channel_data[0].value; @@ -34,7 +33,7 @@ int zmk_behavior_sensor_rotate_common_accept_data( remainder.val1 += value.val1; remainder.val2 += value.val2; - if (abs(remainder.val2) >= 1000000) { + if (remainder.val2 >= 1000000 || remainder.val2 <= 1000000) { remainder.val1 += remainder.val2 / 1000000; remainder.val2 %= 1000000; } @@ -59,7 +58,7 @@ int zmk_behavior_sensor_rotate_common_accept_data( int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; @@ -90,14 +89,9 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi LOG_DBG("Sensor binding: %s", binding->behavior_dev); -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - // set this value so that it always triggers on central, can be handled more properly later - event.source = ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL; -#endif - for (int i = 0; i < triggers; i++) { - zmk_behavior_queue_add(&event, triggered_binding, true, cfg->tap_ms); - zmk_behavior_queue_add(&event, triggered_binding, false, 0); + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); } return ZMK_BEHAVIOR_OPAQUE; diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index b096c46a..e6d20cab 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -16,17 +16,19 @@ static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; +static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; + #define SENSOR_ROTATE_VAR_INST(n) \ static struct behavior_sensor_rotate_config behavior_sensor_rotate_var_config_##n = { \ - .cw_binding = {.behavior_dev = DEVICE_DT_NAME(DT_INST_PHANDLE_BY_IDX(n, bindings, 0))}, \ - .ccw_binding = {.behavior_dev = DEVICE_DT_NAME(DT_INST_PHANDLE_BY_IDX(n, bindings, 1))}, \ + .cw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label)}, \ + .ccw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label)}, \ .tap_ms = DT_INST_PROP(n, tap_ms), \ .override_params = true, \ }; \ static struct behavior_sensor_rotate_data behavior_sensor_rotate_var_data_##n = {}; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, &behavior_sensor_rotate_var_data_##n, \ - &behavior_sensor_rotate_var_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_sensor_rotate_var_driver_api); + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_var_init, NULL, &behavior_sensor_rotate_var_data_##n, \ + &behavior_sensor_rotate_var_config_##n, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_var_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/behaviors/behavior_soft_off.c b/app/src/behaviors/behavior_soft_off.c deleted file mode 100644 index 1f9b1aaf..00000000 --- a/app/src/behaviors/behavior_soft_off.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_soft_off - -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct behavior_soft_off_config { - bool split_peripheral_turn_off_on_press; - uint32_t hold_time_ms; -}; - -struct behavior_soft_off_data { - uint32_t press_start; -}; - -#define IS_SPLIT_PERIPHERAL \ - (IS_ENABLED(CONFIG_ZMK_SPLIT) && !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) - -static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); - struct behavior_soft_off_data *data = dev->data; - const struct behavior_soft_off_config *config = dev->config; - - if (IS_SPLIT_PERIPHERAL && config->split_peripheral_turn_off_on_press) { - zmk_pm_soft_off(); - } else { - data->press_start = k_uptime_get(); - } - - return ZMK_BEHAVIOR_OPAQUE; -} - -static int on_keymap_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); - struct behavior_soft_off_data *data = dev->data; - const struct behavior_soft_off_config *config = dev->config; - - if (config->hold_time_ms == 0) { - LOG_DBG("No hold time set, triggering soft off"); - zmk_pm_soft_off(); - } else { - uint32_t hold_time = k_uptime_get() - data->press_start; - - if (hold_time > config->hold_time_ms) { - if (IS_ENABLED(CONFIG_ZMK_SPLIT) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) { - k_sleep(K_MSEC(100)); - } - zmk_pm_soft_off(); - } else { - LOG_INF("Not triggering soft off: held for %d and hold time is %d", hold_time, - config->hold_time_ms); - } - } - - return ZMK_BEHAVIOR_OPAQUE; -} - -static const struct behavior_driver_api behavior_soft_off_driver_api = { - .binding_pressed = on_keymap_binding_pressed, - .binding_released = on_keymap_binding_released, - .locality = BEHAVIOR_LOCALITY_GLOBAL, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; - -#define BSO_INST(n) \ - static const struct behavior_soft_off_config bso_config_##n = { \ - .hold_time_ms = DT_INST_PROP_OR(n, hold_time_ms, 0), \ - .split_peripheral_turn_off_on_press = \ - DT_INST_PROP_OR(n, split_peripheral_off_on_press, false), \ - }; \ - static struct behavior_soft_off_data bso_data_##n = {}; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, &bso_data_##n, &bso_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_soft_off_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(BSO_INST) diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index babdeb7d..6697b9b1 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -24,26 +24,21 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#define KEY_PRESS DEVICE_DT_NAME(DT_INST(0, zmk_behavior_key_press)) - -#define ZMK_BHV_STICKY_KEY_MAX_HELD CONFIG_ZMK_BEHAVIOR_STICKY_KEY_MAX_HELD +#define ZMK_BHV_STICKY_KEY_MAX_HELD 10 #define ZMK_BHV_STICKY_KEY_POSITION_FREE UINT32_MAX struct behavior_sticky_key_config { uint32_t release_after_ms; bool quick_release; - bool lazy; bool ignore_modifiers; struct zmk_behavior_binding behavior; }; struct active_sticky_key { uint32_t position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - uint8_t source; -#endif uint32_t param1; + uint32_t param2; const struct behavior_sticky_key_config *config; // timer data. bool timer_started; @@ -57,8 +52,8 @@ struct active_sticky_key { struct active_sticky_key active_sticky_keys[ZMK_BHV_STICKY_KEY_MAX_HELD] = {}; -static struct active_sticky_key *store_sticky_key(struct zmk_behavior_binding_event *event, - uint32_t param1, +static struct active_sticky_key *store_sticky_key(uint32_t position, uint32_t param1, + uint32_t param2, const struct behavior_sticky_key_config *config) { for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { struct active_sticky_key *const sticky_key = &active_sticky_keys[i]; @@ -66,11 +61,9 @@ static struct active_sticky_key *store_sticky_key(struct zmk_behavior_binding_ev sticky_key->timer_cancelled) { continue; } - sticky_key->position = event->position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - sticky_key->source = event->source; -#endif + sticky_key->position = position; sticky_key->param1 = param1; + sticky_key->param2 = param2; sticky_key->config = config; sticky_key->release_at = 0; sticky_key->timer_cancelled = false; @@ -83,18 +76,12 @@ static struct active_sticky_key *store_sticky_key(struct zmk_behavior_binding_ev } static void clear_sticky_key(struct active_sticky_key *sticky_key) { - LOG_DBG("clearing sticky key at position %d, param %d", sticky_key->position, - sticky_key->param1); sticky_key->position = ZMK_BHV_STICKY_KEY_POSITION_FREE; } -static struct active_sticky_key * -find_sticky_key(uint32_t position, struct zmk_behavior_binding behavior, uint32_t binding_param) { +static struct active_sticky_key *find_sticky_key(uint32_t position) { for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { - if (active_sticky_keys[i].position == position && - active_sticky_keys[i].config->behavior.behavior_dev == behavior.behavior_dev && - active_sticky_keys[i].param1 == binding_param && - !active_sticky_keys[i].timer_cancelled) { + if (active_sticky_keys[i].position == position && !active_sticky_keys[i].timer_cancelled) { return &active_sticky_keys[i]; } } @@ -106,15 +93,13 @@ static inline int press_sticky_key_behavior(struct active_sticky_key *sticky_key struct zmk_behavior_binding binding = { .behavior_dev = sticky_key->config->behavior.behavior_dev, .param1 = sticky_key->param1, + .param2 = sticky_key->param2, }; struct zmk_behavior_binding_event event = { .position = sticky_key->position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = sticky_key->source, -#endif }; - return zmk_behavior_invoke_binding(&binding, event, true); + return behavior_keymap_binding_pressed(&binding, event); } static inline int release_sticky_key_behavior(struct active_sticky_key *sticky_key, @@ -122,26 +107,15 @@ static inline int release_sticky_key_behavior(struct active_sticky_key *sticky_k struct zmk_behavior_binding binding = { .behavior_dev = sticky_key->config->behavior.behavior_dev, .param1 = sticky_key->param1, + .param2 = sticky_key->param2, }; struct zmk_behavior_binding_event event = { .position = sticky_key->position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = sticky_key->source, -#endif }; clear_sticky_key(sticky_key); - return zmk_behavior_invoke_binding(&binding, event, false); -} - -static inline void on_sticky_key_timeout(struct active_sticky_key *sticky_key) { - // If the key is lazy, a release is not needed on timeout - if (sticky_key->config->lazy) { - clear_sticky_key(sticky_key); - } else { - release_sticky_key_behavior(sticky_key, sticky_key->release_at); - } + return behavior_keymap_binding_released(&binding, event); } static int stop_timer(struct active_sticky_key *sticky_key) { @@ -155,36 +129,29 @@ static int stop_timer(struct active_sticky_key *sticky_key) { static int on_sticky_key_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_sticky_key_config *cfg = dev->config; struct active_sticky_key *sticky_key; - sticky_key = find_sticky_key(event.position, cfg->behavior, binding->param1); + sticky_key = find_sticky_key(event.position); if (sticky_key != NULL) { - LOG_DBG("found same sticky key pressed at position %d, release it first", event.position); stop_timer(sticky_key); release_sticky_key_behavior(sticky_key, event.timestamp); } - sticky_key = store_sticky_key(&event, binding->param1, cfg); + sticky_key = store_sticky_key(event.position, binding->param1, binding->param2, cfg); if (sticky_key == NULL) { LOG_ERR("unable to store sticky key, did you press more than %d sticky_key?", ZMK_BHV_STICKY_KEY_MAX_HELD); return ZMK_BEHAVIOR_OPAQUE; } + press_sticky_key_behavior(sticky_key, event.timestamp); LOG_DBG("%d new sticky_key", event.position); - if (!sticky_key->config->lazy) { - // press the key now if it's not lazy - press_sticky_key_behavior(sticky_key, event.timestamp); - } return ZMK_BEHAVIOR_OPAQUE; } static int on_sticky_key_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); - const struct behavior_sticky_key_config *cfg = dev->config; - struct active_sticky_key *sticky_key = - find_sticky_key(event.position, cfg->behavior, binding->param1); + struct active_sticky_key *sticky_key = find_sticky_key(event.position); if (sticky_key == NULL) { LOG_ERR("ACTIVE STICKY KEY CLEARED TOO EARLY"); return ZMK_BEHAVIOR_OPAQUE; @@ -206,42 +173,9 @@ static int on_sticky_key_binding_released(struct zmk_behavior_binding *binding, return ZMK_BEHAVIOR_OPAQUE; } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static int sticky_key_parameter_domains(const struct device *sk, - struct behavior_parameter_metadata *param_metadata) { - const struct behavior_sticky_key_config *cfg = sk->config; - - struct behavior_parameter_metadata child_metadata; - - int err = behavior_get_parameter_metadata(zmk_behavior_get_binding(cfg->behavior.behavior_dev), - &child_metadata); - if (err < 0) { - LOG_WRN("Failed to get the sticky key bound behavior parameter: %d", err); - return err; - } - - for (int s = 0; s < child_metadata.sets_len; s++) { - const struct behavior_parameter_metadata_set *set = &child_metadata.sets[s]; - - if (set->param2_values_len > 0) { - return -ENOTSUP; - } - } - - *param_metadata = child_metadata; - - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - static const struct behavior_driver_api behavior_sticky_key_driver_api = { .binding_pressed = on_sticky_key_binding_pressed, .binding_released = on_sticky_key_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = sticky_key_parameter_domains, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh); @@ -255,27 +189,20 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { return ZMK_EV_EVENT_BUBBLE; } - // we want to make sure every sticky key is given a chance to lazy press their behavior before - // the event gets reraised, and release their behavior after the event is reraised, so we keep - // track of them. this allows us to ensure the sticky key is pressed and released "around" the - // other key, especially in the case of lazy keys. - struct active_sticky_key *sticky_keys_to_press_before_reraise[ZMK_BHV_STICKY_KEY_MAX_HELD]; - struct active_sticky_key *sticky_keys_to_release_after_reraise[ZMK_BHV_STICKY_KEY_MAX_HELD]; + // keep track whether the event has been reraised, so we only reraise it once + bool event_reraised = false; // reraising the event frees it, so make a copy of any event data we might // need after it's been freed. const struct zmk_keycode_state_changed ev_copy = *ev; for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { - sticky_keys_to_press_before_reraise[i] = NULL; - sticky_keys_to_release_after_reraise[i] = NULL; - struct active_sticky_key *sticky_key = &active_sticky_keys[i]; if (sticky_key->position == ZMK_BHV_STICKY_KEY_POSITION_FREE) { continue; } - if (strcmp(sticky_key->config->behavior.behavior_dev, KEY_PRESS) == 0 && + if (strcmp(sticky_key->config->behavior.behavior_dev, "KEY_PRESS") == 0 && ZMK_HID_USAGE_ID(sticky_key->param1) == ev_copy.keycode && ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev_copy.usage_page && SELECT_MODS(sticky_key->param1) == ev_copy.implicit_modifiers) { @@ -283,6 +210,14 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { continue; } + // If this event was queued, the timer may be triggered late or not at all. + // Release the sticky key if the timer should've run out in the meantime. + if (sticky_key->release_at != 0 && ev_copy.timestamp > sticky_key->release_at) { + stop_timer(sticky_key); + release_sticky_key_behavior(sticky_key, sticky_key->release_at); + continue; + } + if (ev_copy.state) { // key down if (sticky_key->config->ignore_modifiers && is_mod(ev_copy.usage_page, ev_copy.keycode)) { @@ -294,25 +229,15 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { // this sticky key is already in use for a keycode continue; } - - // we don't want the timer to release the sticky key before the other key is released - stop_timer(sticky_key); - - // If this event was queued, the timer may be triggered late or not at all. - // Release the sticky key if the timer should've run out in the meantime. - if (sticky_key->release_at != 0 && ev_copy.timestamp > sticky_key->release_at) { - on_sticky_key_timeout(sticky_key); - continue; - } - - if (sticky_key->config->lazy) { - // if the sticky key is lazy, we need to press it before the event is reraised - sticky_keys_to_press_before_reraise[i] = sticky_key; - } if (sticky_key->timer_started) { + stop_timer(sticky_key); if (sticky_key->config->quick_release) { // immediately release the sticky key after the key press is handled. - sticky_keys_to_release_after_reraise[i] = sticky_key; + if (!event_reraised) { + ZMK_EVENT_RAISE_AFTER(eh, behavior_sticky_key); + event_reraised = true; + } + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } sticky_key->modified_key_usage_page = ev_copy.usage_page; @@ -322,52 +247,26 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { sticky_key->modified_key_usage_page == ev_copy.usage_page && sticky_key->modified_key_keycode == ev_copy.keycode) { stop_timer(sticky_key); - sticky_keys_to_release_after_reraise[i] = sticky_key; + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } } - - // give each sticky key a chance to press their behavior before the event is reraised - for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { - struct active_sticky_key *sticky_key = sticky_keys_to_press_before_reraise[i]; - if (!sticky_key) { - continue; - } - - press_sticky_key_behavior(sticky_key, ev_copy.timestamp); + if (event_reraised) { + return ZMK_EV_EVENT_CAPTURED; } - // give each sticky key a chance to release their behavior after the event is reraised, lazily - // reraising. keep track whether the event has been reraised so we only reraise it once - bool event_reraised = false; - for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { - struct active_sticky_key *sticky_key = sticky_keys_to_release_after_reraise[i]; - if (!sticky_key) { - continue; - } - - if (!event_reraised) { - struct zmk_keycode_state_changed_event dupe_ev = - copy_raised_zmk_keycode_state_changed(ev); - ZMK_EVENT_RAISE_AFTER(dupe_ev, behavior_sticky_key); - event_reraised = true; - } - release_sticky_key_behavior(sticky_key, ev_copy.timestamp); - } - - return event_reraised ? ZMK_EV_EVENT_CAPTURED : ZMK_EV_EVENT_BUBBLE; + return ZMK_EV_EVENT_BUBBLE; } void behavior_sticky_key_timer_handler(struct k_work *item) { - struct k_work_delayable *d_work = k_work_delayable_from_work(item); struct active_sticky_key *sticky_key = - CONTAINER_OF(d_work, struct active_sticky_key, release_timer); + CONTAINER_OF(item, struct active_sticky_key, release_timer); if (sticky_key->position == ZMK_BHV_STICKY_KEY_POSITION_FREE) { return; } if (sticky_key->timer_cancelled) { sticky_key->timer_cancelled = false; } else { - on_sticky_key_timeout(sticky_key); + release_sticky_key_behavior(sticky_key, sticky_key->release_at); } } @@ -384,17 +283,19 @@ static int behavior_sticky_key_init(const struct device *dev) { return 0; } +struct behavior_sticky_key_data {}; +static struct behavior_sticky_key_data behavior_sticky_key_data; + #define KP_INST(n) \ - static const struct behavior_sticky_key_config behavior_sticky_key_config_##n = { \ + static struct behavior_sticky_key_config behavior_sticky_key_config_##n = { \ .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, DT_DRV_INST(n)), \ .release_after_ms = DT_INST_PROP(n, release_after_ms), \ - .quick_release = DT_INST_PROP(n, quick_release), \ - .lazy = DT_INST_PROP(n, lazy), \ .ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \ + .quick_release = DT_INST_PROP(n, quick_release), \ }; \ - BEHAVIOR_DT_INST_DEFINE(n, behavior_sticky_key_init, NULL, NULL, \ - &behavior_sticky_key_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sticky_key_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_sticky_key_init, NULL, &behavior_sticky_key_data, \ + &behavior_sticky_key_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sticky_key_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_studio_unlock.c b/app/src/behaviors/behavior_studio_unlock.c deleted file mode 100644 index 66bb1f6f..00000000 --- a/app/src/behaviors/behavior_studio_unlock.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_studio_unlock - -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - zmk_studio_core_unlock(); - - return ZMK_BEHAVIOR_OPAQUE; -} - -static int on_keymap_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return ZMK_BEHAVIOR_OPAQUE; -} - -static const struct behavior_driver_api behavior_studio_unlock_driver_api = { - .binding_pressed = on_keymap_binding_pressed, - .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; - -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_studio_unlock_driver_api); - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index bbc301f1..fc685124 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -21,7 +21,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#define ZMK_BHV_TAP_DANCE_MAX_HELD CONFIG_ZMK_BEHAVIOR_TAP_DANCE_MAX_HELD +#define ZMK_BHV_TAP_DANCE_MAX_HELD 10 #define ZMK_BHV_TAP_DANCE_POSITION_FREE UINT32_MAX @@ -35,9 +35,6 @@ struct active_tap_dance { // Tap Dance Data int counter; uint32_t position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - uint8_t source; -#endif uint32_t param1; uint32_t param2; bool is_pressed; @@ -62,17 +59,13 @@ static struct active_tap_dance *find_tap_dance(uint32_t position) { return NULL; } -static int new_tap_dance(struct zmk_behavior_binding_event *event, - const struct behavior_tap_dance_config *config, +static int new_tap_dance(uint32_t position, const struct behavior_tap_dance_config *config, struct active_tap_dance **tap_dance) { for (int i = 0; i < ZMK_BHV_TAP_DANCE_MAX_HELD; i++) { struct active_tap_dance *const ref_dance = &active_tap_dances[i]; if (ref_dance->position == ZMK_BHV_TAP_DANCE_POSITION_FREE) { ref_dance->counter = 0; - ref_dance->position = event->position; -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - ref_dance->source = event->source; -#endif + ref_dance->position = position; ref_dance->config = config; ref_dance->release_at = 0; ref_dance->is_pressed = true; @@ -115,11 +108,8 @@ static inline int press_tap_dance_behavior(struct active_tap_dance *tap_dance, i struct zmk_behavior_binding_event event = { .position = tap_dance->position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = tap_dance->source, -#endif }; - return zmk_behavior_invoke_binding(&binding, event, true); + return behavior_keymap_binding_pressed(&binding, event); } static inline int release_tap_dance_behavior(struct active_tap_dance *tap_dance, @@ -128,22 +118,19 @@ static inline int release_tap_dance_behavior(struct active_tap_dance *tap_dance, struct zmk_behavior_binding_event event = { .position = tap_dance->position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = tap_dance->source, -#endif }; clear_tap_dance(tap_dance); - return zmk_behavior_invoke_binding(&binding, event, false); + return behavior_keymap_binding_released(&binding, event); } static int on_tap_dance_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_tap_dance_config *cfg = dev->config; struct active_tap_dance *tap_dance; tap_dance = find_tap_dance(event.position); if (tap_dance == NULL) { - if (new_tap_dance(&event, cfg, &tap_dance) == -ENOMEM) { + if (new_tap_dance(event.position, cfg, &tap_dance) == -ENOMEM) { LOG_ERR("Unable to create new tap dance. Insufficient space in active_tap_dances[]."); return ZMK_BEHAVIOR_OPAQUE; } @@ -182,9 +169,7 @@ static int on_tap_dance_binding_released(struct zmk_behavior_binding *binding, } void behavior_tap_dance_timer_handler(struct k_work *item) { - struct k_work_delayable *d_work = k_work_delayable_from_work(item); - struct active_tap_dance *tap_dance = - CONTAINER_OF(d_work, struct active_tap_dance, release_timer); + struct active_tap_dance *tap_dance = CONTAINER_OF(item, struct active_tap_dance, release_timer); if (tap_dance->position == ZMK_BHV_TAP_DANCE_POSITION_FREE) { return; } @@ -202,9 +187,6 @@ void behavior_tap_dance_timer_handler(struct k_work *item) { static const struct behavior_driver_api behavior_tap_dance_driver_api = { .binding_pressed = on_tap_dance_binding_pressed, .binding_released = on_tap_dance_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; static int tap_dance_position_state_changed_listener(const zmk_event_t *eh); @@ -258,7 +240,7 @@ static int behavior_tap_dance_init(const struct device *dev) { #define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - {LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (, ), DT_DRV_INST(node))} + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (, ), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ @@ -268,10 +250,10 @@ static int behavior_tap_dance_init(const struct device *dev) { .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ .behaviors = behavior_tap_dance_config_##n##_bindings, \ .behavior_count = DT_INST_PROP_LEN(n, bindings)}; \ - BEHAVIOR_DT_INST_DEFINE(n, behavior_tap_dance_init, NULL, NULL, \ - &behavior_tap_dance_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tap_dance_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_tap_dance_init, NULL, NULL, &behavior_tap_dance_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_tap_dance_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) -#endif +#endif \ No newline at end of file diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index 61a96965..c05b83ea 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -17,15 +17,12 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -struct behavior_to_config { - bool locking; -}; +static int behavior_to_init(const struct device *dev) { return 0; }; static int to_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d layer %d", event.position, binding->param1); - const struct behavior_to_config *cfg = zmk_behavior_get_binding(binding->behavior_dev)->config; - zmk_keymap_layer_to(binding->param1, cfg->locking); + zmk_keymap_layer_to(binding->param1); return ZMK_BEHAVIOR_OPAQUE; } @@ -35,42 +32,12 @@ static int to_keymap_binding_released(struct zmk_behavior_binding *binding, return ZMK_BEHAVIOR_OPAQUE; } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata param_values[] = { - { - .display_name = "Layer", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_LAYER_ID, - }, -}; - -static const struct behavior_parameter_metadata_set param_metadata_set[] = {{ - .param1_values = param_values, - .param1_values_len = ARRAY_SIZE(param_values), -}}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(param_metadata_set), - .sets = param_metadata_set, -}; - -#endif - static const struct behavior_driver_api behavior_to_driver_api = { .binding_pressed = to_keymap_binding_pressed, .binding_released = to_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -#define TO_INST(n) \ - static const struct behavior_to_config behavior_to_config_##n = { \ - .locking = DT_INST_PROP_OR(n, locking, false), \ - }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_to_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_to_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(TO_INST) +DEVICE_DT_INST_DEFINE(0, behavior_to_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_to_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index 755b5832..73a700ed 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -17,32 +17,15 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -enum toggle_mode { - ON, - OFF, - FLIP, -}; +struct behavior_tog_config {}; +struct behavior_tog_data {}; -struct behavior_tog_config { - enum toggle_mode toggle_mode; - bool locking; -}; +static int behavior_tog_init(const struct device *dev) { return 0; }; static int tog_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d layer %d", event.position, binding->param1); - - const struct behavior_tog_config *cfg = zmk_behavior_get_binding(binding->behavior_dev)->config; - switch (cfg->toggle_mode) { - case ON: - return zmk_keymap_layer_activate(binding->param1, cfg->locking); - case OFF: - return zmk_keymap_layer_deactivate(binding->param1, cfg->locking); - case FLIP: - return zmk_keymap_layer_toggle(binding->param1, cfg->locking); - default: - return -ENOTSUP; - }; + return zmk_keymap_layer_toggle(binding->param1); } static int tog_keymap_binding_released(struct zmk_behavior_binding *binding, @@ -51,43 +34,16 @@ static int tog_keymap_binding_released(struct zmk_behavior_binding *binding, return ZMK_BEHAVIOR_OPAQUE; } -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -static const struct behavior_parameter_value_metadata param_values[] = { - { - .display_name = "Layer", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_LAYER_ID, - }, -}; - -static const struct behavior_parameter_metadata_set param_metadata_set[] = {{ - .param1_values = param_values, - .param1_values_len = ARRAY_SIZE(param_values), -}}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(param_metadata_set), - .sets = param_metadata_set, -}; - -#endif - static const struct behavior_driver_api behavior_tog_driver_api = { .binding_pressed = tog_keymap_binding_pressed, .binding_released = tog_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -#define TG_INST(n) \ - static const struct behavior_tog_config behavior_tog_config_##n = { \ - .toggle_mode = DT_ENUM_IDX(DT_DRV_INST(n), toggle_mode), \ - .locking = DT_INST_PROP_OR(n, locking, false), \ - }; \ - BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_tog_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tog_driver_api); +static const struct behavior_tog_config behavior_tog_config = {}; -DT_INST_FOREACH_STATUS_OKAY(TG_INST) +static struct behavior_tog_data behavior_tog_data; + +DEVICE_DT_INST_DEFINE(0, behavior_tog_init, NULL, &behavior_tog_data, &behavior_tog_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tog_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index 42a9d032..eeb2242d 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -16,6 +16,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) +static int behavior_transparent_init(const struct device *dev) { return 0; }; + static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { return ZMK_BEHAVIOR_TRANSPARENT; @@ -29,12 +31,9 @@ static int on_keymap_binding_released(struct zmk_behavior_binding *binding, static const struct behavior_driver_api behavior_transparent_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_transparent_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_transparent_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_transparent_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/ble.c b/app/src/ble.c index 51b172b9..483bc9d7 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #if IS_ENABLED(CONFIG_SETTINGS) @@ -56,8 +56,8 @@ enum advertising_type { #define CURR_ADV(adv) (adv << 4) #define ZMK_ADV_CONN_NAME \ - BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_USE_NAME | BT_LE_ADV_OPT_FORCE_NAME_IN_AD, \ - BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2, NULL) + BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME, BT_GAP_ADV_FAST_INT_MIN_2, \ + BT_GAP_ADV_FAST_INT_MAX_2, NULL) static struct zmk_ble_profile profiles[ZMK_BLE_PROFILE_COUNT]; static uint8_t active_profile; @@ -65,27 +65,26 @@ static uint8_t active_profile; #define DEVICE_NAME CONFIG_BT_DEVICE_NAME #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) -BUILD_ASSERT( - DEVICE_NAME_LEN <= CONFIG_BT_DEVICE_NAME_MAX, - "ERROR: BLE device name is too long. Max length: " STRINGIFY(CONFIG_BT_DEVICE_NAME_MAX)); +BUILD_ASSERT(DEVICE_NAME_LEN <= 16, "ERROR: BLE device name is too long. Max length: 16"); -static struct bt_data zmk_ble_ad[] = { - BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, BT_BYTES_LIST_LE16(CONFIG_BT_DEVICE_APPEARANCE)), +static const struct bt_data zmk_ble_ad[] = { + BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN), + BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, 0xC1, 0x03), BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA_BYTES(BT_DATA_UUID16_SOME, BT_UUID_16_ENCODE(BT_UUID_HIDS_VAL), /* HID Service */ - BT_UUID_16_ENCODE(BT_UUID_BAS_VAL) /* Battery Service */ + BT_DATA_BYTES(BT_DATA_UUID16_SOME, 0x12, 0x18, /* HID Service */ + 0x0f, 0x18 /* Battery Service */ ), }; -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) +#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) static bt_addr_le_t peripheral_addrs[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ -static void raise_profile_changed_event(void) { - raise_zmk_ble_active_profile_changed((struct zmk_ble_active_profile_changed){ - .index = active_profile, .profile = &profiles[active_profile]}); +static void raise_profile_changed_event() { + ZMK_EVENT_RAISE(new_zmk_ble_active_profile_changed((struct zmk_ble_active_profile_changed){ + .index = active_profile, .profile = &profiles[active_profile]})); } static void raise_profile_changed_event_callback(struct k_work *work) { @@ -94,17 +93,12 @@ static void raise_profile_changed_event_callback(struct k_work *work) { K_WORK_DEFINE(raise_profile_changed_event_work, raise_profile_changed_event_callback); -bool zmk_ble_active_profile_is_open(void) { return zmk_ble_profile_is_open(active_profile); } - -bool zmk_ble_profile_is_open(uint8_t index) { - if (index >= ZMK_BLE_PROFILE_COUNT) { - return false; - } - return !bt_addr_le_cmp(&profiles[index].peer, BT_ADDR_LE_ANY); +bool zmk_ble_active_profile_is_open() { + return !bt_addr_le_cmp(&profiles[active_profile].peer, BT_ADDR_LE_ANY); } void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { - char setting_name[17]; + char setting_name[15]; char addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); @@ -112,23 +106,14 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { memcpy(&profiles[index].peer, addr, sizeof(bt_addr_le_t)); sprintf(setting_name, "ble/profiles/%d", index); LOG_DBG("Setting profile addr for %s to %s", setting_name, addr_str); -#if IS_ENABLED(CONFIG_SETTINGS) settings_save_one(setting_name, &profiles[index], sizeof(struct zmk_ble_profile)); -#endif k_work_submit(&raise_profile_changed_event_work); } -bool zmk_ble_active_profile_is_connected(void) { - return zmk_ble_profile_is_connected(active_profile); -} - -bool zmk_ble_profile_is_connected(uint8_t index) { - if (index >= ZMK_BLE_PROFILE_COUNT) { - return false; - } +bool zmk_ble_active_profile_is_connected() { struct bt_conn *conn; struct bt_conn_info info; - bt_addr_le_t *addr = &profiles[index].peer; + bt_addr_le_t *addr = zmk_ble_active_profile_addr(); if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { return false; } else if ((conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr)) == NULL) { @@ -174,7 +159,7 @@ bool zmk_ble_profile_is_connected(uint8_t index) { } \ advertising_status = ZMK_ADV_CONN; -int update_advertising(void) { +int update_advertising() { int err = 0; bt_addr_le_t *addr; struct bt_conn *conn; @@ -223,50 +208,21 @@ static void update_advertising_callback(struct k_work *work) { update_advertisin K_WORK_DEFINE(update_advertising_work, update_advertising_callback); -static void clear_profile_bond(uint8_t profile) { - if (bt_addr_le_cmp(&profiles[profile].peer, BT_ADDR_LE_ANY)) { - bt_unpair(BT_ID_DEFAULT, &profiles[profile].peer); - set_profile_address(profile, BT_ADDR_LE_ANY); +int zmk_ble_clear_bonds() { + LOG_DBG(""); + + if (bt_addr_le_cmp(&profiles[active_profile].peer, BT_ADDR_LE_ANY)) { + LOG_DBG("Unpairing!"); + bt_unpair(BT_ID_DEFAULT, &profiles[active_profile].peer); + set_profile_address(active_profile, BT_ADDR_LE_ANY); } -} -void zmk_ble_clear_bonds(void) { - LOG_DBG("zmk_ble_clear_bonds()"); - - clear_profile_bond(active_profile); update_advertising(); + + return 0; }; -void zmk_ble_clear_all_bonds(void) { - LOG_DBG("zmk_ble_clear_all_bonds()"); - - // Unpair all profiles - for (int i = 0; i < ZMK_BLE_PROFILE_COUNT; i++) { - clear_profile_bond(i); - } - - // Automatically switch to profile 0 - zmk_ble_prof_select(0); - update_advertising(); -}; - -int zmk_ble_active_profile_index(void) { return active_profile; } - -int zmk_ble_profile_index(const bt_addr_le_t *addr) { - for (int i = 0; i < ZMK_BLE_PROFILE_COUNT; i++) { - if (bt_addr_le_cmp(addr, &profiles[i].peer) == 0) { - return i; - } - } - return -ENODEV; -} - -bt_addr_le_t *zmk_ble_profile_address(uint8_t index) { - if (index >= ZMK_BLE_PROFILE_COUNT) { - return (bt_addr_le_t *)(BT_ADDR_LE_NONE); - } - return &profiles[index].peer; -} +int zmk_ble_active_profile_index() { return active_profile; } #if IS_ENABLED(CONFIG_SETTINGS) static void ble_save_profile_work(struct k_work *work) { @@ -276,7 +232,7 @@ static void ble_save_profile_work(struct k_work *work) { static struct k_work_delayable ble_save_work; #endif -static int ble_save_profile(void) { +static int ble_save_profile() { #if IS_ENABLED(CONFIG_SETTINGS) return k_work_reschedule(&ble_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); #else @@ -304,78 +260,22 @@ int zmk_ble_prof_select(uint8_t index) { return 0; }; -int zmk_ble_prof_next(void) { +int zmk_ble_prof_next() { LOG_DBG(""); return zmk_ble_prof_select((active_profile + 1) % ZMK_BLE_PROFILE_COUNT); }; -int zmk_ble_prof_prev(void) { +int zmk_ble_prof_prev() { LOG_DBG(""); return zmk_ble_prof_select((active_profile + ZMK_BLE_PROFILE_COUNT - 1) % ZMK_BLE_PROFILE_COUNT); }; -int zmk_ble_prof_disconnect(uint8_t index) { - if (index >= ZMK_BLE_PROFILE_COUNT) - return -ERANGE; +bt_addr_le_t *zmk_ble_active_profile_addr() { return &profiles[active_profile].peer; } - bt_addr_le_t *addr = &profiles[index].peer; - struct bt_conn *conn; - int result; +char *zmk_ble_active_profile_name() { return profiles[active_profile].name; } - if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { - return -ENODEV; - } else if ((conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr)) == NULL) { - return -ENODEV; - } - - result = bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); - LOG_DBG("Disconnected from profile %d: %d", index, result); - - bt_conn_unref(conn); - return result; -} - -bt_addr_le_t *zmk_ble_active_profile_addr(void) { return &profiles[active_profile].peer; } - -struct bt_conn *zmk_ble_active_profile_conn(void) { - struct bt_conn *conn; - bt_addr_le_t *addr = zmk_ble_active_profile_addr(); - - if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { - LOG_WRN("Not sending, no active address for current profile"); - return NULL; - } else if ((conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr)) == NULL) { - LOG_WRN("Not sending, not connected to active profile"); - return NULL; - } - - return conn; -} - -char *zmk_ble_active_profile_name(void) { return profiles[active_profile].name; } - -int zmk_ble_set_device_name(char *name) { - // Copy new name to advertising parameters - int err = bt_set_name(name); - LOG_DBG("New device name: %s", name); - if (err) { - LOG_ERR("Failed to set new device name (err %d)", err); - return err; - } - if (advertising_status == ZMK_ADV_CONN) { - // Stop current advertising so it can restart with new name - err = bt_le_adv_stop(); - advertising_status = ZMK_ADV_NONE; - if (err) { - LOG_ERR("Failed to stop advertising (err %d)", err); - return err; - } - } - return update_advertising(); -} - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) +#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { @@ -399,11 +299,10 @@ int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { LOG_DBG("Storing peripheral %s in slot %d", addr_str, i); bt_addr_le_copy(&peripheral_addrs[i], addr); -#if IS_ENABLED(CONFIG_SETTINGS) char setting_name[32]; sprintf(setting_name, "ble/peripheral_addresses/%d", i); settings_save_one(setting_name, addr, sizeof(bt_addr_le_t)); -#endif // IS_ENABLED(CONFIG_SETTINGS) + return i; } } @@ -464,7 +363,7 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c return err; } } -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) && IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) +#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) else if (settings_name_steq(name, "peripheral_addresses", &next) && next) { if (len != sizeof(bt_addr_le_t)) { return -EINVAL; @@ -486,11 +385,7 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c return 0; }; -static int zmk_ble_complete_startup(void); - -static struct settings_handler profiles_handler = { - .name = "ble", .h_set = ble_profiles_handle_set, .h_commit = zmk_ble_complete_startup}; - +struct settings_handler profiles_handler = {.name = "ble", .h_set = ble_profiles_handle_set}; #endif /* IS_ENABLED(CONFIG_SETTINGS) */ static bool is_conn_active_profile(const struct bt_conn *conn) { @@ -520,6 +415,10 @@ static void connected(struct bt_conn *conn, uint8_t err) { LOG_DBG("Connected %s", addr); + if (bt_conn_set_security(conn, BT_SECURITY_L2)) { + LOG_ERR("Failed to set security"); + } + update_advertising(); if (is_conn_active_profile(conn)) { @@ -622,19 +521,13 @@ static void auth_cancel(struct bt_conn *conn) { LOG_DBG("Pairing cancelled: %s", addr); } -static bool pairing_allowed_for_current_profile(struct bt_conn *conn) { - return zmk_ble_active_profile_is_open() || - (IS_ENABLED(CONFIG_BT_SMP_ALLOW_UNAUTH_OVERWRITE) && - bt_addr_le_cmp(zmk_ble_active_profile_addr(), bt_conn_get_dst(conn)) == 0); -} - static enum bt_security_err auth_pairing_accept(struct bt_conn *conn, const struct bt_conn_pairing_feat *const feat) { struct bt_conn_info info; bt_conn_get_info(conn, &info); LOG_DBG("role %d, open? %s", info.role, zmk_ble_active_profile_is_open() ? "yes" : "no"); - if (info.role == BT_CONN_ROLE_PERIPHERAL && !pairing_allowed_for_current_profile(conn)) { + if (info.role == BT_CONN_ROLE_PERIPHERAL && !zmk_ble_active_profile_is_open()) { LOG_WRN("Rejecting pairing request to taken profile %d", active_profile); return BT_SECURITY_ERR_PAIR_NOT_ALLOWED; } @@ -655,7 +548,7 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { return; } - if (!pairing_allowed_for_current_profile(conn)) { + if (!zmk_ble_active_profile_is_open()) { LOG_ERR("Pairing completed but current profile is not open: %s", addr); bt_unpair(BT_ID_DEFAULT, dst); return; @@ -689,7 +582,29 @@ static void zmk_ble_ready(int err) { update_advertising(); } -static int zmk_ble_complete_startup(void) { +static int zmk_ble_init(const struct device *_arg) { + int err = bt_enable(NULL); + + if (err) { + LOG_ERR("BLUETOOTH FAILED (%d)", err); + return err; + } + +#if IS_ENABLED(CONFIG_SETTINGS) + settings_subsys_init(); + + err = settings_register(&profiles_handler); + if (err) { + LOG_ERR("Failed to setup the profile settings handler (err %d)", err); + return err; + } + + k_work_init_delayable(&ble_save_work, ble_save_profile_work); + + settings_load_subtree("ble"); + settings_load_subtree("bt"); + +#endif #if IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) LOG_WRN("Clearing all existing BLE bond information from the keyboard"); @@ -700,7 +615,7 @@ static int zmk_ble_complete_startup(void) { char setting_name[15]; sprintf(setting_name, "ble/profiles/%d", i); - int err = settings_delete(setting_name); + err = settings_delete(setting_name); if (err) { LOG_ERR("Failed to delete setting: %d", err); } @@ -712,7 +627,7 @@ static int zmk_ble_complete_startup(void) { char setting_name[32]; sprintf(setting_name, "ble/peripheral_addresses/%d", i); - int err = settings_delete(setting_name); + err = settings_delete(setting_name); if (err) { LOG_ERR("Failed to delete setting: %d", err); } @@ -729,24 +644,6 @@ static int zmk_ble_complete_startup(void) { return 0; } -static int zmk_ble_init(void) { - int err = bt_enable(NULL); - - if (err < 0 && err != -EALREADY) { - LOG_ERR("BLUETOOTH FAILED (%d)", err); - return err; - } - -#if IS_ENABLED(CONFIG_SETTINGS) - settings_register(&profiles_handler); - k_work_init_delayable(&ble_save_work, ble_save_profile_work); -#else - zmk_ble_complete_startup(); -#endif - - return 0; -} - #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) static bool zmk_ble_numeric_usage_to_value(const zmk_key_t key, const zmk_key_t one, @@ -769,9 +666,9 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_BUBBLE; } - if (event->state) { - LOG_DBG("Key press, ignoring"); - return ZMK_EV_EVENT_HANDLED; + if (!event->state) { + LOG_DBG("Key released, ignoring"); + return ZMK_EV_EVENT_BUBBLE; } if (key == HID_USAGE_KEY_KEYBOARD_ESCAPE) { @@ -801,7 +698,7 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYPAD_1_AND_END, HID_USAGE_KEY_KEYPAD_0_AND_INSERT, &val))) { LOG_DBG("Key not a number, ignoring"); - return ZMK_EV_EVENT_HANDLED; + return ZMK_EV_EVENT_BUBBLE; } if (ring_buf_space_get(&passkey_entries) <= 0) { diff --git a/app/src/boot/CMakeLists.txt b/app/src/boot/CMakeLists.txt deleted file mode 100644 index 264c1aa7..00000000 --- a/app/src/boot/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ - -target_sources_ifdef(CONFIG_ZMK_BOOTMODE_TO_MAGIC_VALUE_MAPPER app PRIVATE bootmode_to_magic_mapper.c) -target_sources_ifdef(CONFIG_ZMK_DBL_TAP_BOOTLOADER app PRIVATE dbl_tap_bootloader.c) -target_sources_ifdef(CONFIG_ZMK_BOOT_STM32_ENFORCE_NBOOT_SEL app PRIVATE stm32_enforce_nboot_sel.c) diff --git a/app/src/boot/Kconfig b/app/src/boot/Kconfig deleted file mode 100644 index 8cd550c2..00000000 --- a/app/src/boot/Kconfig +++ /dev/null @@ -1,51 +0,0 @@ - -config ZMK_DBL_TAP_BOOTLOADER - bool "Double Tap To Enter Bootloader" - depends on RETENTION_BOOT_MODE - -if ZMK_DBL_TAP_BOOTLOADER - -config ZMK_DBL_TAP_BOOTLOADER_TIMEOUT_MS - int "Double Tap Timeout (ms)" - -config ZMK_DBL_TAP_BOOTLOADER_INIT_PRIORITY - int "Double Tap Init Priority" - -endif - -config ZMK_BOOTMODE_TO_MAGIC_VALUE_MAPPER - bool "Magic Value Mapper" - default y - depends on DT_HAS_ZMK_BOOTMODE_TO_MAGIC_MAPPER_ENABLED - -if ZMK_BOOTMODE_TO_MAGIC_VALUE_MAPPER - -choice ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE - prompt "Magic Value Bootloader Type" - -config ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_UNKNOWN - bool "Unknown" - -config ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_TINYUF2 - bool "tinyuf2" - -config ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_BOSSA - bool "Adafruit BOSSA" - -config ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 - bool "Adafruit nRF52" - -endchoice - -config ZMK_BOOTMODE_BOOTLOADER_MAGIC_VALUE - hex - -endif - -config ZMK_BOOT_STM32_ENFORCE_NBOOT_SEL - bool - default y - depends on FLASH && (SOC_STM32C071XX || SOC_STM32G0B1XX) - select FLASH_EX_OP_ENABLED - select FLASH_STM32_OPTION_BYTES - diff --git a/app/src/boot/Kconfig.defaults b/app/src/boot/Kconfig.defaults deleted file mode 100644 index 9fb22575..00000000 --- a/app/src/boot/Kconfig.defaults +++ /dev/null @@ -1,28 +0,0 @@ - -config ZMK_DBL_TAP_BOOTLOADER - default y if STM32_BOOTLOADER || RPI_PICO_ROM_BOOTLOADER - depends on RETENTION_BOOT_MODE - -if ZMK_DBL_TAP_BOOTLOADER - -config ZMK_DBL_TAP_BOOTLOADER_TIMEOUT_MS - default 500 - -config ZMK_DBL_TAP_BOOTLOADER_INIT_PRIORITY - default 20 - -endif - -if ZMK_BOOTMODE_TO_MAGIC_VALUE_MAPPER - -choice ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE - default ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 if SOC_NRF52833 || SOC_NRF52840 - -endchoice - -config ZMK_BOOTMODE_BOOTLOADER_MAGIC_VALUE - default 0xf01669ef if ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_TINYUF2 || ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_BOSSA || BOOTLOADER_BOSSA_ADAFRUIT_UF2 - default 0x57 if ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 - -endif - diff --git a/app/src/boot/bootmode_to_magic_mapper.c b/app/src/boot/bootmode_to_magic_mapper.c deleted file mode 100644 index f2b672bf..00000000 --- a/app/src/boot/bootmode_to_magic_mapper.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_bootmode_to_magic_mapper - -#include -#include -#include -#include - -static const struct device *magic_dev = DEVICE_DT_GET(DT_CHOSEN(zmk_magic_boot_mode)); -#define MAGIC_DEST_ONE_BYTE (DT_REG_SIZE(DT_CHOSEN(zmk_magic_boot_mode)) == 1) - -#if MAGIC_DEST_ONE_BYTE -typedef uint8_t magic_val_t; -#else -typedef uint32_t magic_val_t; -#endif - -static const magic_val_t bootloader_magic_value = CONFIG_ZMK_BOOTMODE_BOOTLOADER_MAGIC_VALUE; - -static ssize_t btmm_ram_size(const struct device *dev) { return (ssize_t)1; } - -static int btmm_ram_read(const struct device *dev, off_t offset, uint8_t *buffer, size_t size) { - if (size != 1) { - return -ENOTSUP; - } - - magic_val_t val; - int ret = retention_read(magic_dev, 0, (uint8_t *)&val, sizeof(val)); - if (ret < 0) { - return ret; - } - - *buffer = (val == bootloader_magic_value) ? BOOT_MODE_TYPE_BOOTLOADER : BOOT_MODE_TYPE_NORMAL; - - return 0; -} - -static int btmm_ram_write(const struct device *dev, off_t offset, const uint8_t *buffer, - size_t size) { - if (size != 1) { - return -ENOTSUP; - } - - magic_val_t val = (*buffer == BOOT_MODE_TYPE_BOOTLOADER) ? bootloader_magic_value : 0; - - return retention_write(magic_dev, 0, (uint8_t *)&val, sizeof(val)); -} - -static int btmm_ram_clear(const struct device *dev) { return retention_clear(magic_dev); } - -static const struct retained_mem_driver_api btmm_api = { - .size = btmm_ram_size, - .read = btmm_ram_read, - .write = btmm_ram_write, - .clear = btmm_ram_clear, -}; - -DEVICE_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, 0, &btmm_api); diff --git a/app/src/boot/dbl_tap_bootloader.c b/app/src/boot/dbl_tap_bootloader.c deleted file mode 100644 index 254dc69d..00000000 --- a/app/src/boot/dbl_tap_bootloader.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include -#include - -static int dbl_tap_boot_mode_init(void) { - bootmode_set(BOOT_MODE_TYPE_BOOTLOADER); - - k_busy_wait(CONFIG_ZMK_DBL_TAP_BOOTLOADER_TIMEOUT_MS * 1000); - - bootmode_clear(); - - return 0; -} - -SYS_INIT(dbl_tap_boot_mode_init, POST_KERNEL, CONFIG_ZMK_DBL_TAP_BOOTLOADER_INIT_PRIORITY); diff --git a/app/src/boot/stm32_enforce_nboot_sel.c b/app/src/boot/stm32_enforce_nboot_sel.c deleted file mode 100644 index f7e79c12..00000000 --- a/app/src/boot/stm32_enforce_nboot_sel.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -const struct device *flash_dev = FIXED_PARTITION_DEVICE(storage_partition); - -static int stm32_enforce_nboot_sel_init(void) { - uint32_t opts = 0; - int ret = 0; - - if (!device_is_ready(flash_dev)) { - LOG_ERR("flash dev not ready"); - return 0; - } - - ret = flash_ex_op(flash_dev, FLASH_STM32_EX_OP_OPTB_READ, (uintptr_t)NULL, &opts); - - if (ret < 0) { - LOG_ERR("Failed to read option bytes with flash ext op (%d)\n", ret); - return ret; - } - - LOG_DBG("Current option bytes: %02X\n", opts); - - if (opts & FLASH_OPTR_nBOOT_SEL) { - WRITE_BIT(opts, FLASH_OPTR_nBOOT_SEL_Pos, false); - - LOG_DBG("Writing new option bytes %02X\n", opts); - ret = flash_ex_op(flash_dev, FLASH_STM32_EX_OP_OPTB_WRITE, opts, NULL); - if (ret < 0) { - LOG_ERR("Failed to write new option bytes (%d)", ret); - return ret; - } - } - - return 0; -} - -SYS_INIT(stm32_enforce_nboot_sel_init, APPLICATION, 10); diff --git a/app/src/combo.c b/app/src/combo.c index 7d869fa4..0d5c2a6e 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include @@ -27,99 +26,50 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#if CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO > 0 - -#warning \ - "CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO is deprecated, and is auto-calculated from the devicetree now." - -#endif - -#if CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY > 0 - -#warning "CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY is deprecated, and is auto-calculated." - -#endif - -#define COMBOS_KEYS_BYTE_ARRAY(node_id) \ - uint8_t _CONCAT(combo_prop_, node_id)[DT_PROP_LEN(node_id, key_positions)]; - -#define MAX_COMBO_KEYS sizeof(union {DT_INST_FOREACH_CHILD(0, COMBOS_KEYS_BYTE_ARRAY)}) - struct combo_cfg { - int32_t key_positions[MAX_COMBO_KEYS]; - int16_t key_position_len; - int16_t require_prior_idle_ms; - int32_t timeout_ms; - uint32_t layer_mask; + int32_t key_positions[CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO]; + int32_t key_position_len; struct zmk_behavior_binding behavior; + int32_t timeout_ms; + int32_t require_prior_idle_ms; // if slow release is set, the combo releases when the last key is released. // otherwise, the combo releases when the first key is released. bool slow_release; + // the virtual key position is a key position outside the range used by the keyboard. + // it is necessary so hold-taps can uniquely identify a behavior. + int32_t virtual_key_position; + int32_t layers_len; + int8_t layers[]; }; struct active_combo { - uint16_t combo_idx; + struct combo_cfg *combo; // key_positions_pressed is filled with key_positions when the combo is pressed. // The keys are removed from this array when they are released. // Once this array is empty, the behavior is released. - uint16_t key_positions_pressed_count; - struct zmk_position_state_changed_event key_positions_pressed[MAX_COMBO_KEYS]; + const zmk_event_t *key_positions_pressed[CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO]; }; -#define PROP_BIT_AT_IDX(n, prop, idx) BIT(DT_PROP_BY_IDX(n, prop, idx)) +struct combo_candidate { + struct combo_cfg *combo; + // the time after which this behavior should be removed from candidates. + // by keeping track of when the candidate should be cleared there is no + // possibility of accidental releases. + int64_t timeout_at; +}; -#define NODE_PROP_BITMASK(n, prop) \ - COND_CODE_1(DT_NODE_HAS_PROP(n, prop), \ - (DT_FOREACH_PROP_ELEM_SEP(n, prop, PROP_BIT_AT_IDX, (|))), (0)) - -#define GET_KEY_POSITION_MASK_PORTION(idx, n) ((NODE_PROP_BITMASK(n, key_positions) >> idx) & 0xFF) - -#define COMBO_INST(n, positions) \ - COND_CODE_1(IS_EQ(DT_PROP_LEN(n, key_positions), positions), \ - ( \ - { \ - .timeout_ms = DT_PROP(n, timeout_ms), \ - .require_prior_idle_ms = DT_PROP(n, require_prior_idle_ms), \ - .key_positions = DT_PROP(n, key_positions), \ - .key_position_len = DT_PROP_LEN(n, key_positions), \ - .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ - .slow_release = DT_PROP(n, slow_release), \ - .layer_mask = NODE_PROP_BITMASK(n, layers), \ - }, ), \ - ()) - -#define COMBO_CONFIGS_WITH_MATCHING_POSITIONS_LEN(positions, _ignore) \ - DT_INST_FOREACH_CHILD_VARGS(0, COMBO_INST, positions) - -// We do some magic here to generate the `combos` array by "key position length", looping -// by key position length and on each iteration, only include entries where the `key-positions` -// length matches. -// Doing so allows our bitmasks to be "shorted key positions list first" when searching for matches. -// `20` is chosen as a reasonable limit, since the theoretical maximum number of keys you might -// reasonably press simultaneously with 10 fingers is 20 keys, two keys per finger. -static const struct combo_cfg combos[] = { - LISTIFY(20, COMBO_CONFIGS_WITH_MATCHING_POSITIONS_LEN, (), 0)}; - -#define COMBO_ONE(n) +1 - -#define COMBO_CHILDREN_COUNT (0 DT_INST_FOREACH_CHILD(0, COMBO_ONE)) - -// We need at least 4 bytes to avoid alignment issues -#define BYTES_FOR_COMBOS_MASK DIV_ROUND_UP(COMBO_CHILDREN_COUNT, 32) - -uint8_t pressed_keys_count = 0; // set of keys pressed -struct zmk_position_state_changed_event pressed_keys[MAX_COMBO_KEYS] = {}; +const zmk_event_t *pressed_keys[CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO] = {NULL}; // the set of candidate combos based on the currently pressed_keys -uint32_t candidates[BYTES_FOR_COMBOS_MASK]; +struct combo_candidate candidates[CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY]; // the last candidate that was completely pressed -int16_t fully_pressed_combo = INT16_MAX; +struct combo_cfg *fully_pressed_combo = NULL; // a lookup dict that maps a key position to all combos on that position -uint32_t combo_lookup[ZMK_KEYMAP_LEN][BYTES_FOR_COMBOS_MASK] = {}; +struct combo_cfg *combo_lookup[ZMK_KEYMAP_LEN][CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY] = {NULL}; // combos that have been activated and still have (some) keys pressed // this array is always contiguous from 0. -struct active_combo active_combos[CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS] = {}; -uint8_t active_combo_count = 0; +struct active_combo active_combos[CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS] = {NULL}; +int active_combo_count = 0; struct k_work_delayable timeout_task; int64_t timeout_task_timeout_at; @@ -137,108 +87,160 @@ static void store_last_tapped(int64_t timestamp) { // Store the combo key pointer in the combos array, one pointer for each key position // The combos are sorted shortest-first, then by virtual-key-position. -static int initialize_combo(size_t index) { - const struct combo_cfg *new_combo = &combos[index]; +static int initialize_combo(struct combo_cfg *new_combo) { + for (int i = 0; i < new_combo->key_position_len; i++) { + int32_t position = new_combo->key_positions[i]; + if (position >= ZMK_KEYMAP_LEN) { + LOG_ERR("Unable to initialize combo, key position %d does not exist", position); + return -EINVAL; + } - for (size_t kp = 0; kp < new_combo->key_position_len; kp++) { - sys_bitfield_set_bit((mem_addr_t)&combo_lookup[new_combo->key_positions[kp]], index); + struct combo_cfg *insert_combo = new_combo; + bool set = false; + for (int j = 0; j < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; j++) { + struct combo_cfg *combo_at_j = combo_lookup[position][j]; + if (combo_at_j == NULL) { + combo_lookup[position][j] = insert_combo; + set = true; + break; + } + if (combo_at_j->key_position_len < insert_combo->key_position_len || + (combo_at_j->key_position_len == insert_combo->key_position_len && + combo_at_j->virtual_key_position < insert_combo->virtual_key_position)) { + continue; + } + // put insert_combo in this spot, move all other combos up. + combo_lookup[position][j] = insert_combo; + insert_combo = combo_at_j; + } + if (!set) { + LOG_ERR("Too many combos for key position %d, CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY %d.", + position, CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY); + return -ENOMEM; + } } - return 0; } -static bool combo_active_on_layer(const struct combo_cfg *combo, uint8_t layer) { - if (!combo->layer_mask) { +static bool combo_active_on_layer(struct combo_cfg *combo, uint8_t layer) { + if (combo->layers[0] == -1) { + // -1 in the first layer position is global layer scope return true; } - - return combo->layer_mask & BIT(layer); + for (int j = 0; j < combo->layers_len; j++) { + if (combo->layers[j] == layer) { + return true; + } + } + return false; } -static bool is_quick_tap(const struct combo_cfg *combo, int64_t timestamp) { +static bool is_quick_tap(struct combo_cfg *combo, int64_t timestamp) { return (last_tapped_timestamp + combo->require_prior_idle_ms) > timestamp; } static int setup_candidates_for_first_keypress(int32_t position, int64_t timestamp) { int number_of_combo_candidates = 0; uint8_t highest_active_layer = zmk_keymap_highest_layer_active(); - - for (size_t i = 0; i < ARRAY_SIZE(combos); i++) { - if (sys_bitfield_test_bit((mem_addr_t)&combo_lookup[position], i)) { - const struct combo_cfg *combo = &combos[i]; - if (combo_active_on_layer(combo, highest_active_layer) && - !is_quick_tap(combo, timestamp)) { - sys_bitfield_set_bit((mem_addr_t)&candidates, i); - number_of_combo_candidates++; - } - // LOG_DBG("combo timeout %d %d %d", position, i, candidates[i].timeout_at); + for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; i++) { + struct combo_cfg *combo = combo_lookup[position][i]; + if (combo == NULL) { + return number_of_combo_candidates; } + if (combo_active_on_layer(combo, highest_active_layer) && !is_quick_tap(combo, timestamp)) { + candidates[number_of_combo_candidates].combo = combo; + candidates[number_of_combo_candidates].timeout_at = timestamp + combo->timeout_ms; + number_of_combo_candidates++; + } + // LOG_DBG("combo timeout %d %d %d", position, i, candidates[i].timeout_at); } - return number_of_combo_candidates; } -static inline uint8_t zero_one_or_more_bits(uint32_t field) { - if (field == 0) { - return 0; - } - if ((field & (field - 1)) == 0) { - return 1; - } - return 2; -} - static int filter_candidates(int32_t position) { - int matches = 0; - for (int i = 0; i < BYTES_FOR_COMBOS_MASK; i++) { - candidates[i] &= combo_lookup[position][i]; - if (matches < 2) { - matches += zero_one_or_more_bits(candidates[i]); + // this code iterates over candidates and the lookup together to filter in O(n) + // assuming they are both sorted on key_position_len, virtal_key_position + int matches = 0, lookup_idx = 0, candidate_idx = 0; + while (lookup_idx < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY && + candidate_idx < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY) { + struct combo_cfg *candidate = candidates[candidate_idx].combo; + struct combo_cfg *lookup = combo_lookup[position][lookup_idx]; + if (candidate == NULL || lookup == NULL) { + break; + } + if (candidate->virtual_key_position == lookup->virtual_key_position) { + candidates[matches] = candidates[candidate_idx]; + matches++; + candidate_idx++; + lookup_idx++; + } else if (candidate->key_position_len > lookup->key_position_len) { + lookup_idx++; + } else if (candidate->key_position_len < lookup->key_position_len) { + candidate_idx++; + } else if (candidate->virtual_key_position > lookup->virtual_key_position) { + lookup_idx++; + } else if (candidate->virtual_key_position < lookup->virtual_key_position) { + candidate_idx++; } } - - LOG_DBG("combo matches after filter %d", matches); + // clear unmatched candidates + for (int i = matches; i < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; i++) { + candidates[i].combo = NULL; + } + // LOG_DBG("combo matches after filter %d", matches); return matches; } static int64_t first_candidate_timeout() { - if (pressed_keys_count == 0) { - return LONG_MAX; - } - int64_t first_timeout = LONG_MAX; - for (int i = 0; i < ARRAY_SIZE(combos); i++) { - if (sys_bitfield_test_bit((mem_addr_t)&candidates, i)) { - first_timeout = MIN(first_timeout, combos[i].timeout_ms); + for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; i++) { + if (candidates[i].combo == NULL) { + break; + } + if (candidates[i].timeout_at < first_timeout) { + first_timeout = candidates[i].timeout_at; } } - - return pressed_keys[0].data.timestamp + first_timeout; + return first_timeout; } -static inline bool candidate_is_completely_pressed(const struct combo_cfg *candidate) { +static inline bool candidate_is_completely_pressed(struct combo_cfg *candidate) { // this code assumes set(pressed_keys) <= set(candidate->key_positions) // this invariant is enforced by filter_candidates // since events may have been reraised after clearing one or more slots at // the start of pressed_keys (see: release_pressed_keys), we have to check // that each key needed to trigger the combo was pressed, not just the last. - return candidate->key_position_len == pressed_keys_count; + for (int i = 0; i < candidate->key_position_len; i++) { + if (pressed_keys[i] == NULL) { + return false; + } + } + return true; } static int cleanup(); static int filter_timed_out_candidates(int64_t timestamp) { - __ASSERT(pressed_keys_count > 0, "Searching for a candidate timeout with no keys pressed"); - int remaining_candidates = 0; - for (int i = 0; i < ARRAY_SIZE(combos); i++) { - if (sys_bitfield_test_bit((mem_addr_t)&candidates, i)) { - - if (pressed_keys[0].data.timestamp + combos[i].timeout_ms > timestamp) { - remaining_candidates++; - } else { - sys_bitfield_clear_bit((mem_addr_t)&candidates, i); + for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; i++) { + struct combo_candidate *candidate = &candidates[i]; + if (candidate->combo == NULL) { + break; + } + if (candidate->timeout_at > timestamp) { + bool need_to_bubble_up = remaining_candidates != i; + if (need_to_bubble_up) { + // bubble up => reorder candidates so they're contiguous + candidates[remaining_candidates].combo = candidate->combo; + candidates[remaining_candidates].timeout_at = candidate->timeout_at; + // clear the previous location + candidates[i].combo = NULL; + candidates[i].timeout_at = 0; } + + remaining_candidates++; + } else { + candidate->combo = NULL; } } @@ -249,83 +251,90 @@ static int filter_timed_out_candidates(int64_t timestamp) { return remaining_candidates; } -static int capture_pressed_key(const struct zmk_position_state_changed *ev) { - if (pressed_keys_count == MAX_COMBO_KEYS) { - return ZMK_EV_EVENT_BUBBLE; +static int clear_candidates() { + for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; i++) { + if (candidates[i].combo == NULL) { + return i; + } + candidates[i].combo = NULL; } + return CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; +} - pressed_keys[pressed_keys_count++] = copy_raised_zmk_position_state_changed(ev); - return ZMK_EV_EVENT_CAPTURED; +static int capture_pressed_key(const zmk_event_t *ev) { + for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO; i++) { + if (pressed_keys[i] != NULL) { + continue; + } + pressed_keys[i] = ev; + return ZMK_EV_EVENT_CAPTURED; + } + return ZMK_EV_EVENT_BUBBLE; } const struct zmk_listener zmk_listener_combo; static int release_pressed_keys() { - uint8_t count = pressed_keys_count; - pressed_keys_count = 0; - for (int i = 0; i < count; i++) { - struct zmk_position_state_changed_event *ev = &pressed_keys[i]; + for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO; i++) { + const zmk_event_t *captured_event = pressed_keys[i]; + if (pressed_keys[i] == NULL) { + return i; + } + pressed_keys[i] = NULL; if (i == 0) { - LOG_DBG("combo: releasing position event %d", ev->data.position); - ZMK_EVENT_RELEASE(*ev); + LOG_DBG("combo: releasing position event %d", + as_zmk_position_state_changed(captured_event)->position); + ZMK_EVENT_RELEASE(captured_event) } else { // reprocess events (see tests/combo/fully-overlapping-combos-3 for why this is needed) - LOG_DBG("combo: reraising position event %d", ev->data.position); - ZMK_EVENT_RAISE(*ev); + LOG_DBG("combo: reraising position event %d", + as_zmk_position_state_changed(captured_event)->position); + ZMK_EVENT_RAISE(captured_event); } } - - return count; + return CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO; } -static inline int press_combo_behavior(int combo_idx, const struct combo_cfg *combo, - int32_t timestamp) { +static inline int press_combo_behavior(struct combo_cfg *combo, int32_t timestamp) { struct zmk_behavior_binding_event event = { - .position = ZMK_VIRTUAL_KEY_POSITION_COMBO(combo_idx), + .position = combo->virtual_key_position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, -#endif }; last_combo_timestamp = timestamp; - return zmk_behavior_invoke_binding(&combo->behavior, event, true); + return behavior_keymap_binding_pressed(&combo->behavior, event); } -static inline int release_combo_behavior(int combo_idx, const struct combo_cfg *combo, - int32_t timestamp) { +static inline int release_combo_behavior(struct combo_cfg *combo, int32_t timestamp) { struct zmk_behavior_binding_event event = { - .position = ZMK_VIRTUAL_KEY_POSITION_COMBO(combo_idx), + .position = combo->virtual_key_position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, -#endif }; - return zmk_behavior_invoke_binding(&combo->behavior, event, false); + return behavior_keymap_binding_released(&combo->behavior, event); } static void move_pressed_keys_to_active_combo(struct active_combo *active_combo) { - - int combo_length = MIN(pressed_keys_count, combos[active_combo->combo_idx].key_position_len); + int combo_length = active_combo->combo->key_position_len; for (int i = 0; i < combo_length; i++) { active_combo->key_positions_pressed[i] = pressed_keys[i]; + pressed_keys[i] = NULL; } - active_combo->key_positions_pressed_count = combo_length; - // move any other pressed keys up - for (int i = 0; i + combo_length < pressed_keys_count; i++) { + for (int i = 0; i + combo_length < CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO; i++) { + if (pressed_keys[i + combo_length] == NULL) { + return; + } pressed_keys[i] = pressed_keys[i + combo_length]; + pressed_keys[i + combo_length] = NULL; } - - pressed_keys_count -= combo_length; } -static struct active_combo *store_active_combo(int32_t combo_idx) { +static struct active_combo *store_active_combo(struct combo_cfg *combo) { for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS; i++) { - if (active_combos[i].combo_idx == UINT16_MAX) { - active_combos[i].combo_idx = combo_idx; + if (active_combos[i].combo == NULL) { + active_combos[i].combo = combo; active_combo_count++; return &active_combos[i]; } @@ -336,16 +345,16 @@ static struct active_combo *store_active_combo(int32_t combo_idx) { return NULL; } -static void activate_combo(int combo_idx) { - struct active_combo *active_combo = store_active_combo(combo_idx); +static void activate_combo(struct combo_cfg *combo) { + struct active_combo *active_combo = store_active_combo(combo); if (active_combo == NULL) { // unable to store combo release_pressed_keys(); return; } move_pressed_keys_to_active_combo(active_combo); - press_combo_behavior(combo_idx, &combos[combo_idx], - active_combo->key_positions_pressed[0].data.timestamp); + press_combo_behavior( + combo, as_zmk_position_state_changed(active_combo->key_positions_pressed[0])->timestamp); } static void deactivate_combo(int active_combo_index) { @@ -354,8 +363,8 @@ static void deactivate_combo(int active_combo_index) { memcpy(&active_combos[active_combo_index], &active_combos[active_combo_count], sizeof(struct active_combo)); } + active_combos[active_combo_count].combo = NULL; active_combos[active_combo_count] = (struct active_combo){0}; - active_combos[active_combo_count].combo_idx = UINT16_MAX; } /* returns true if a key was released. */ @@ -364,25 +373,25 @@ static bool release_combo_key(int32_t position, int64_t timestamp) { struct active_combo *active_combo = &active_combos[combo_idx]; bool key_released = false; - bool all_keys_pressed = active_combo->key_positions_pressed_count == - combos[active_combo->combo_idx].key_position_len; + bool all_keys_pressed = true; bool all_keys_released = true; - for (int i = 0; i < active_combo->key_positions_pressed_count; i++) { - if (key_released) { - active_combo->key_positions_pressed[i - 1] = active_combo->key_positions_pressed[i]; + for (int i = 0; i < active_combo->combo->key_position_len; i++) { + if (active_combo->key_positions_pressed[i] == NULL) { + all_keys_pressed = false; + } else if (as_zmk_position_state_changed(active_combo->key_positions_pressed[i]) + ->position != position) { all_keys_released = false; - } else if (active_combo->key_positions_pressed[i].data.position != position) { - all_keys_released = false; - } else { // position matches + } else { // not null and position matches + ZMK_EVENT_FREE(active_combo->key_positions_pressed[i]); + active_combo->key_positions_pressed[i] = NULL; key_released = true; } } if (key_released) { - active_combo->key_positions_pressed_count--; - const struct combo_cfg *c = &combos[active_combo->combo_idx]; - if ((c->slow_release && all_keys_released) || (!c->slow_release && all_keys_pressed)) { - release_combo_behavior(active_combo->combo_idx, c, timestamp); + if ((active_combo->combo->slow_release && all_keys_released) || + (!active_combo->combo->slow_release && all_keys_pressed)) { + release_combo_behavior(active_combo->combo, timestamp); } if (all_keys_released) { deactivate_combo(combo_idx); @@ -395,10 +404,10 @@ static bool release_combo_key(int32_t position, int64_t timestamp) { static int cleanup() { k_work_cancel_delayable(&timeout_task); - memset(candidates, 0, BYTES_FOR_COMBOS_MASK * sizeof(uint32_t)); - if (fully_pressed_combo != INT16_MAX) { + clear_candidates(); + if (fully_pressed_combo != NULL) { activate_combo(fully_pressed_combo); - fully_pressed_combo = INT16_MAX; + fully_pressed_combo = NULL; } return release_pressed_keys(); } @@ -420,7 +429,7 @@ static void update_timeout_task() { static int position_state_down(const zmk_event_t *ev, struct zmk_position_state_changed *data) { int num_candidates; - if (!pressed_keys_count) { + if (candidates[0].combo == NULL) { num_candidates = setup_candidates_for_first_keypress(data->position, data->timestamp); if (num_candidates == 0) { return ZMK_EV_EVENT_BUBBLE; @@ -429,31 +438,27 @@ static int position_state_down(const zmk_event_t *ev, struct zmk_position_state_ filter_timed_out_candidates(data->timestamp); num_candidates = filter_candidates(data->position); } - - LOG_DBG("combo: capturing position event %d", data->position); - int ret = capture_pressed_key(data); update_timeout_task(); - if (num_candidates) { - for (int i = 0; i < ARRAY_SIZE(combos); i++) { - if (sys_bitfield_test_bit((mem_addr_t)&candidates, i)) { - const struct combo_cfg *candidate_combo = &combos[i]; - if (candidate_is_completely_pressed(candidate_combo)) { - fully_pressed_combo = i; - if (num_candidates == 1) { - cleanup(); - } - } - - return ret; - } - } - } else { + struct combo_cfg *candidate_combo = candidates[0].combo; + LOG_DBG("combo: capturing position event %d", data->position); + int ret = capture_pressed_key(ev); + switch (num_candidates) { + case 0: cleanup(); return ret; + case 1: + if (candidate_is_completely_pressed(candidate_combo)) { + fully_pressed_combo = candidate_combo; + cleanup(); + } + return ret; + default: + if (candidate_is_completely_pressed(candidate_combo)) { + fully_pressed_combo = candidate_combo; + } + return ret; } - - return -EINVAL; } static int position_state_up(const zmk_event_t *ev, struct zmk_position_state_changed *data) { @@ -464,9 +469,7 @@ static int position_state_up(const zmk_event_t *ev, struct zmk_position_state_ch if (released_keys > 1) { // The second and further key down events are re-raised. To preserve // correct order for e.g. hold-taps, reraise the key up event too. - struct zmk_position_state_changed_event dupe_ev = - copy_raised_zmk_position_state_changed(data); - ZMK_EVENT_RAISE(dupe_ev); + ZMK_EVENT_RAISE(ev); return ZMK_EV_EVENT_CAPTURED; } return ZMK_EV_EVENT_BUBBLE; @@ -478,11 +481,8 @@ static void combo_timeout_handler(struct k_work *item) { return; } if (filter_timed_out_candidates(timeout_task_timeout_at) == 0) { - LOG_DBG("CLEANUP!"); cleanup(); } - - LOG_DBG("ABOUT TO UPDATE IN TIMEOUT"); update_timeout_task(); } @@ -520,16 +520,26 @@ ZMK_LISTENER(combo, behavior_combo_listener); ZMK_SUBSCRIPTION(combo, zmk_position_state_changed); ZMK_SUBSCRIPTION(combo, zmk_keycode_state_changed); -static int combo_init(void) { - for (size_t i = 0; i < CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS; i++) { - active_combos[i].combo_idx = UINT16_MAX; - } +#define COMBO_INST(n) \ + static struct combo_cfg combo_config_##n = { \ + .timeout_ms = DT_PROP(n, timeout_ms), \ + .require_prior_idle_ms = DT_PROP(n, require_prior_idle_ms), \ + .key_positions = DT_PROP(n, key_positions), \ + .key_position_len = DT_PROP_LEN(n, key_positions), \ + .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ + .virtual_key_position = ZMK_VIRTUAL_KEY_POSITION_COMBO(__COUNTER__), \ + .slow_release = DT_PROP(n, slow_release), \ + .layers = DT_PROP(n, layers), \ + .layers_len = DT_PROP_LEN(n, layers), \ + }; +#define INITIALIZE_COMBO(n) initialize_combo(&combo_config_##n); + +DT_INST_FOREACH_CHILD(0, COMBO_INST) + +static int combo_init() { k_work_init_delayable(&timeout_task, combo_timeout_handler); - LOG_WRN("Have %d combos!", ARRAY_SIZE(combos)); - for (int i = 0; i < ARRAY_SIZE(combos); i++) { - initialize_combo(i); - } + DT_INST_FOREACH_CHILD(0, INITIALIZE_COMBO); return 0; } diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index a65563ab..9ba02a5c 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -49,31 +49,28 @@ static const struct conditional_layer_cfg CONDITIONAL_LAYER_CFGS[] = { static const int32_t NUM_CONDITIONAL_LAYER_CFGS = sizeof(CONDITIONAL_LAYER_CFGS) / sizeof(*CONDITIONAL_LAYER_CFGS); -// Ensures all layer updates are processed if one conditional layer activates another. -static bool conditional_layer_updates_needed; -// Tracks which layers have been locked by conditional layer activations. -static uint32_t layer_locked_by_conditional = 0; - -static void conditional_layer_activate(int8_t layer, bool locking) { +static void conditional_layer_activate(int8_t layer) { // This may trigger another event that could, in turn, activate additional then-layers. However, // the process will eventually terminate (at worst, when every layer is active). - if (!zmk_keymap_layer_active(layer) || (locking && !zmk_keymap_layer_locked(layer))) { + if (!zmk_keymap_layer_active(layer)) { LOG_DBG("layer %d", layer); - zmk_keymap_layer_activate(layer, locking); + zmk_keymap_layer_activate(layer); } } -static void conditional_layer_deactivate(int8_t layer, bool locking) { +static void conditional_layer_deactivate(int8_t layer) { // This may deactivate a then-layer that's already active via another mechanism (e.g., a // momentary layer behavior). However, the same problem arises when multiple keys with the same // &mo binding are held and then one is released, so it's probably not an issue in practice. - if (zmk_keymap_layer_active(layer) && (!zmk_keymap_layer_locked(layer) || locking)) { + if (zmk_keymap_layer_active(layer)) { LOG_DBG("layer %d", layer); - zmk_keymap_layer_deactivate(layer, locking); + zmk_keymap_layer_deactivate(layer); } } static int layer_state_changed_listener(const zmk_event_t *ev) { + static bool conditional_layer_updates_needed; + conditional_layer_updates_needed = true; // Semaphore ensures we don't re-enter the loop in the middle of doing update, and @@ -87,6 +84,7 @@ static int layer_state_changed_listener(const zmk_event_t *ev) { int8_t max_then_layer = -1; uint32_t then_layers = 0; uint32_t then_layer_state = 0; + conditional_layer_updates_needed = false; // On layer state changes, examines each conditional layer config to determine if then-layer @@ -94,29 +92,23 @@ static int layer_state_changed_listener(const zmk_event_t *ev) { for (int i = 0; i < NUM_CONDITIONAL_LAYER_CFGS; i++) { const struct conditional_layer_cfg *cfg = CONDITIONAL_LAYER_CFGS + i; zmk_keymap_layers_state_t mask = cfg->if_layers_state_mask; - WRITE_BIT(then_layers, cfg->then_layer, true); + then_layers |= BIT(cfg->then_layer); max_then_layer = MAX(max_then_layer, cfg->then_layer); // Activate then-layer if and only if all if-layers are already active. Note that we // reevaluate the current layer state for each config since activation of one layer can // also trigger activation of another. if ((zmk_keymap_layer_state() & mask) == mask) { - WRITE_BIT(then_layer_state, cfg->then_layer, true); - } - // Same as above, but for the lock status - if ((zmk_keymap_layer_locks() & mask) == mask) { - WRITE_BIT(layer_locked_by_conditional, cfg->then_layer, true); + then_layer_state |= BIT(cfg->then_layer); } } for (uint8_t layer = 0; layer <= max_then_layer; layer++) { if ((BIT(layer) & then_layers) != 0U) { - bool locking = (BIT(layer) & layer_locked_by_conditional) != 0U; if ((BIT(layer) & then_layer_state) != 0U) { - conditional_layer_activate(layer, locking); + conditional_layer_activate(layer); } else { - conditional_layer_deactivate(layer, locking); - WRITE_BIT(layer_locked_by_conditional, layer, false); + conditional_layer_deactivate(layer); } } } diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index a6d1f593..a2029481 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -3,9 +3,10 @@ menuconfig ZMK_DISPLAY bool "Enable ZMK Display" + default n select DISPLAY select LVGL - imply LV_CONF_MINIMAL + select LV_CONF_MINIMAL if ZMK_DISPLAY @@ -13,10 +14,6 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 -config ZMK_DISPLAY_TICK_PERIOD_MS - int "Period (in ms) between display task execution" - default 10 - if LV_USE_THEME_MONO config ZMK_DISPLAY_INVERT @@ -29,8 +26,14 @@ choice LV_TXT_ENC endchoice -config LV_Z_MEM_POOL_SIZE - default 4096 if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN +config LV_MEM_CUSTOM + default y + +config LV_Z_MEM_POOL_MIN_SIZE + default 32 + +config LV_Z_MEM_POOL_MAX_SIZE + default 8192 choice ZMK_DISPLAY_STATUS_SCREEN prompt "Default status screen for displays" @@ -38,7 +41,7 @@ choice ZMK_DISPLAY_STATUS_SCREEN config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN bool "Built in status screen" select LV_OBJ_LABEL - imply LV_USE_THEME_MONO if LV_Z_BITS_PER_PIXEL=1 + imply LV_USE_THEME_MONO imply ZMK_WIDGET_LAYER_STATUS imply ZMK_WIDGET_BATTERY_STATUS imply ZMK_WIDGET_OUTPUT_STATUS @@ -64,7 +67,7 @@ if ZMK_DISPLAY_WORK_QUEUE_DEDICATED config ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE int "Stack size for dedicated UI thread/queue" - default 3072 + default 2048 config ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY int "Thread priority for dedicated UI thread/queue" diff --git a/app/src/display/main.c b/app/src/display/main.c index a86bfad5..e15e2de0 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -13,7 +13,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include -#include #include #include "theme.h" @@ -23,14 +22,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include static const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display)); - -#if DT_HAS_CHOSEN(zmk_display_led) - -static const struct device *display_led = DEVICE_DT_GET(DT_PARENT(DT_CHOSEN(zmk_display_led))); -static const uint8_t display_led_idx = DT_NODE_CHILD_IDX(DT_CHOSEN(zmk_display_led)); - -#endif - static bool initialized = false; static lv_obj_t *screen; @@ -39,6 +30,8 @@ __attribute__((weak)) lv_obj_t *zmk_display_status_screen() { return NULL; } void display_tick_cb(struct k_work *work) { lv_task_handler(); } +#define TICK_MS 10 + K_WORK_DEFINE(display_tick_work, display_tick_cb); #if IS_ENABLED(CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED) @@ -62,26 +55,15 @@ void display_timer_cb() { k_work_submit_to_queue(zmk_display_work_q(), &display_ K_TIMER_DEFINE(display_timer, display_timer_cb, NULL); void unblank_display_cb(struct k_work *work) { -#if DT_HAS_CHOSEN(zmk_display_led) - led_on(display_led, display_led_idx); -#endif display_blanking_off(display); -#if !IS_ENABLED(CONFIG_ARCH_POSIX) - k_timer_start(&display_timer, K_MSEC(CONFIG_ZMK_DISPLAY_TICK_PERIOD_MS), - K_MSEC(CONFIG_ZMK_DISPLAY_TICK_PERIOD_MS)); -#endif // !IS_ENABLED(CONFIG_ARCH_POSIX) + k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); } #if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) void blank_display_cb(struct k_work *work) { -#if !IS_ENABLED(CONFIG_ARCH_POSIX) k_timer_stop(&display_timer); -#endif // !IS_ENABLED(CONFIG_ARCH_POSIX) display_blanking_on(display); -#if DT_HAS_CHOSEN(zmk_display_led) - led_off(display_led, display_led_idx); -#endif } K_WORK_DEFINE(blank_display_work, blank_display_cb); K_WORK_DEFINE(unblank_display_work, unblank_display_cb); @@ -110,10 +92,10 @@ static void initialize_theme() { #if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) lv_disp_t *disp = lv_disp_get_default(); lv_theme_t *theme = - lv_theme_mono_init(disp, IS_ENABLED(CONFIG_ZMK_DISPLAY_INVERT), CONFIG_LV_FONT_DEFAULT, - CONFIG_ZMK_LV_FONT_DEFAULT_SMALL, CONFIG_LV_FONT_DEFAULT); + lv_theme_mono_init(disp, IS_ENABLED(CONFIG_ZMK_DISPLAY_INVERT), CONFIG_LV_FONT_DEFAULT); + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; - lv_display_set_theme(disp, theme); + disp->theme = theme; #endif // CONFIG_LV_USE_THEME_MONO } @@ -145,21 +127,12 @@ K_WORK_DEFINE(init_work, initialize_display); int zmk_display_init() { #if IS_ENABLED(CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED) - struct k_work_queue_config config = { -#if IS_ENABLED(CONFIG_THREAD_NAME) - .name = "display queue", -#endif - }; k_work_queue_start(&display_work_q, display_work_stack_area, K_THREAD_STACK_SIZEOF(display_work_stack_area), - CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY, &config); + CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY, NULL); #endif -#if IS_ENABLED(CONFIG_ARCH_POSIX) - initialize_display(NULL); -#else k_work_submit_to_queue(zmk_display_work_q(), &init_work); -#endif LOG_DBG(""); return 0; diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 4c02983c..7ec20c1f 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -10,7 +10,7 @@ config ZMK_WIDGET_LAYER_STATUS config ZMK_WIDGET_BATTERY_STATUS bool "Widget for battery charge information, using small icons" - depends on ZMK_BATTERY_REPORTING + depends on BT select LV_USE_LABEL if ZMK_WIDGET_BATTERY_STATUS diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 22e73faf..e35f890a 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -5,11 +5,11 @@ */ #include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include #include #include #include @@ -63,10 +63,8 @@ void battery_status_update_cb(struct battery_status_state state) { } static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { - const struct zmk_battery_state_changed *ev = as_zmk_battery_state_changed(eh); - - return (struct battery_status_state){ - .level = (ev != NULL) ? ev->state_of_charge : zmk_battery_state_of_charge(), + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) .usb_present = zmk_usb_is_powered(), #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index 64cb7c3d..c3ddd07c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -18,19 +18,19 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct layer_status_state { - zmk_keymap_layer_index_t index; + uint8_t index; const char *label; }; static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { - if (state.label == NULL || strlen(state.label) == 0) { - char text[8] = {}; + if (state.label == NULL) { + char text[7] = {}; - snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %i", state.index); + sprintf(text, LV_SYMBOL_KEYBOARD " %i", state.index); lv_label_set_text(label, text); } else { - char text[14] = {}; + char text[13] = {}; snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %s", state.label); @@ -44,9 +44,8 @@ static void layer_status_update_cb(struct layer_status_state state) { } static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { - zmk_keymap_layer_index_t index = zmk_keymap_highest_layer_active(); - return (struct layer_status_state){ - .index = index, .label = zmk_keymap_layer_name(zmk_keymap_layer_index_to_id(index))}; + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; } ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, @@ -65,4 +64,4 @@ int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_ lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { return widget->obj; -} +} \ No newline at end of file diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 189a7dc2..da29a95f 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -22,43 +22,25 @@ static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct output_status_state { struct zmk_endpoint_instance selected_endpoint; - enum zmk_transport preferred_transport; bool active_profile_connected; bool active_profile_bonded; }; static struct output_status_state get_state(const zmk_event_t *_eh) { - return (struct output_status_state){ - .selected_endpoint = zmk_endpoint_get_selected(), - .preferred_transport = zmk_endpoint_get_preferred_transport(), - .active_profile_connected = zmk_ble_active_profile_is_connected(), - .active_profile_bonded = !zmk_ble_active_profile_is_open(), - }; + return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = + zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open()}; + ; } static void set_status_symbol(lv_obj_t *label, struct output_status_state state) { - char text[20] = {}; - - enum zmk_transport transport = state.selected_endpoint.transport; - bool connected = transport != ZMK_TRANSPORT_NONE; - - // If we aren't connected, show what we're *trying* to connect to. - if (!connected) { - transport = state.preferred_transport; - } - - switch (transport) { - case ZMK_TRANSPORT_NONE: - strcat(text, LV_SYMBOL_CLOSE); - break; + char text[10] = {}; + switch (state.selected_endpoint.transport) { case ZMK_TRANSPORT_USB: strcat(text, LV_SYMBOL_USB); - if (!connected) { - strcat(text, " " LV_SYMBOL_CLOSE); - } break; - case ZMK_TRANSPORT_BLE: if (state.active_profile_bonded) { if (state.active_profile_connected) { diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 17cdc5d7..10357d4e 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -15,48 +15,26 @@ #include #include #include -#include #include #include #include #include #include - LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -// Name of the subtree for endpoint-related settings -#define SETTING_SUBTREE "endpoints" - -// Key of the setting to store the preferred_transport value. -#define SETTING_PREFERRED_TRANSPORT_KEY "preferred2" -// Full name of the setting to store the preferred_transport value. -#define SETTING_PREFERRED_TRANSPORT SETTING_SUBTREE "/" SETTING_PREFERRED_TRANSPORT_KEY - -// Key of the deprecated setting which stored preferred_transport with an older type. -#define SETTING_PREFERRED_TRANSPORT_V1_KEY "preferred" -// Full name of the deprecated setting which stored preferred_transport with an older type. -#define SETTING_PREFERRED_TRANSPORT_V1 SETTING_SUBTREE "/" SETTING_PREFERRED_TRANSPORT_V1_KEY - -#if IS_ENABLED(CONFIG_ZMK_USB) -#define DEFAULT_TRANSPORT ZMK_TRANSPORT_USB -#elif IS_ENABLED(CONFIG_ZMK_BLE) -#define DEFAULT_TRANSPORT ZMK_TRANSPORT_BLE -#else -#define DEFAULT_TRANSPORT ZMK_TRANSPORT_NONE -#endif +#define DEFAULT_TRANSPORT \ + COND_CODE_1(IS_ENABLED(CONFIG_ZMK_BLE), (ZMK_TRANSPORT_BLE), (ZMK_TRANSPORT_USB)) static struct zmk_endpoint_instance current_instance = {}; - -// Transport to use if multiple endpoints are ready -static enum zmk_transport preferred_transport = DEFAULT_TRANSPORT; +static enum zmk_transport preferred_transport = + ZMK_TRANSPORT_USB; /* Used if multiple endpoints are ready */ static void update_current_endpoint(void); #if IS_ENABLED(CONFIG_SETTINGS) static void endpoints_save_preferred_work(struct k_work *work) { - settings_save_one(SETTING_PREFERRED_TRANSPORT, &preferred_transport, - sizeof(preferred_transport)); + settings_save_one("endpoints/preferred", &preferred_transport, sizeof(preferred_transport)); } static struct k_work_delayable endpoints_save_work; @@ -76,7 +54,6 @@ bool zmk_endpoint_instance_eq(struct zmk_endpoint_instance a, struct zmk_endpoin } switch (a.transport) { - case ZMK_TRANSPORT_NONE: case ZMK_TRANSPORT_USB: return true; @@ -90,9 +67,6 @@ bool zmk_endpoint_instance_eq(struct zmk_endpoint_instance a, struct zmk_endpoin int zmk_endpoint_instance_to_str(struct zmk_endpoint_instance endpoint, char *str, size_t len) { switch (endpoint.transport) { - case ZMK_TRANSPORT_NONE: - return snprintf(str, len, "None"); - case ZMK_TRANSPORT_USB: return snprintf(str, len, "USB"); @@ -104,15 +78,11 @@ int zmk_endpoint_instance_to_str(struct zmk_endpoint_instance endpoint, char *st } } -#define INSTANCE_INDEX_OFFSET_NONE 0 -#define INSTANCE_INDEX_OFFSET_USB (INSTANCE_INDEX_OFFSET_NONE + ZMK_ENDPOINT_NONE_COUNT) -#define INSTANCE_INDEX_OFFSET_BLE (INSTANCE_INDEX_OFFSET_USB + ZMK_ENDPOINT_USB_COUNT) +#define INSTANCE_INDEX_OFFSET_USB 0 +#define INSTANCE_INDEX_OFFSET_BLE ZMK_ENDPOINT_USB_COUNT int zmk_endpoint_instance_to_index(struct zmk_endpoint_instance endpoint) { switch (endpoint.transport) { - case ZMK_TRANSPORT_NONE: - return INSTANCE_INDEX_OFFSET_NONE; - case ZMK_TRANSPORT_USB: return INSTANCE_INDEX_OFFSET_USB; @@ -124,7 +94,7 @@ int zmk_endpoint_instance_to_index(struct zmk_endpoint_instance endpoint) { return 0; } -int zmk_endpoint_set_preferred_transport(enum zmk_transport transport) { +int zmk_endpoints_select_transport(enum zmk_transport transport) { LOG_DBG("Selected endpoint transport %d", transport); if (preferred_transport == transport) { @@ -140,114 +110,74 @@ int zmk_endpoint_set_preferred_transport(enum zmk_transport transport) { return 0; } -enum zmk_transport zmk_endpoint_get_preferred_transport(void) { return preferred_transport; } - -int zmk_endpoint_toggle_preferred_transport(void) { +int zmk_endpoints_toggle_transport(void) { enum zmk_transport new_transport = (preferred_transport == ZMK_TRANSPORT_USB) ? ZMK_TRANSPORT_BLE : ZMK_TRANSPORT_USB; - return zmk_endpoint_set_preferred_transport(new_transport); + return zmk_endpoints_select_transport(new_transport); } -static struct zmk_endpoint_instance get_instance_from_transport(enum zmk_transport transport) { - struct zmk_endpoint_instance instance = {.transport = transport}; - switch (instance.transport) { - case ZMK_TRANSPORT_BLE: -#if IS_ENABLED(CONFIG_ZMK_BLE) - instance.ble.profile_index = zmk_ble_active_profile_index(); -#endif // IS_ENABLED(CONFIG_ZMK_BLE) - break; - - default: - // No extra data for this transport. - break; - } - - return instance; +struct zmk_endpoint_instance zmk_endpoints_selected(void) { + return current_instance; } -struct zmk_endpoint_instance zmk_endpoint_get_preferred(void) { - return get_instance_from_transport(preferred_transport); -} - -struct zmk_endpoint_instance zmk_endpoint_get_selected(void) { return current_instance; } - -bool zmk_endpoint_is_connected(void) { return current_instance.transport != ZMK_TRANSPORT_NONE; } - static int send_keyboard_report(void) { switch (current_instance.transport) { - case ZMK_TRANSPORT_NONE: - return 0; - - case ZMK_TRANSPORT_USB: { #if IS_ENABLED(CONFIG_ZMK_USB) + case ZMK_TRANSPORT_USB: { int err = zmk_usb_hid_send_keyboard_report(); if (err) { LOG_ERR("FAILED TO SEND OVER USB: %d", err); } return err; -#else - LOG_ERR("USB endpoint is not supported"); - return -ENOTSUP; -#endif /* IS_ENABLED(CONFIG_ZMK_USB) */ } +#endif /* IS_ENABLED(CONFIG_ZMK_USB) */ - case ZMK_TRANSPORT_BLE: { #if IS_ENABLED(CONFIG_ZMK_BLE) + case ZMK_TRANSPORT_BLE: { struct zmk_hid_keyboard_report *keyboard_report = zmk_hid_get_keyboard_report(); int err = zmk_hog_send_keyboard_report(&keyboard_report->body); if (err) { LOG_ERR("FAILED TO SEND OVER HOG: %d", err); } return err; -#else - LOG_ERR("BLE HOG endpoint is not supported"); - return -ENOTSUP; + } #endif /* IS_ENABLED(CONFIG_ZMK_BLE) */ } - } - LOG_ERR("Unhandled endpoint transport %d", current_instance.transport); + LOG_ERR("Unsupported endpoint transport %d", current_instance.transport); return -ENOTSUP; } static int send_consumer_report(void) { switch (current_instance.transport) { - case ZMK_TRANSPORT_NONE: - return 0; - - case ZMK_TRANSPORT_USB: { #if IS_ENABLED(CONFIG_ZMK_USB) + case ZMK_TRANSPORT_USB: { int err = zmk_usb_hid_send_consumer_report(); if (err) { LOG_ERR("FAILED TO SEND OVER USB: %d", err); } return err; -#else - LOG_ERR("USB endpoint is not supported"); - return -ENOTSUP; -#endif /* IS_ENABLED(CONFIG_ZMK_USB) */ } +#endif /* IS_ENABLED(CONFIG_ZMK_USB) */ - case ZMK_TRANSPORT_BLE: { #if IS_ENABLED(CONFIG_ZMK_BLE) + case ZMK_TRANSPORT_BLE: { struct zmk_hid_consumer_report *consumer_report = zmk_hid_get_consumer_report(); int err = zmk_hog_send_consumer_report(&consumer_report->body); if (err) { LOG_ERR("FAILED TO SEND OVER HOG: %d", err); } return err; -#else - LOG_ERR("BLE HOG endpoint is not supported"); - return -ENOTSUP; + } #endif /* IS_ENABLED(CONFIG_ZMK_BLE) */ } - } - LOG_ERR("Unhandled endpoint transport %d", current_instance.transport); + LOG_ERR("Unsupported endpoint transport %d", current_instance.transport); return -ENOTSUP; } -int zmk_endpoint_send_report(uint16_t usage_page) { +int zmk_endpoints_send_report(uint16_t usage_page) { + LOG_DBG("usage page 0x%02X", usage_page); switch (usage_page) { case HID_USAGE_KEY: @@ -261,148 +191,31 @@ int zmk_endpoint_send_report(uint16_t usage_page) { return -ENOTSUP; } -#if IS_ENABLED(CONFIG_ZMK_POINTING) -int zmk_endpoint_send_mouse_report() { - switch (current_instance.transport) { - case ZMK_TRANSPORT_NONE: - return 0; - - case ZMK_TRANSPORT_USB: { -#if IS_ENABLED(CONFIG_ZMK_USB) - int err = zmk_usb_hid_send_mouse_report(); - if (err) { - LOG_ERR("FAILED TO SEND OVER USB: %d", err); - } - return err; -#else - LOG_ERR("USB endpoint is not supported"); - return -ENOTSUP; -#endif /* IS_ENABLED(CONFIG_ZMK_USB) */ - } - - case ZMK_TRANSPORT_BLE: { -#if IS_ENABLED(CONFIG_ZMK_BLE) - struct zmk_hid_mouse_report *mouse_report = zmk_hid_get_mouse_report(); - int err = zmk_hog_send_mouse_report(&mouse_report->body); - if (err) { - LOG_ERR("FAILED TO SEND OVER HOG: %d", err); - } - return err; -#else - LOG_ERR("BLE HOG endpoint is not supported"); - return -ENOTSUP; -#endif /* IS_ENABLED(CONFIG_ZMK_BLE) */ - } - } - - LOG_ERR("Unhandled endpoint transport %d", current_instance.transport); - return -ENOTSUP; -} -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - #if IS_ENABLED(CONFIG_SETTINGS) -// Type for the deprecated SETTING_PREFERRED_TRANSPORT_V1 setting. To maintain backwards -// compatibility when ZMK_TRANSPORT_NONE was inserted into the beginning of enum zmk_transport, the -// setting was moved to SETTING_PREFERRED_TRANSPORT. If the deprecated setting exists, it must be -// upgraded to the new type and setting name. -enum transport_v1 { - TRANSPORT_V1_USB = 0, - TRANSPORT_V1_BLE = 1, -}; - -static enum zmk_transport upgrade_transport_v1(enum transport_v1 value) { - switch (value) { - case TRANSPORT_V1_USB: - return ZMK_TRANSPORT_USB; - - case TRANSPORT_V1_BLE: - return ZMK_TRANSPORT_BLE; - }; - - LOG_ERR("Invalid transport_v1 value: %d", value); - return ZMK_TRANSPORT_USB; -} - -/** - * Loads the deprecated SETTING_PREFERRED_TRANSPORT_V1 setting and upgrades it to the new type, - * storing the value in SETTING_PREFERRED_TRANSPORT and deleting the original setting. - */ -static int endpoint_settings_load_preferred_v1(size_t len, settings_read_cb read_cb, void *cb_arg) { - enum transport_v1 value; - - if (len != sizeof(value)) { - LOG_ERR("Invalid zmk_transport size (got %zu expected %zu)", len, sizeof(value)); - return -EINVAL; - } - - ssize_t len_read = read_cb(cb_arg, &value, sizeof(value)); - if (len_read < 0) { - LOG_ERR("Failed to read preferred endpoint v1 from settings (err %d)", len_read); - return len_read; - } - - preferred_transport = upgrade_transport_v1(value); - - int err = settings_delete(SETTING_PREFERRED_TRANSPORT_V1); - if (err != 0) { - LOG_ERR("Failed to delete preferred endpoint v1 setting (err %d)", err); - return err; - } - - err = settings_save_one(SETTING_PREFERRED_TRANSPORT, &preferred_transport, - sizeof(preferred_transport)); - if (err == 0) { - LOG_INF("Upgraded preferred endpoint setting"); - } else { - LOG_ERR("Failed to save upgraded endpoint value (err %d)", err); - } - - return err; -} - -/** - * Loads the SETTING_PREFERRED_TRANSPORT setting. - */ -static int endpoint_settings_load_preferred_v2(size_t len, settings_read_cb read_cb, void *cb_arg) { - if (len != sizeof(preferred_transport)) { - LOG_ERR("Invalid zmk_transport size (got %zu expected %zu)", len, - sizeof(preferred_transport)); - return -EINVAL; - } - - ssize_t len_read = read_cb(cb_arg, &preferred_transport, sizeof(preferred_transport)); - if (len_read < 0) { - LOG_ERR("Failed to read preferred endpoint from settings (err %d)", len_read); - return len_read; - } - - return 0; -} - -static int endpoint_settings_set(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { +static int endpoints_handle_set(const char *name, size_t len, settings_read_cb read_cb, + void *cb_arg) { LOG_DBG("Setting endpoint value %s", name); - if (settings_name_steq(name, SETTING_PREFERRED_TRANSPORT_KEY, NULL)) { - return endpoint_settings_load_preferred_v2(len, read_cb, cb_arg); - } + if (settings_name_steq(name, "preferred", NULL)) { + if (len != sizeof(enum zmk_transport)) { + LOG_ERR("Invalid endpoint size (got %d expected %d)", len, sizeof(enum zmk_transport)); + return -EINVAL; + } - if (settings_name_steq(name, SETTING_PREFERRED_TRANSPORT_V1_KEY, NULL)) { - return endpoint_settings_load_preferred_v1(len, read_cb, cb_arg); + int err = read_cb(cb_arg, &preferred_transport, sizeof(enum zmk_transport)); + if (err <= 0) { + LOG_ERR("Failed to read preferred endpoint from settings (err %d)", err); + return err; + } + + update_current_endpoint(); } return 0; } -static int endpoint_settings_commit(void) { - update_current_endpoint(); - return 0; -} - -SETTINGS_STATIC_HANDLER_DEFINE(endpoints, SETTING_SUBTREE, NULL, endpoint_settings_set, - endpoint_settings_commit, NULL); - +struct settings_handler endpoints_handler = {.name = "endpoints", .h_set = endpoints_handle_set}; #endif /* IS_ENABLED(CONFIG_SETTINGS) */ static bool is_usb_ready(void) { @@ -422,45 +235,56 @@ static bool is_ble_ready(void) { } static enum zmk_transport get_selected_transport(void) { - switch (preferred_transport) { - case ZMK_TRANSPORT_NONE: - LOG_DBG("No endpoint transport selected"); - return ZMK_TRANSPORT_NONE; - - case ZMK_TRANSPORT_USB: + if (is_ble_ready()) { if (is_usb_ready()) { - LOG_DBG("USB is preferred and ready"); - return ZMK_TRANSPORT_USB; + LOG_DBG("Both endpoint transports are ready. Using %d", preferred_transport); + return preferred_transport; } - if (is_ble_ready()) { - LOG_DBG("USB is not ready. Falling back to BLE"); - return ZMK_TRANSPORT_BLE; - } - break; - case ZMK_TRANSPORT_BLE: - if (is_ble_ready()) { - LOG_DBG("BLE is preferred and ready"); - return ZMK_TRANSPORT_BLE; - } - if (is_usb_ready()) { - LOG_DBG("BLE is not ready. Falling back to USB"); - return ZMK_TRANSPORT_USB; - } - break; + LOG_DBG("Only BLE is ready."); + return ZMK_TRANSPORT_BLE; } - LOG_DBG("Preferred endpoint transport is %d but no transports are ready", preferred_transport); - return ZMK_TRANSPORT_NONE; + if (is_usb_ready()) { + LOG_DBG("Only USB is ready."); + return ZMK_TRANSPORT_USB; + } + + LOG_DBG("No endpoint transports are ready."); + return DEFAULT_TRANSPORT; } static struct zmk_endpoint_instance get_selected_instance(void) { - return get_instance_from_transport(get_selected_transport()); + struct zmk_endpoint_instance instance = {.transport = get_selected_transport()}; + + switch (instance.transport) { +#if IS_ENABLED(CONFIG_ZMK_BLE) + case ZMK_TRANSPORT_BLE: + instance.ble.profile_index = zmk_ble_active_profile_index(); + break; +#endif // IS_ENABLED(CONFIG_ZMK_BLE) + + default: + // No extra data for this transport. + break; + } + + return instance; } -static int zmk_endpoints_init(void) { +static int zmk_endpoints_init(const struct device *_arg) { #if IS_ENABLED(CONFIG_SETTINGS) + settings_subsys_init(); + + int err = settings_register(&endpoints_handler); + if (err) { + LOG_ERR("Failed to register the endpoints settings handler (err %d)", err); + return err; + } + k_work_init_delayable(&endpoints_save_work, endpoints_save_preferred_work); + + settings_load_subtree("endpoints"); #endif current_instance = get_selected_instance(); @@ -468,15 +292,12 @@ static int zmk_endpoints_init(void) { return 0; } -void zmk_endpoint_clear_reports(void) { +static void disconnect_current_endpoint() { zmk_hid_keyboard_clear(); zmk_hid_consumer_clear(); -#if IS_ENABLED(CONFIG_ZMK_POINTING) - zmk_hid_mouse_clear(); -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - zmk_endpoint_send_report(HID_USAGE_KEY); - zmk_endpoint_send_report(HID_USAGE_CONSUMER); + zmk_endpoints_send_report(HID_USAGE_KEY); + zmk_endpoints_send_report(HID_USAGE_CONSUMER); } static void update_current_endpoint(void) { @@ -484,7 +305,7 @@ static void update_current_endpoint(void) { if (!zmk_endpoint_instance_eq(new_instance, current_instance)) { // Cancel all current keypresses so keys don't stay held on the old endpoint. - zmk_endpoint_clear_reports(); + disconnect_current_endpoint(); current_instance = new_instance; @@ -492,7 +313,8 @@ static void update_current_endpoint(void) { zmk_endpoint_instance_to_str(current_instance, endpoint_str, sizeof(endpoint_str)); LOG_INF("Endpoint changed: %s", endpoint_str); - raise_zmk_endpoint_changed((struct zmk_endpoint_changed){.endpoint = current_instance}); + ZMK_EVENT_RAISE( + new_zmk_endpoint_changed((struct zmk_endpoint_changed){.endpoint = current_instance})); } } diff --git a/app/src/event_manager.c b/app/src/event_manager.c index c28da97f..0f4a5547 100644 --- a/app/src/event_manager.c +++ b/app/src/event_manager.c @@ -32,17 +32,21 @@ int zmk_event_manager_handle_from(zmk_event_t *event, uint8_t start_index) { continue; case ZMK_EV_EVENT_HANDLED: LOG_DBG("Listener handled the event"); - return 0; + ret = 0; + goto release; case ZMK_EV_EVENT_CAPTURED: LOG_DBG("Listener captured the event"); + // Listeners are expected to free events they capture return 0; default: LOG_DBG("Listener returned an error: %d", ret); - return ret; + goto release; } } - return 0; +release: + k_free(event); + return ret; } int zmk_event_manager_raise(zmk_event_t *event) { return zmk_event_manager_handle_from(event, 0); } diff --git a/app/src/events/battery_state_changed.c b/app/src/events/battery_state_changed.c index ffb4297c..508ee971 100644 --- a/app/src/events/battery_state_changed.c +++ b/app/src/events/battery_state_changed.c @@ -7,6 +7,4 @@ #include #include -ZMK_EVENT_IMPL(zmk_battery_state_changed); - -ZMK_EVENT_IMPL(zmk_peripheral_battery_state_changed); \ No newline at end of file +ZMK_EVENT_IMPL(zmk_battery_state_changed); \ No newline at end of file diff --git a/app/src/events/hid_indicators_changed.c b/app/src/events/hid_indicators_changed.c deleted file mode 100644 index ded36835..00000000 --- a/app/src/events/hid_indicators_changed.c +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -ZMK_EVENT_IMPL(zmk_hid_indicators_changed); diff --git a/app/src/events/mouse_button_state_changed.c b/app/src/events/mouse_button_state_changed.c deleted file mode 100644 index 419a7ce9..00000000 --- a/app/src/events/mouse_button_state_changed.c +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ZMK_EVENT_IMPL(zmk_mouse_button_state_changed); diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 3975e038..e35714da 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -22,8 +22,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { - const struct gpio_dt_spec *control; - const size_t control_gpios_count; + const struct gpio_dt_spec control; const uint16_t init_delay_ms; }; @@ -40,14 +39,14 @@ static void ext_power_save_state_work(struct k_work *work) { const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; - snprintf(setting_path, sizeof(setting_path), "ext_power/state/%s", ext_power->name); + snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_PROP(0, label)); settings_save_one(setting_path, &data->status, sizeof(data->status)); } static struct k_work_delayable ext_power_save_work; #endif -int ext_power_save_state(void) { +int ext_power_save_state() { #if IS_ENABLED(CONFIG_SETTINGS) int ret = k_work_reschedule(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); return MIN(ret, 0); @@ -60,12 +59,9 @@ static int ext_power_generic_enable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - for (int i = 0; i < config->control_gpios_count; i++) { - const struct gpio_dt_spec *gpio = &config->control[i]; - if (gpio_pin_set_dt(gpio, 1)) { - LOG_WRN("Failed to set ext-power control pin %d", i); - return -EIO; - } + if (gpio_pin_set_dt(&config->control, 1)) { + LOG_WRN("Failed to set ext-power control pin"); + return -EIO; } data->status = true; return ext_power_save_state(); @@ -75,12 +71,10 @@ static int ext_power_generic_disable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - for (int i = 0; i < config->control_gpios_count; i++) { - const struct gpio_dt_spec *gpio = &config->control[i]; - if (gpio_pin_set_dt(gpio, 0)) { - LOG_WRN("Failed to clear ext-power control pin %d", i); - return -EIO; - } + if (gpio_pin_set_dt(&config->control, 0)) { + LOG_WRN("Failed to set ext-power control pin"); + LOG_WRN("Failed to clear ext-power control pin"); + return -EIO; } data->status = false; return ext_power_save_state(); @@ -92,45 +86,67 @@ static int ext_power_generic_get(const struct device *dev) { } #if IS_ENABLED(CONFIG_SETTINGS) -static int ext_power_settings_set_status(const struct device *dev, size_t len, - settings_read_cb read_cb, void *cb_arg) { - struct ext_power_generic_data *data = dev->data; - - if (len != sizeof(data->status)) { - return -EINVAL; - } - - int rc = read_cb(cb_arg, &data->status, sizeof(data->status)); - if (rc >= 0) { - data->settings_init = true; - - if (data->status) { - ext_power_generic_enable(dev); - } else { - ext_power_generic_disable(dev); - } - - return 0; - } - return rc; -} - static int ext_power_settings_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { - const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); - const char *next; - if (settings_name_steq(name, ext_power->name, &next) && !next) { - return ext_power_settings_set_status(ext_power, len, read_cb, cb_arg); - } + int rc; + if (settings_name_steq(name, DT_INST_PROP(0, label), &next) && !next) { + const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); + struct ext_power_generic_data *data = ext_power->data; + + if (len != sizeof(data->status)) { + return -EINVAL; + } + + rc = read_cb(cb_arg, &data->status, sizeof(data->status)); + if (rc >= 0) { + data->settings_init = true; + + if (ext_power == NULL) { + LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_PROP(0, label)); + return -EIO; + } + + if (data->status) { + ext_power_generic_enable(ext_power); + } else { + ext_power_generic_disable(ext_power); + } + + return 0; + } + return rc; + } return -ENOENT; } -static int ext_power_settings_commit() { - const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(0)); - struct ext_power_generic_data *data = dev->data; +struct settings_handler ext_power_conf = {.name = "ext_power/state", + .h_set = ext_power_settings_set}; +#endif +static int ext_power_generic_init(const struct device *dev) { + struct ext_power_generic_data *data = dev->data; + const struct ext_power_generic_config *config = dev->config; + + if (gpio_pin_configure_dt(&config->control, GPIO_OUTPUT_INACTIVE)) { + LOG_ERR("Failed to configure ext-power control pin"); + return -EIO; + } + +#if IS_ENABLED(CONFIG_SETTINGS) + settings_subsys_init(); + + int err = settings_register(&ext_power_conf); + if (err) { + LOG_ERR("Failed to register the ext_power settings handler (err %d)", err); + return err; + } + + k_work_init_delayable(&ext_power_save_work, ext_power_save_state_work); + + // Set default value (on) if settings isn't set + settings_load_subtree("ext_power"); if (!data->settings_init) { data->status = true; @@ -138,32 +154,10 @@ static int ext_power_settings_commit() { ext_power_enable(dev); } - - return 0; -} - -SETTINGS_STATIC_HANDLER_DEFINE(ext_power, "ext_power/state", NULL, ext_power_settings_set, - ext_power_settings_commit, NULL); - -#endif - -static int ext_power_generic_init(const struct device *dev) { - const struct ext_power_generic_config *config = dev->config; - - for (int i = 0; i < config->control_gpios_count; i++) { - const struct gpio_dt_spec *gpio = &config->control[i]; - if (gpio_pin_configure_dt(gpio, GPIO_OUTPUT_INACTIVE)) { - LOG_ERR("Failed to configure ext-power control pin %d", i); - return -EIO; - } - } - -#if IS_ENABLED(CONFIG_SETTINGS) - k_work_init_delayable(&ext_power_save_work, ext_power_save_state_work); -#endif - - // Enable by default. We may get disabled again once settings load. +#else + // Default to the ext_power being open when no settings ext_power_enable(dev); +#endif if (config->init_delay_ms) { k_msleep(config->init_delay_ms); @@ -187,12 +181,8 @@ static int ext_power_generic_pm_action(const struct device *dev, enum pm_device_ } #endif /* CONFIG_PM_DEVICE */ -static const struct gpio_dt_spec ext_power_control_gpios[DT_INST_PROP_LEN(0, control_gpios)] = { - DT_INST_FOREACH_PROP_ELEM_SEP(0, control_gpios, GPIO_DT_SPEC_GET_BY_IDX, (, ))}; - static const struct ext_power_generic_config config = { - .control = ext_power_control_gpios, - .control_gpios_count = DT_INST_PROP_LEN(0, control_gpios), + .control = GPIO_DT_SPEC_INST_GET(0, control_gpios), .init_delay_ms = DT_INST_PROP_OR(0, init_delay_ms, 0)}; static struct ext_power_generic_data data = { diff --git a/app/src/gpio_key_wakeup_trigger.c b/app/src/gpio_key_wakeup_trigger.c deleted file mode 100644 index d22523a4..00000000 --- a/app/src/gpio_key_wakeup_trigger.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#define DT_DRV_COMPAT zmk_gpio_key_wakeup_trigger - -struct gpio_key_wakeup_trigger_config { - struct gpio_dt_spec trigger; - size_t extra_gpios_count; - struct gpio_dt_spec extra_gpios[]; -}; - -static int zmk_gpio_key_wakeup_trigger_init(const struct device *dev) { -#if IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_init_suspended(dev); - pm_device_wakeup_enable(dev, true); -#endif - - return 0; -} - -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int gpio_key_wakeup_trigger_pm_resume(const struct device *dev) { - const struct gpio_key_wakeup_trigger_config *config = dev->config; - - int ret = gpio_pin_configure_dt(&config->trigger, GPIO_INPUT); - if (ret < 0) { - LOG_ERR("Failed to configure wakeup trigger key GPIO pin as input (%d)", ret); - return ret; - } - ret = gpio_pin_interrupt_configure_dt(&config->trigger, GPIO_INT_LEVEL_ACTIVE); - if (ret < 0) { - LOG_ERR("Failed to configure wakeup trigger key GPIO pin interrupt (%d)", ret); - return ret; - } - - for (int i = 0; i < config->extra_gpios_count; i++) { - ret = gpio_pin_configure_dt(&config->extra_gpios[i], GPIO_OUTPUT_ACTIVE); - if (ret < 0) { - LOG_WRN("Failed to set extra GPIO pin active for waker (%d)", ret); - return ret; - } - } - - return ret; -} - -static int gpio_key_wakeup_trigger_pm_suspend(const struct device *dev) { - const struct gpio_key_wakeup_trigger_config *config = dev->config; - - int ret = gpio_pin_interrupt_configure_dt(&config->trigger, GPIO_INT_DISABLE); - if (ret < 0) { - LOG_ERR("Failed to configure wakeup trigger key GPIO pin interrupt (%d)", ret); - } - - for (int i = 0; i < config->extra_gpios_count; i++) { - ret = gpio_pin_configure_dt(&config->extra_gpios[i], GPIO_DISCONNECTED); - if (ret < 0) { - LOG_WRN("Failed to set extra GPIO pin disconnected for waker (%d)", ret); - return ret; - } - } - - return ret; -} - -// The waker is "backwards", in as much as it is designed to be resumed/enabled immediately -// before a soft-off state is entered, so it can wake the device from that state later. -// So this waker correctly resumes and is ready to wake the device later. -static int gpio_key_wakeup_trigger_pm_action(const struct device *dev, - enum pm_device_action action) { - switch (action) { - case PM_DEVICE_ACTION_RESUME: - return gpio_key_wakeup_trigger_pm_resume(dev); - case PM_DEVICE_ACTION_SUSPEND: - return gpio_key_wakeup_trigger_pm_suspend(dev); - default: - return -ENOTSUP; - } -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#define WAKEUP_TRIGGER_EXTRA_GPIO_SPEC(idx, n) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(n), extra_gpios, idx) - -#define GPIO_KEY_WAKEUP_TRIGGER_INST(n) \ - const struct gpio_key_wakeup_trigger_config wtk_cfg_##n = { \ - .trigger = GPIO_DT_SPEC_GET(DT_INST_PROP(n, trigger), gpios), \ - .extra_gpios = {LISTIFY(DT_PROP_LEN_OR(DT_DRV_INST(n), extra_gpios, 0), \ - WAKEUP_TRIGGER_EXTRA_GPIO_SPEC, (, ), n)}, \ - .extra_gpios_count = DT_PROP_LEN_OR(DT_DRV_INST(n), extra_gpios, 0), \ - }; \ - PM_DEVICE_DT_INST_DEFINE(n, gpio_key_wakeup_trigger_pm_action); \ - DEVICE_DT_INST_DEFINE(n, zmk_gpio_key_wakeup_trigger_init, PM_DEVICE_DT_INST_GET(n), NULL, \ - &wtk_cfg_##n, PRE_KERNEL_2, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, NULL); - -DT_INST_FOREACH_STATUS_OKAY(GPIO_KEY_WAKEUP_TRIGGER_INST) diff --git a/app/src/hid.c b/app/src/hid.c index d8700c3f..689a2361 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -12,7 +12,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include static struct zmk_hid_keyboard_report keyboard_report = { - .report_id = ZMK_HID_REPORT_ID_KEYBOARD, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}}; static struct zmk_hid_consumer_report consumer_report = {.report_id = ZMK_HID_REPORT_ID_CONSUMER, @@ -25,14 +24,6 @@ static uint8_t keys_held = 0; #endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -static struct zmk_hid_mouse_report mouse_report = { - .report_id = ZMK_HID_REPORT_ID_MOUSE, - .body = {.buttons = 0, .d_x = 0, .d_y = 0, .d_scroll_y = 0, .d_scroll_x = 0}}; - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - // Keep track of how often a modifier was pressed. // Only release the modifier if the count is 0. static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -48,7 +39,7 @@ static zmk_mod_flags_t masked_modifiers = 0; #define GET_MODIFIERS (keyboard_report.body.modifiers) -zmk_mod_flags_t zmk_hid_get_explicit_mods(void) { return explicit_modifiers; } +zmk_mod_flags_t zmk_hid_get_explicit_mods() { return explicit_modifiers; } int zmk_hid_register_mod(zmk_mod_t modifier) { explicit_modifier_counts[modifier]++; @@ -118,7 +109,7 @@ static zmk_hid_boot_report_t *boot_report_rollover(uint8_t modifiers) { #define TOGGLE_KEYBOARD(code, val) WRITE_BIT(keyboard_report.body.keys[code / 8], code % 8, val) #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) -zmk_hid_boot_report_t *zmk_hid_get_boot_report(void) { +zmk_hid_boot_report_t *zmk_hid_get_boot_report() { if (keys_held > HID_BOOT_KEY_LEN) { return boot_report_rollover(keyboard_report.body.modifiers); } @@ -127,7 +118,7 @@ zmk_hid_boot_report_t *zmk_hid_get_boot_report(void) { memset(&boot_report.keys, 0, HID_BOOT_KEY_LEN); int ix = 0; uint8_t base_code = 0; - for (int i = 0; i < sizeof(keyboard_report.body.keys); ++i) { + for (int i = 0; i < (ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1) / 8; ++i) { if (ix == keys_held) { break; } @@ -188,7 +179,7 @@ static inline bool check_keyboard_usage(zmk_key_t usage) { } #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) -zmk_hid_boot_report_t *zmk_hid_get_boot_report(void) { +zmk_hid_boot_report_t *zmk_hid_get_boot_report() { if (keys_held > HID_BOOT_KEY_LEN) { return boot_report_rollover(keyboard_report.body.modifiers); } @@ -250,9 +241,8 @@ static inline int check_keyboard_usage(zmk_key_t usage) { #endif #define TOGGLE_CONSUMER(match, val) \ - if (val > ZMK_HID_CONSUMER_MAX_USAGE) { \ - return -ENOTSUP; \ - } \ + COND_CODE_1(IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC), \ + (if (val > 0xFF) { return -ENOTSUP; }), ()) \ for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { \ if (consumer_report.body.keys[idx] != match) { \ continue; \ @@ -270,7 +260,7 @@ int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t new_implicit_modifiers) { return current == GET_MODIFIERS ? 0 : 1; } -int zmk_hid_implicit_modifiers_release(void) { +int zmk_hid_implicit_modifiers_release() { implicit_modifiers = 0; zmk_mod_flags_t current = GET_MODIFIERS; SET_MODIFIERS(explicit_modifiers); @@ -284,7 +274,7 @@ int zmk_hid_masked_modifiers_set(zmk_mod_flags_t new_masked_modifiers) { return current == GET_MODIFIERS ? 0 : 1; } -int zmk_hid_masked_modifiers_clear(void) { +int zmk_hid_masked_modifiers_clear() { masked_modifiers = 0; zmk_mod_flags_t current = GET_MODIFIERS; SET_MODIFIERS(explicit_modifiers); @@ -314,9 +304,7 @@ bool zmk_hid_keyboard_is_pressed(zmk_key_t code) { return check_keyboard_usage(code); } -void zmk_hid_keyboard_clear(void) { - memset(&keyboard_report.body, 0, sizeof(keyboard_report.body)); -} +void zmk_hid_keyboard_clear() { memset(&keyboard_report.body, 0, sizeof(keyboard_report.body)); } int zmk_hid_consumer_press(zmk_key_t code) { TOGGLE_CONSUMER(0U, code); @@ -328,9 +316,7 @@ int zmk_hid_consumer_release(zmk_key_t code) { return 0; }; -void zmk_hid_consumer_clear(void) { - memset(&consumer_report.body, 0, sizeof(consumer_report.body)); -} +void zmk_hid_consumer_clear() { memset(&consumer_report.body, 0, sizeof(consumer_report.body)); } bool zmk_hid_consumer_is_pressed(zmk_key_t key) { for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { @@ -371,109 +357,10 @@ bool zmk_hid_is_pressed(uint32_t usage) { return false; } -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -// Keep track of how often a button was pressed. -// Only release the button if the count is 0. -static int explicit_button_counts[5] = {0, 0, 0, 0, 0}; -static zmk_mod_flags_t explicit_buttons = 0; - -#define SET_MOUSE_BUTTONS(btns) \ - { \ - mouse_report.body.buttons = btns; \ - LOG_DBG("Mouse buttons set to 0x%02X", mouse_report.body.buttons); \ - } - -int zmk_hid_mouse_button_press(zmk_mouse_button_t button) { - if (button >= ZMK_HID_MOUSE_NUM_BUTTONS) { - return -EINVAL; - } - - explicit_button_counts[button]++; - LOG_DBG("Button %d count %d", button, explicit_button_counts[button]); - WRITE_BIT(explicit_buttons, button, true); - SET_MOUSE_BUTTONS(explicit_buttons); - return 0; +struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report() { + return &keyboard_report; } -int zmk_hid_mouse_button_release(zmk_mouse_button_t button) { - if (button >= ZMK_HID_MOUSE_NUM_BUTTONS) { - return -EINVAL; - } - - if (explicit_button_counts[button] <= 0) { - LOG_ERR("Tried to release button %d too often", button); - return -EINVAL; - } - explicit_button_counts[button]--; - LOG_DBG("Button %d count: %d", button, explicit_button_counts[button]); - if (explicit_button_counts[button] == 0) { - LOG_DBG("Button %d released", button); - WRITE_BIT(explicit_buttons, button, false); - } - SET_MOUSE_BUTTONS(explicit_buttons); - return 0; +struct zmk_hid_consumer_report *zmk_hid_get_consumer_report() { + return &consumer_report; } - -int zmk_hid_mouse_buttons_press(zmk_mouse_button_flags_t buttons) { - for (zmk_mouse_button_t i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { - if (buttons & BIT(i)) { - zmk_hid_mouse_button_press(i); - } - } - return 0; -} - -int zmk_hid_mouse_buttons_release(zmk_mouse_button_flags_t buttons) { - for (zmk_mouse_button_t i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { - if (buttons & BIT(i)) { - zmk_hid_mouse_button_release(i); - } - } - return 0; -} - -void zmk_hid_mouse_movement_set(int16_t hwheel, int16_t wheel) { - mouse_report.body.d_x = hwheel; - mouse_report.body.d_y = wheel; - LOG_DBG("Mouse movement set to %d/%d", mouse_report.body.d_x, mouse_report.body.d_y); -} - -void zmk_hid_mouse_movement_update(int16_t hwheel, int16_t wheel) { - mouse_report.body.d_x += hwheel; - mouse_report.body.d_y += wheel; - LOG_DBG("Mouse movement updated to %d/%d", mouse_report.body.d_x, mouse_report.body.d_y); -} - -void zmk_hid_mouse_scroll_set(int16_t hwheel, int16_t wheel) { - mouse_report.body.d_scroll_x = hwheel; - mouse_report.body.d_scroll_y = wheel; - - LOG_DBG("Mouse scroll set to %d/%d", mouse_report.body.d_scroll_x, - mouse_report.body.d_scroll_y); -} - -void zmk_hid_mouse_scroll_update(int16_t hwheel, int16_t wheel) { - mouse_report.body.d_scroll_x += hwheel; - mouse_report.body.d_scroll_y += wheel; - - LOG_DBG("Mouse scroll updated to X: %d/%d", mouse_report.body.d_scroll_x, - mouse_report.body.d_scroll_y); -} - -void zmk_hid_mouse_clear(void) { - LOG_DBG("Mouse report cleared"); - memset(&mouse_report.body, 0, sizeof(mouse_report.body)); -} - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(void) { return &keyboard_report; } - -struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(void) { return &consumer_report; } - -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -struct zmk_hid_mouse_report *zmk_hid_get_mouse_report(void) { return &mouse_report; } - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) diff --git a/app/src/hid_indicators.c b/app/src/hid_indicators.c deleted file mode 100644 index 23149cca..00000000 --- a/app/src/hid_indicators.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -static zmk_hid_indicators_t hid_indicators[ZMK_ENDPOINT_COUNT]; - -zmk_hid_indicators_t zmk_hid_indicators_get_current_profile(void) { - return zmk_hid_indicators_get_profile(zmk_endpoint_get_selected()); -} - -zmk_hid_indicators_t zmk_hid_indicators_get_profile(struct zmk_endpoint_instance endpoint) { - const int profile = zmk_endpoint_instance_to_index(endpoint); - return hid_indicators[profile]; -} - -static void raise_led_changed_event(struct k_work *_work) { - const zmk_hid_indicators_t indicators = zmk_hid_indicators_get_current_profile(); - - raise_zmk_hid_indicators_changed((struct zmk_hid_indicators_changed){.indicators = indicators}); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) && IS_ENABLED(CONFIG_ZMK_SPLIT) - zmk_split_central_update_hid_indicator(indicators); -#endif -} - -static K_WORK_DEFINE(led_changed_work, raise_led_changed_event); - -void zmk_hid_indicators_set_profile(zmk_hid_indicators_t indicators, - struct zmk_endpoint_instance endpoint) { - int profile = zmk_endpoint_instance_to_index(endpoint); - - // This write is not happening on the main thread. To prevent potential data races, every - // operation involving hid_indicators must be atomic. Currently, each function either reads - // or writes only one entry at a time, so it is safe to do these operations without a lock. - hid_indicators[profile] = indicators; - - k_work_submit(&led_changed_work); -} - -void zmk_hid_indicators_process_report(struct zmk_hid_led_report_body *report, - struct zmk_endpoint_instance endpoint) { - const zmk_hid_indicators_t indicators = (zmk_hid_indicators_t)report->leds; - zmk_hid_indicators_set_profile(indicators, endpoint); - - LOG_DBG("Update HID indicators: endpoint=%d, indicators=%x", endpoint.transport, indicators); -} - -static int profile_listener(const zmk_event_t *eh) { - raise_led_changed_event(NULL); - return 0; -} - -ZMK_LISTENER(profile_listener, profile_listener); -ZMK_SUBSCRIPTION(profile_listener, zmk_endpoint_changed); diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index cd463d8e..2b847082 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -28,7 +28,7 @@ static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed * LOG_DBG("Unable to pre-release keycode (%d)", err); return err; } - err = zmk_endpoint_send_report(ev->usage_page); + err = zmk_endpoints_send_report(ev->usage_page); if (err < 0) { LOG_ERR("Failed to send key report for pre-releasing keycode (%d)", err); } @@ -45,14 +45,14 @@ static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed * implicit_mods_changed = zmk_hid_implicit_modifiers_press(ev->implicit_modifiers); if (ev->usage_page != HID_USAGE_KEY && (explicit_mods_changed > 0 || implicit_mods_changed > 0)) { - err = zmk_endpoint_send_report(HID_USAGE_KEY); + err = zmk_endpoints_send_report(HID_USAGE_KEY); if (err < 0) { LOG_ERR("Failed to send key report for changed mofifiers for consumer page event (%d)", err); } } - return zmk_endpoint_send_report(ev->usage_page); + return zmk_endpoints_send_report(ev->usage_page); } static int hid_listener_keycode_released(const struct zmk_keycode_state_changed *ev) { @@ -66,17 +66,6 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed return err; } -#if IS_ENABLED(CONFIG_ZMK_HID_SEPARATE_MOD_RELEASE_REPORT) - - // send report of normal key release early to fix the issue - // of some programs recognizing the implicit_mod release before the actual key release - err = zmk_endpoint_send_report(ev->usage_page); - if (err < 0) { - LOG_ERR("Failed to send key report for the released keycode (%d)", err); - } - -#endif // IS_ENABLED(CONFIG_ZMK_HID_SEPARATE_MOD_RELEASE_REPORT) - explicit_mods_changed = zmk_hid_unregister_mods(ev->explicit_modifiers); // There is a minor issue with this code. // If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released @@ -84,16 +73,16 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed // Solving this would require keeping track of which key's implicit modifiers are currently // active and only releasing modifiers at that time. implicit_mods_changed = zmk_hid_implicit_modifiers_release(); - + ; if (ev->usage_page != HID_USAGE_KEY && (explicit_mods_changed > 0 || implicit_mods_changed > 0)) { - err = zmk_endpoint_send_report(HID_USAGE_KEY); + err = zmk_endpoints_send_report(HID_USAGE_KEY); if (err < 0) { LOG_ERR("Failed to send key report for changed mofifiers for consumer page event (%d)", err); } } - return zmk_endpoint_send_report(ev->usage_page); + return zmk_endpoints_send_report(ev->usage_page); } int hid_listener(const zmk_event_t *eh) { diff --git a/app/src/hog.c b/app/src/hog.c index c7d9b861..9ccfd9d2 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -15,15 +15,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#include #include #include -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) -#include -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) -#include -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) enum { HIDS_REMOTE_WAKE = BIT(0), @@ -58,38 +51,11 @@ static struct hids_report input = { .type = HIDS_INPUT, }; -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - -static struct hids_report led_indicators = { - .id = ZMK_HID_REPORT_ID_LEDS, - .type = HIDS_OUTPUT, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - static struct hids_report consumer_input = { .id = ZMK_HID_REPORT_ID_CONSUMER, .type = HIDS_INPUT, }; -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -static struct hids_report mouse_input = { - .id = ZMK_HID_REPORT_ID_MOUSE, - .type = HIDS_INPUT, -}; - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -static struct hids_report mouse_feature = { - .id = ZMK_HID_REPORT_ID_MOUSE, - .type = HIDS_FEATURE, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - static bool host_requests_notification = false; static uint8_t ctrl_point; // static uint8_t proto_mode; @@ -119,34 +85,6 @@ static ssize_t read_hids_input_report(struct bt_conn *conn, const struct bt_gatt sizeof(struct zmk_hid_keyboard_report_body)); } -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) -static ssize_t write_hids_leds_report(struct bt_conn *conn, const struct bt_gatt_attr *attr, - const void *buf, uint16_t len, uint16_t offset, - uint8_t flags) { - if (offset != 0) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); - } - if (len != sizeof(struct zmk_hid_led_report_body)) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN); - } - - struct zmk_hid_led_report_body *report = (struct zmk_hid_led_report_body *)buf; - int profile = zmk_ble_profile_index(bt_conn_get_dst(conn)); - if (profile < 0) { - return BT_GATT_ERR(BT_ATT_ERR_UNLIKELY); - } - - struct zmk_endpoint_instance endpoint = {.transport = ZMK_TRANSPORT_BLE, - .ble = { - .profile_index = profile, - }}; - zmk_hid_indicators_process_report(report, endpoint); - - return len; -} - -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - static ssize_t read_hids_consumer_input_report(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, uint16_t len, uint16_t offset) { @@ -155,73 +93,6 @@ static ssize_t read_hids_consumer_input_report(struct bt_conn *conn, sizeof(struct zmk_hid_consumer_report_body)); } -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -static ssize_t read_hids_mouse_input_report(struct bt_conn *conn, const struct bt_gatt_attr *attr, - void *buf, uint16_t len, uint16_t offset) { - struct zmk_hid_mouse_report_body *report_body = &zmk_hid_get_mouse_report()->body; - return bt_gatt_attr_read(conn, attr, buf, len, offset, report_body, - sizeof(struct zmk_hid_mouse_report_body)); -} - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -static ssize_t read_hids_mouse_feature_report(struct bt_conn *conn, const struct bt_gatt_attr *attr, - void *buf, uint16_t len, uint16_t offset) { - - int profile = zmk_ble_profile_index(bt_conn_get_dst(conn)); - if (profile < 0) { - LOG_DBG(" BT_ATT_ERR_UNLIKELY"); - return BT_GATT_ERR(BT_ATT_ERR_UNLIKELY); - } - - struct zmk_endpoint_instance endpoint = { - .transport = ZMK_TRANSPORT_BLE, - .ble = {.profile_index = profile}, - }; - - struct zmk_pointing_resolution_multipliers mult = - zmk_pointing_resolution_multipliers_get_profile(endpoint); - - struct zmk_hid_mouse_resolution_feature_report_body report = { - .wheel_res = mult.wheel, - .hwheel_res = mult.hor_wheel, - }; - - return bt_gatt_attr_read(conn, attr, buf, len, offset, &report, - sizeof(struct zmk_hid_mouse_resolution_feature_report_body)); -} - -static ssize_t write_hids_mouse_feature_report(struct bt_conn *conn, - const struct bt_gatt_attr *attr, const void *buf, - uint16_t len, uint16_t offset, uint8_t flags) { - if (offset != 0) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); - } - if (len != sizeof(struct zmk_hid_mouse_resolution_feature_report_body)) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN); - } - - struct zmk_hid_mouse_resolution_feature_report_body *report = - (struct zmk_hid_mouse_resolution_feature_report_body *)buf; - int profile = zmk_ble_profile_index(bt_conn_get_dst(conn)); - if (profile < 0) { - return BT_GATT_ERR(BT_ATT_ERR_UNLIKELY); - } - - struct zmk_endpoint_instance endpoint = {.transport = ZMK_TRANSPORT_BLE, - .ble = { - .profile_index = profile, - }}; - zmk_pointing_resolution_multipliers_process_report(report, endpoint); - - return len; -} - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - // static ssize_t write_proto_mode(struct bt_conn *conn, // const struct bt_gatt_attr *attr, // const void *buf, uint16_t len, uint16_t offset, @@ -263,43 +134,29 @@ BT_GATT_SERVICE_DEFINE( BT_GATT_CCC(input_ccc_changed, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, NULL, &input), - BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ_ENCRYPT, read_hids_consumer_input_report, NULL, NULL), BT_GATT_CCC(input_ccc_changed, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, NULL, &consumer_input), - -#if IS_ENABLED(CONFIG_ZMK_POINTING) - BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, - BT_GATT_PERM_READ_ENCRYPT, read_hids_mouse_input_report, NULL, NULL), - BT_GATT_CCC(input_ccc_changed, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), - BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, - NULL, &mouse_input), - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT, - BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, - BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT, - read_hids_mouse_feature_report, write_hids_mouse_feature_report, NULL), - BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, - NULL, &mouse_feature), -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT, - BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, - BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT, NULL, - write_hids_leds_report, NULL), - BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, - NULL, &led_indicators), -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_CTRL_POINT, BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE, NULL, write_ctrl_point, &ctrl_point)); +struct bt_conn *destination_connection() { + struct bt_conn *conn; + bt_addr_le_t *addr = zmk_ble_active_profile_addr(); + LOG_DBG("Address pointer %p", addr); + if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { + LOG_WRN("Not sending, no active address for current profile"); + return NULL; + } else if ((conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr)) == NULL) { + LOG_WRN("Not sending, not connected to active profile"); + return NULL; + } + + return conn; +} + K_THREAD_STACK_DEFINE(hog_q_stack, CONFIG_ZMK_BLE_THREAD_STACK_SIZE); struct k_work_q hog_work_q; @@ -311,7 +168,7 @@ void send_keyboard_report_callback(struct k_work *work) { struct zmk_hid_keyboard_report_body report; while (k_msgq_get(&zmk_hog_keyboard_msgq, &report, K_NO_WAIT) == 0) { - struct bt_conn *conn = zmk_ble_active_profile_conn(); + struct bt_conn *conn = destination_connection(); if (conn == NULL) { return; } @@ -323,10 +180,8 @@ void send_keyboard_report_callback(struct k_work *work) { }; int err = bt_gatt_notify_cb(conn, ¬ify_params); - if (err == -EPERM) { - bt_conn_set_security(conn, BT_SECURITY_L2); - } else if (err) { - LOG_DBG("Error notifying %d", err); + if (err) { + LOG_ERR("Error notifying %d", err); } bt_conn_unref(conn); @@ -363,21 +218,19 @@ void send_consumer_report_callback(struct k_work *work) { struct zmk_hid_consumer_report_body report; while (k_msgq_get(&zmk_hog_consumer_msgq, &report, K_NO_WAIT) == 0) { - struct bt_conn *conn = zmk_ble_active_profile_conn(); + struct bt_conn *conn = destination_connection(); if (conn == NULL) { return; } struct bt_gatt_notify_params notify_params = { - .attr = &hog_svc.attrs[9], + .attr = &hog_svc.attrs[10], .data = &report, .len = sizeof(report), }; int err = bt_gatt_notify_cb(conn, ¬ify_params); - if (err == -EPERM) { - bt_conn_set_security(conn, BT_SECURITY_L2); - } else if (err) { + if (err) { LOG_DBG("Error notifying %d", err); } @@ -408,61 +261,7 @@ int zmk_hog_send_consumer_report(struct zmk_hid_consumer_report_body *report) { return 0; }; -#if IS_ENABLED(CONFIG_ZMK_POINTING) - -K_MSGQ_DEFINE(zmk_hog_mouse_msgq, sizeof(struct zmk_hid_mouse_report_body), - CONFIG_ZMK_BLE_MOUSE_REPORT_QUEUE_SIZE, 4); - -void send_mouse_report_callback(struct k_work *work) { - struct zmk_hid_mouse_report_body report; - while (k_msgq_get(&zmk_hog_mouse_msgq, &report, K_NO_WAIT) == 0) { - struct bt_conn *conn = zmk_ble_active_profile_conn(); - if (conn == NULL) { - return; - } - - struct bt_gatt_notify_params notify_params = { - .attr = &hog_svc.attrs[13], - .data = &report, - .len = sizeof(report), - }; - - int err = bt_gatt_notify_cb(conn, ¬ify_params); - if (err == -EPERM) { - bt_conn_set_security(conn, BT_SECURITY_L2); - } else if (err) { - LOG_DBG("Error notifying %d", err); - } - - bt_conn_unref(conn); - } -}; - -K_WORK_DEFINE(hog_mouse_work, send_mouse_report_callback); - -int zmk_hog_send_mouse_report(struct zmk_hid_mouse_report_body *report) { - int err = k_msgq_put(&zmk_hog_mouse_msgq, report, K_MSEC(100)); - if (err) { - switch (err) { - case -EAGAIN: { - LOG_WRN("Consumer message queue full, popping first message and queueing again"); - struct zmk_hid_mouse_report_body discarded_report; - k_msgq_get(&zmk_hog_mouse_msgq, &discarded_report, K_NO_WAIT); - return zmk_hog_send_mouse_report(report); - } - default: - LOG_WRN("Failed to queue mouse report to send (%d)", err); - return err; - } - } - - k_work_submit_to_queue(&hog_work_q, &hog_mouse_work); - - return 0; -}; -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -static int zmk_hog_init(void) { +int zmk_hog_init(const struct device *_arg) { static const struct k_work_queue_config queue_config = {.name = "HID Over GATT Send Work"}; k_work_queue_start(&hog_work_q, hog_q_stack, K_THREAD_STACK_SIZEOF(hog_q_stack), CONFIG_ZMK_BLE_THREAD_PRIORITY, &queue_config); diff --git a/app/src/indicators/CMakeLists.txt b/app/src/indicators/CMakeLists.txt deleted file mode 100644 index 5c8fff74..00000000 --- a/app/src/indicators/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -target_sources_ifdef(CONFIG_ZMK_INDICATOR_LEDS app PRIVATE indicator_leds.c) diff --git a/app/src/indicators/Kconfig b/app/src/indicators/Kconfig deleted file mode 100644 index 2ae999bb..00000000 --- a/app/src/indicators/Kconfig +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2026 The ZMK Contributors -# SPDX-License-Identifier: MIT - -rsource "Kconfig.indicator_leds" diff --git a/app/src/indicators/Kconfig.indicator_leds b/app/src/indicators/Kconfig.indicator_leds deleted file mode 100644 index 5e4f663c..00000000 --- a/app/src/indicators/Kconfig.indicator_leds +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config ZMK_INDICATOR_LEDS - bool - default y - depends on DT_HAS_ZMK_INDICATOR_LEDS_ENABLED - select LED - select ZMK_HID_INDICATORS - -if ZMK_INDICATOR_LEDS - -config ZMK_INDICATOR_LEDS_INIT_PRIORITY - int "ZMK indicator LED initialization priority" - default 91 - help - System initialization priority for ZMK indicator LEDs. - -endif # ZMK_INDICATOR_LEDS diff --git a/app/src/indicators/indicator_leds.c b/app/src/indicators/indicator_leds.c deleted file mode 100644 index 9fdff077..00000000 --- a/app/src/indicators/indicator_leds.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_indicator_leds - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct indicator_led_child_config { - size_t leds_len; - const struct led_dt_spec *leds; - - zmk_hid_indicators_t indicator; - uint8_t active_brightness; - uint8_t inactive_brightness; - uint8_t disconnected_brightness; - bool on_while_idle; -}; - -struct indicator_led_config { - size_t indicators_len; - const struct indicator_led_child_config *indicators; -}; - -struct indicator_led_data { - enum zmk_activity_state activity_state; - zmk_hid_indicators_t indicators; - bool usb_powered; - bool pm_suspended; - bool endpoint_connected; -}; - -static bool is_led_disabled(const struct indicator_led_child_config *config, - const struct indicator_led_data *data) { - // LEDs should always be off if the device is suspended. - if (data->pm_suspended) { - return true; - } - - // If the keyboard is powered, LEDs don't need to be disabled to save power. - if (data->usb_powered) { - return false; - } - - switch (data->activity_state) { - case ZMK_ACTIVITY_ACTIVE: - return false; - - case ZMK_ACTIVITY_IDLE: - return !config->on_while_idle; - - case ZMK_ACTIVITY_SLEEP: - return true; - } - - LOG_ERR("Unhandled activity state %d", data->activity_state); - return false; -} - -static uint8_t get_brightness(const struct indicator_led_child_config *config, - const struct indicator_led_data *data) { - if (is_led_disabled(config, data)) { - return 0; - } - - if (!data->endpoint_connected) { - return config->disconnected_brightness; - } - - const bool active = data->indicators & config->indicator; - return active ? config->active_brightness : config->inactive_brightness; -} - -static int update_indicator(const struct indicator_led_child_config *config, - const struct indicator_led_data *data) { - const uint8_t value = get_brightness(config, data); - - for (int i = 0; i < config->leds_len; i++) { - const struct led_dt_spec *spec = &config->leds[i]; - const int err = led_set_brightness_dt(spec, value); - if (err) { - LOG_ERR("Failed to set %s %u to %u%%: %d", spec->dev->name, spec->index, value, err); - return err; - } - - LOG_DBG("Set %s %u to %u%%", spec->dev->name, spec->index, value); - } - - return 0; -} - -static int update_device(const struct device *dev) { - const struct indicator_led_config *config = dev->config; - struct indicator_led_data *data = dev->data; - - data->activity_state = zmk_activity_get_state(); - data->indicators = zmk_hid_indicators_get_current_profile(); - data->usb_powered = zmk_usb_is_powered(); - data->endpoint_connected = zmk_endpoint_is_connected(); - - for (int i = 0; i < config->indicators_len; i++) { - const int err = update_indicator(&config->indicators[i], data); - if (err) { - return err; - } - } - - return 0; -} - -#define INST_DEV(n) DEVICE_DT_GET(DT_DRV_INST(n)), -static const struct device *all_instances[] = {DT_INST_FOREACH_STATUS_OKAY(INST_DEV)}; - -static void update_all_indicators(struct k_work *work) { - LOG_DBG("Updating indicator LEDs"); - - for (int i = 0; i < ARRAY_SIZE(all_instances); i++) { - if (device_is_ready(all_instances[i])) { - update_device(all_instances[i]); - } - } -} - -// We may get multiple events at the same time (e.g. endpoint changed will -// also trigger HID indicators changed), but we only need to update the LEDs -// once per batch of events, so defer the updates with a work item. -static K_WORK_DEFINE(update_all_indicators_work, update_all_indicators); - -static int indicator_led_event_listener(const zmk_event_t *eh) { - k_work_submit(&update_all_indicators_work); - return ZMK_EV_EVENT_BUBBLE; -} - -static int indicator_led_init(const struct device *dev) { return update_device(dev); } - -ZMK_LISTENER(indicator_led, indicator_led_event_listener); -ZMK_SUBSCRIPTION(indicator_led, zmk_activity_state_changed); -ZMK_SUBSCRIPTION(indicator_led, zmk_hid_indicators_changed); -ZMK_SUBSCRIPTION(indicator_led, zmk_usb_conn_state_changed); -ZMK_SUBSCRIPTION(indicator_led, zmk_endpoint_changed); - -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int indicator_led_init_pm_action(const struct device *dev, enum pm_device_action action) { - struct indicator_led_data *data = dev->data; - - switch (action) { - case PM_DEVICE_ACTION_SUSPEND: - data->pm_suspended = true; - return update_device(dev); - - case PM_DEVICE_ACTION_RESUME: - data->pm_suspended = false; - return update_device(dev); - - default: - return -ENOTSUP; - } -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#define LED_DT_SPEC_GET_BY_IDX(node_id, prop, idx) \ - LED_DT_SPEC_GET(DT_PHANDLE_BY_IDX(node_id, prop, idx)) - -#define CHILD_LEDS_ARRAY(inst) DT_CAT(indicator_led_dt_spec_, inst) - -#define DEFINE_CHILD_LEDS(inst) \ - static const struct led_dt_spec CHILD_LEDS_ARRAY(inst)[] = { \ - DT_FOREACH_PROP_ELEM_SEP(inst, leds, LED_DT_SPEC_GET_BY_IDX, (, )), \ - }; - -#define CHILD_CONFIG(inst) \ - { \ - .leds_len = ARRAY_SIZE(CHILD_LEDS_ARRAY(inst)), \ - .leds = CHILD_LEDS_ARRAY(inst), \ - .indicator = DT_PROP(inst, indicator), \ - .active_brightness = DT_PROP_OR(inst, active_brightness, 100), \ - .inactive_brightness = DT_PROP_OR(inst, inactive_brightness, 0), \ - .disconnected_brightness = DT_PROP_OR(inst, disconnected_brightness, 0), \ - .on_while_idle = DT_PROP_OR(inst, on_while_idle, false), \ - }, - -#define INDICATOR_LED_DEVICE(n) \ - DT_INST_FOREACH_CHILD(n, DEFINE_CHILD_LEDS) \ - \ - static const struct indicator_led_child_config indicator_led_children_##n[] = { \ - DT_INST_FOREACH_CHILD(n, CHILD_CONFIG)}; \ - \ - static const struct indicator_led_config indicator_led_config_##n = { \ - .indicators_len = ARRAY_SIZE(indicator_led_children_##n), \ - .indicators = indicator_led_children_##n, \ - }; \ - \ - static struct indicator_led_data indicator_led_data_##n = { \ - .activity_state = ZMK_ACTIVITY_ACTIVE, \ - .indicators = 0, \ - .usb_powered = true, \ - .pm_suspended = false, \ - }; \ - \ - PM_DEVICE_DT_INST_DEFINE(n, indicator_led_init_pm_action); \ - \ - DEVICE_DT_INST_DEFINE(n, &indicator_led_init, PM_DEVICE_DT_INST_GET(n), \ - &indicator_led_data_##n, &indicator_led_config_##n, POST_KERNEL, \ - CONFIG_ZMK_INDICATOR_LEDS_INIT_PRIORITY, NULL); - -DT_INST_FOREACH_STATUS_OKAY(INDICATOR_LED_DEVICE); diff --git a/app/src/keymap.c b/app/src/keymap.c index 547d6612..bda69427 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -6,44 +6,40 @@ #include #include -#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include #include #include -#include #include #include #include +#include +#if ZMK_BLE_IS_CENTRAL +#include +#endif + #include #include #include #include -static zmk_keymap_layers_state_t _zmk_keymap_layer_locks = 0; static zmk_keymap_layers_state_t _zmk_keymap_layer_state = 0; -static zmk_keymap_layer_id_t _zmk_keymap_layer_default = 0; +static uint8_t _zmk_keymap_layer_default = 0; #define DT_DRV_COMPAT zmk_keymap -#if !DT_NODE_EXISTS(DT_DRV_INST(0)) - -#error "Keymap node not found, check a keymap is available and is has compatible = "zmk,keymap" set" - -#endif +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {COND_CODE_1(DT_NODE_HAS_PROP(node, bindings), \ - (LISTIFY(DT_PROP_LEN(node, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), node)), \ - ())} + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (, ), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ { \ - .behavior_dev = DEVICE_DT_NAME(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ @@ -54,11 +50,12 @@ static zmk_keymap_layer_id_t _zmk_keymap_layer_default = 0; COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (, ), node)}), \ - ({})) + ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#define LAYER_NAME(node) DT_PROP_OR(node, display_name, DT_PROP_OR(node, label, "")) +#define LAYER_LABEL(node) \ + COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_PROP(node, label))), // State @@ -67,655 +64,164 @@ static zmk_keymap_layer_id_t _zmk_keymap_layer_default = 0; // still send the release event to the behavior in that layer also. static uint32_t zmk_keymap_active_behavior_layer[ZMK_KEYMAP_LEN]; -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -static uint8_t keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN]; - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -#define KEYMAP_VAR(_name, _opts, no_init) \ - static _opts struct zmk_behavior_binding _name[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_LEN] = { \ - COND_CODE_0(no_init, (ZMK_KEYMAP_LAYERS_FOREACH_SEP(TRANSFORMED_LAYER, (, ))), (0))}; - -KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE), (), (const)), - IS_ENABLED(CONFIG_ZMK_STUDIO)) - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -KEYMAP_VAR(zmk_stock_keymap, const, 0) - -static char zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN][CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN] = { - ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))}; - -static uint32_t changed_layer_names = 0; - -#else +static struct zmk_behavior_binding zmk_keymap[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_LEN] = { + DT_INST_FOREACH_CHILD(0, TRANSFORMED_LAYER)}; static const char *zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN] = { - ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))}; - -#endif + DT_INST_FOREACH_CHILD(0, LAYER_LABEL)}; #if ZMK_KEYMAP_HAS_SENSORS -static struct zmk_behavior_binding - zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_SENSORS_LEN] = { - DT_INST_FOREACH_CHILD_SEP(0, SENSOR_LAYER, (, ))}; +static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN] + [ZMK_KEYMAP_SENSORS_LEN] = { + DT_INST_FOREACH_CHILD(0, SENSOR_LAYER)}; #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#define ASSERT_LAYER_VAL(_layer, _fail_ret) \ - if ((_layer) >= ZMK_KEYMAP_LAYERS_LEN) { \ - return (_fail_ret); \ - } - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -uint8_t map_layer_id_to_index(zmk_keymap_layer_id_t layer_id) { - for (uint8_t i = 0; i < ZMK_KEYMAP_LAYERS_LEN; i++) { - if (keymap_layer_orders[i] == layer_id) { - return i; - } - } - - return ZMK_KEYMAP_LAYER_ID_INVAL; -} - -#define LAYER_INDEX_TO_ID(_layer) keymap_layer_orders[_layer] -#define LAYER_ID_TO_INDEX(_layer) map_layer_id_to_index(_layer) - -#else - -#define LAYER_INDEX_TO_ID(_layer) _layer -#define LAYER_ID_TO_INDEX(_layer) _layer - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -static inline int set_layer_state(zmk_keymap_layer_id_t layer_id, bool state, bool locking) { - int ret = 0; - if (layer_id >= ZMK_KEYMAP_LAYERS_LEN) { +static inline int set_layer_state(uint8_t layer, bool state) { + if (layer >= ZMK_KEYMAP_LAYERS_LEN) { return -EINVAL; } // Default layer should *always* remain active - if (layer_id == _zmk_keymap_layer_default && !state) { + if (layer == _zmk_keymap_layer_default && !state) { return 0; } - // Non-forcing disables should not change a locked active layer - if (!locking && !state && (_zmk_keymap_layer_locks & BIT(layer_id))) { - return ret; - } - zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state; - zmk_keymap_layers_state_t old_locks = _zmk_keymap_layer_locks; - WRITE_BIT(_zmk_keymap_layer_state, layer_id, state); - if (locking) { - WRITE_BIT(_zmk_keymap_layer_locks, layer_id, state); - } + WRITE_BIT(_zmk_keymap_layer_state, layer, state); // Don't send state changes unless there was an actual change - if (old_state != _zmk_keymap_layer_state || old_locks != _zmk_keymap_layer_locks) { - LOG_DBG("layer_changed: layer %d state %d locked %d", layer_id, state, locking); - - ret = raise_layer_state_changed(layer_id, state, locking); - if (ret < 0) { - LOG_WRN("Failed to raise layer state changed (%d)", ret); - } + if (old_state != _zmk_keymap_layer_state) { + LOG_DBG("layer_changed: layer %d state %d", layer, state); + ZMK_EVENT_RAISE(create_layer_state_changed(layer, state)); } - return ret; + return 0; } -zmk_keymap_layer_id_t zmk_keymap_layer_index_to_id(zmk_keymap_layer_index_t layer_index) { - ASSERT_LAYER_VAL(layer_index, UINT8_MAX); +uint8_t zmk_keymap_layer_default() { return _zmk_keymap_layer_default; } - return LAYER_INDEX_TO_ID(layer_index); -} +zmk_keymap_layers_state_t zmk_keymap_layer_state() { return _zmk_keymap_layer_state; } -zmk_keymap_layer_id_t zmk_keymap_layer_default(void) { return _zmk_keymap_layer_default; } - -zmk_keymap_layers_state_t zmk_keymap_layer_state(void) { return _zmk_keymap_layer_state; } - -zmk_keymap_layers_state_t zmk_keymap_layer_locks(void) { return _zmk_keymap_layer_locks; } - -bool zmk_keymap_layer_active_with_state(zmk_keymap_layer_id_t layer, - zmk_keymap_layers_state_t state_to_test) { +bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) { // The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody // breaks up that assumption by accident return (state_to_test & (BIT(layer))) == (BIT(layer)) || layer == _zmk_keymap_layer_default; }; -bool zmk_keymap_layer_active(zmk_keymap_layer_id_t layer) { +bool zmk_keymap_layer_active(uint8_t layer) { return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_state); }; -bool zmk_keymap_layer_locked(zmk_keymap_layer_id_t layer) { - return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_locks); -} - -zmk_keymap_layer_index_t zmk_keymap_highest_layer_active(void) { - for (int layer_idx = ZMK_KEYMAP_LAYERS_LEN - 1; - layer_idx >= LAYER_ID_TO_INDEX(_zmk_keymap_layer_default); layer_idx--) { - zmk_keymap_layer_id_t layer_id = LAYER_INDEX_TO_ID(layer_idx); - - if (layer_id == ZMK_KEYMAP_LAYER_ID_INVAL) { - continue; - } - if (zmk_keymap_layer_active(layer_id)) { - return LAYER_ID_TO_INDEX(layer_id); +uint8_t zmk_keymap_highest_layer_active() { + for (uint8_t layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer > 0; layer--) { + if (zmk_keymap_layer_active(layer)) { + return layer; } } - - return LAYER_ID_TO_INDEX(zmk_keymap_layer_default()); + return zmk_keymap_layer_default(); } -int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer, bool locking) { - return set_layer_state(layer, true, locking); -}; +int zmk_keymap_layer_activate(uint8_t layer) { return set_layer_state(layer, true); }; -int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer, bool locking) { - return set_layer_state(layer, false, locking); -}; +int zmk_keymap_layer_deactivate(uint8_t layer) { return set_layer_state(layer, false); }; -int zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer, bool locking) { - if (zmk_keymap_layer_active(layer) && (!locking || zmk_keymap_layer_locked(layer))) { - return zmk_keymap_layer_deactivate(layer, locking); +int zmk_keymap_layer_toggle(uint8_t layer) { + if (zmk_keymap_layer_active(layer)) { + return zmk_keymap_layer_deactivate(layer); } - return zmk_keymap_layer_activate(layer, locking); + return zmk_keymap_layer_activate(layer); }; -int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer, bool locking) { +int zmk_keymap_layer_to(uint8_t layer) { for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) { - zmk_keymap_layer_deactivate(i, locking); + zmk_keymap_layer_deactivate(i); } - zmk_keymap_layer_activate(layer, locking); + zmk_keymap_layer_activate(layer); return 0; } -const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer_id) { - ASSERT_LAYER_VAL(layer_id, NULL) - - return zmk_keymap_layer_names[layer_id]; +bool is_active_layer(uint8_t layer, zmk_keymap_layers_state_t layer_state) { + return (layer_state & BIT(layer)) == BIT(layer) || layer == _zmk_keymap_layer_default; } -const struct zmk_behavior_binding * -zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx) { - if (binding_idx >= ZMK_KEYMAP_LEN) { +const char *zmk_keymap_layer_label(uint8_t layer) { + if (layer >= ZMK_KEYMAP_LAYERS_LEN) { return NULL; } - ASSERT_LAYER_VAL(layer_id, NULL) - - const uint32_t *pos_map; - int ret = zmk_physical_layouts_get_selected_to_stock_position_map(&pos_map); - if (ret < 0) { - LOG_WRN("Failed to get the position map, can't find the right binding to return (%d)", ret); - return NULL; - } - - if (binding_idx >= ret) { - LOG_WRN("Can't return binding for unmapped binding index %d", binding_idx); - return NULL; - } - - uint32_t mapped_idx = pos_map[binding_idx]; - - if (mapped_idx >= ZMK_KEYMAP_LEN) { - LOG_WRN("Binding index %d mapped to an invalid key position %d", binding_idx, mapped_idx); - return NULL; - } - - return &zmk_keymap[layer_id][mapped_idx]; + return zmk_keymap_layer_names[layer]; } -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -#define PENDING_ARRAY_SIZE DIV_ROUND_UP(ZMK_KEYMAP_LEN, 8) - -static uint8_t zmk_keymap_layer_pending_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE]; - -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx, - struct zmk_behavior_binding binding) { - if (binding_idx >= ZMK_KEYMAP_LEN) { - return -EINVAL; - } - - ASSERT_LAYER_VAL(layer_id, -EINVAL) - - const uint32_t *pos_map; - int ret = zmk_physical_layouts_get_selected_to_stock_position_map(&pos_map); - if (ret < 0) { - LOG_WRN("Failed to get the mapping to determine where to set the binding (%d)", ret); - return ret; - } - - if (binding_idx >= ret) { - LOG_WRN("Unable to set binding at index %d which isn't mapped", binding_idx); - return -EINVAL; - } - - uint32_t storage_binding_idx = pos_map[binding_idx]; - - if (storage_binding_idx >= ZMK_KEYMAP_LEN) { - LOG_WRN("Can't set layer binding at unmapped/invalid index %d", binding_idx); - return -EINVAL; - } - - if (memcmp(&zmk_keymap[layer_id][storage_binding_idx], &binding, sizeof(binding)) == 0) { - LOG_DBG("Not setting, no change to layer %d at index %d (%d)", layer_id, binding_idx, - storage_binding_idx); - return 0; - } - - uint8_t *pending = zmk_keymap_layer_pending_changes[layer_id]; - - WRITE_BIT(pending[storage_binding_idx / 8], storage_binding_idx % 8, 1); - - // TODO: Need a mutex to protect access to the keymap data? - memcpy(&zmk_keymap[layer_id][storage_binding_idx], &binding, sizeof(binding)); - - return 0; -} - -#else - -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx, - struct zmk_behavior_binding binding) { - return -ENOTSUP; -} - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -static uint8_t settings_layer_orders[ZMK_KEYMAP_LAYERS_LEN]; - -#endif - -int zmk_keymap_move_layer(zmk_keymap_layer_index_t start_idx, zmk_keymap_layer_index_t dest_idx) { - ASSERT_LAYER_VAL(start_idx, -EINVAL) - ASSERT_LAYER_VAL(dest_idx, -EINVAL) - - if (start_idx == dest_idx) { - return 0; - } else if (dest_idx > start_idx) { - uint8_t val = keymap_layer_orders[start_idx]; - - for (int i = start_idx; i < dest_idx; i++) { - keymap_layer_orders[i] = keymap_layer_orders[i + 1]; - } - - keymap_layer_orders[dest_idx] = val; +int invoke_locally(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + bool pressed) { + if (pressed) { + return behavior_keymap_binding_pressed(binding, event); } else { - uint8_t val = keymap_layer_orders[start_idx]; - - for (int i = start_idx; i > dest_idx; i--) { - keymap_layer_orders[i] = keymap_layer_orders[i - 1]; - } - - keymap_layer_orders[dest_idx] = val; - } - - return 0; -} - -int zmk_keymap_add_layer(void) { - uint32_t seen_layer_ids = 0; - LOG_HEXDUMP_DBG(keymap_layer_orders, ZMK_KEYMAP_LAYERS_LEN, "Order"); - - for (int index = 0; index < ZMK_KEYMAP_LAYERS_LEN; index++) { - zmk_keymap_layer_id_t id = LAYER_INDEX_TO_ID(index); - - if (id != ZMK_KEYMAP_LAYER_ID_INVAL) { - WRITE_BIT(seen_layer_ids, id, 1); - continue; - } - - for (int candidate_id = 0; candidate_id < ZMK_KEYMAP_LAYERS_LEN; candidate_id++) { - if (!(seen_layer_ids & BIT(candidate_id))) { - keymap_layer_orders[index] = candidate_id; - return index; - } - } - } - - return -ENOSPC; -} - -int zmk_keymap_remove_layer(zmk_keymap_layer_index_t index) { - ASSERT_LAYER_VAL(index, -EINVAL); - - if (keymap_layer_orders[index] == ZMK_KEYMAP_LAYER_ID_INVAL) { - return -EINVAL; - } - - LOG_DBG("Removing layer index %d which is ID %d", index, keymap_layer_orders[index]); - LOG_HEXDUMP_DBG(keymap_layer_orders, ZMK_KEYMAP_LAYERS_LEN, "Order"); - - while (index < ZMK_KEYMAP_LAYERS_LEN - 1) { - keymap_layer_orders[index] = keymap_layer_orders[index + 1]; - index++; - } - - keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN - 1] = ZMK_KEYMAP_LAYER_ID_INVAL; - - LOG_HEXDUMP_DBG(keymap_layer_orders, ZMK_KEYMAP_LAYERS_LEN, "Order"); - - return 0; -} - -int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t at_index) { - ASSERT_LAYER_VAL(at_index, -EINVAL); - ASSERT_LAYER_VAL(id, -ENODEV); - - for (zmk_keymap_layer_index_t index = ZMK_KEYMAP_LAYERS_LEN - 1; index > at_index; index--) { - keymap_layer_orders[index] = keymap_layer_orders[index - 1]; - } - - keymap_layer_orders[at_index] = id; - - return 0; -} - -int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size) { - ASSERT_LAYER_VAL(id, -EINVAL); - - if (size >= CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN) { - return -ENOSPC; - } - - strlcpy(zmk_keymap_layer_names[id], name, CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN); - - // Ensure we properly null terminate our name if we previously had a longer one. - if (size < CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN - 1) { - zmk_keymap_layer_names[id][size] = 0; - } - - WRITE_BIT(changed_layer_names, id, 1); - - return 0; -} - -#else - -int zmk_keymap_move_layer(zmk_keymap_layer_index_t layer, zmk_keymap_layer_index_t dest) { - return -ENOTSUP; -} - -int zmk_keymap_add_layer(void) { return -ENOTSUP; } - -int zmk_keymap_remove_layer(zmk_keymap_layer_index_t index) { return -ENOTSUP; } - -int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t at_index) { - return -ENOTSUP; -} - -int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size) { - return -ENOTSUP; -} - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -#define PENDING_ARRAY_SIZE DIV_ROUND_UP(ZMK_KEYMAP_LEN, 8) - -static uint8_t zmk_keymap_layer_pending_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE]; - -struct zmk_behavior_binding_setting { - zmk_behavior_local_id_t behavior_local_id; - uint32_t param1; - uint32_t param2; -} __packed; - -int zmk_keymap_check_unsaved_changes(void) { - for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - uint8_t *pending = zmk_keymap_layer_pending_changes[l]; - for (int kp = 0; kp < ZMK_KEYMAP_LEN; kp++) { - if (pending[kp / 8] & BIT(kp % 8)) { - return 1; - } - } - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - if (settings_layer_orders[l] != keymap_layer_orders[l]) { - return 1; - } -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - } - - return 0; -} - -#define LAYER_ORDER_SETTINGS_KEY "keymap/layer_order" -#define LAYER_NAME_SETTINGS_KEY "keymap/l_n/%d" -#define LAYER_BINDING_SETTINGS_KEY "keymap/l/%d/%d" - -static int save_bindings(void) { - for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - uint8_t *pending = zmk_keymap_layer_pending_changes[l]; - - for (int kp = 0; kp < ZMK_KEYMAP_LEN; kp++) { - if (pending[kp / 8] & BIT(kp % 8)) { - - const struct zmk_behavior_binding *binding = &zmk_keymap[l][kp]; - LOG_DBG("Pending save for layer %d at key position %d: %s with %d, %d", l, kp, - binding->behavior_dev, binding->param1, binding->param2); - - struct zmk_behavior_binding_setting binding_setting = { - .behavior_local_id = zmk_behavior_get_local_id(binding->behavior_dev), - .param1 = binding->param1, - .param2 = binding->param2, - }; - - // We can skip any trailing zero params, regardless of the behavior - // and if those params are meaningful. - size_t len = sizeof(binding_setting); - if (binding_setting.param2 == 0) { - len -= 4; - - if (binding_setting.param1 == 0) { - len -= 4; - } - } - - char setting_name[20]; - sprintf(setting_name, LAYER_BINDING_SETTINGS_KEY, l, kp); - - int ret = settings_save_one(setting_name, &binding_setting, len); - if (ret < 0) { - LOG_ERR("Failed to save keymap binding at %d on layer %d (%d)", l, kp, ret); - return ret; - } - - WRITE_BIT(pending[kp / 8], kp % 8, 0); - } - } - } - - return 0; -} - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) -static int save_layer_orders(void) { - int ret = settings_save_one(LAYER_ORDER_SETTINGS_KEY, keymap_layer_orders, - ARRAY_SIZE(keymap_layer_orders)); - if (ret < 0) { - return ret; - } - - memcpy(settings_layer_orders, keymap_layer_orders, ARRAY_SIZE(keymap_layer_orders)); - return 0; -} -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -static int save_layer_names(void) { - for (int id = 0; id < ZMK_KEYMAP_LAYERS_LEN; id++) { - if (changed_layer_names & BIT(id)) { - char setting_name[14]; - sprintf(setting_name, LAYER_NAME_SETTINGS_KEY, id); - int ret = settings_save_one(setting_name, zmk_keymap_layer_names[id], - strlen(zmk_keymap_layer_names[id])); - if (ret < 0) { - return ret; - } - } - } - - changed_layer_names = 0; - return 0; -} - -int zmk_keymap_save_changes(void) { - int ret = save_bindings(); - if (ret < 0) { - return ret; - } - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - ret = save_layer_orders(); - if (ret < 0) { - return ret; - } -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - - return save_layer_names(); -} - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - -#define KEYMAP_LAYER_ORDER_INIT(n) \ - keymap_layer_orders[i] = i; \ - settings_layer_orders[i] = i; \ - i++; - -static void load_stock_keymap_layer_ordering() { - int i = 0; - DT_INST_FOREACH_CHILD_STATUS_OKAY(0, KEYMAP_LAYER_ORDER_INIT) - while (i < ZMK_KEYMAP_LAYERS_LEN) { - keymap_layer_orders[i] = ZMK_KEYMAP_LAYER_ID_INVAL; - i++; - } -} -#endif - -static void reload_from_stock_keymap(void) { - for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - for (int k = 0; k < ZMK_KEYMAP_LEN; k++) { - zmk_keymap[l][k] = zmk_stock_keymap[l][k]; - } + return behavior_keymap_binding_released(binding, event); } } -int zmk_keymap_discard_changes(void) { - load_stock_keymap_layer_ordering(); - reload_from_stock_keymap(); - - int ret = settings_load_subtree("keymap"); - if (ret >= 0) { - changed_layer_names = 0; - - for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - memset(zmk_keymap_layer_pending_changes[l], 0, PENDING_ARRAY_SIZE); - } - } - - return ret; -} - -static int keymap_track_changed_bindings(const char *key, size_t len, settings_read_cb read_cb, - void *cb_arg, void *param) { - const char *next; - if (settings_name_steq(key, "l", &next) && next) { - uint8_t(*state)[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE] = - (uint8_t(*)[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE])param; - char *endptr; - uint8_t layer = strtoul(next, &endptr, 10); - if (*endptr != '/') { - LOG_WRN("Invalid layer number: %s with endptr %s", next, endptr); - return -EINVAL; - } - - uint8_t key_position = strtoul(endptr + 1, &endptr, 10); - - if (*endptr != '\0') { - LOG_WRN("Invalid key_position number: %s with endptr %s", next, endptr); - return -EINVAL; - } - - WRITE_BIT((*state)[layer][key_position / 8], key_position % 8, 1); - } - return 0; -} - -int zmk_keymap_reset_settings(void) { - settings_delete(LAYER_ORDER_SETTINGS_KEY); - - uint8_t zmk_keymap_layer_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE]; - - settings_load_subtree_direct("keymap", keymap_track_changed_bindings, - &zmk_keymap_layer_changes); - - for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - char layer_name_setting_name[14]; - sprintf(layer_name_setting_name, LAYER_NAME_SETTINGS_KEY, l); - settings_delete(layer_name_setting_name); - - uint8_t *changes = zmk_keymap_layer_changes[l]; - - for (int k = 0; k < ZMK_KEYMAP_LEN; k++) { - if (memcmp(&zmk_keymap[l][k], &zmk_stock_keymap[l][k], - sizeof(struct zmk_behavior_binding_setting)) == 0) { - continue; - } - - if (changes[k / 8] & BIT(k % 8)) { - LOG_WRN("CLEAR %d on %d layer", k, l); - char setting_name[20]; - sprintf(setting_name, LAYER_BINDING_SETTINGS_KEY, l, k); - settings_delete(setting_name); - } - } - } - - load_stock_keymap_layer_ordering(); - - reload_from_stock_keymap(); - - return 0; -} - -#else - -int zmk_keymap_save_changes(void) { return -ENOTSUP; } - -int zmk_keymap_discard_changes(void) { return -ENOTSUP; } - -int zmk_keymap_reset_settings(void) { return -ENOTSUP; } - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -int zmk_keymap_apply_position_state(uint8_t source, zmk_keymap_layer_id_t layer_id, - uint32_t position, bool pressed, int64_t timestamp) { - const struct zmk_behavior_binding *binding = - zmk_keymap_get_layer_binding_at_idx(layer_id, position); +int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position, bool pressed, + int64_t timestamp) { + // We want to make a copy of this, since it may be converted from + // relative to absolute before being invoked + struct zmk_behavior_binding binding = zmk_keymap[layer][position]; + const struct device *behavior; struct zmk_behavior_binding_event event = { - .layer = layer_id, + .layer = layer, .position = position, .timestamp = timestamp, -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = source, -#endif }; - LOG_DBG("layer_id: %d position: %d, binding name: %s", layer_id, position, - binding->behavior_dev); + LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, binding.behavior_dev); - return zmk_behavior_invoke_binding(binding, event, pressed); + behavior = device_get_binding(binding.behavior_dev); + + if (!behavior) { + LOG_WRN("No behavior assigned to %d on layer %d", position, layer); + return 1; + } + + int err = behavior_keymap_binding_convert_central_state_dependent_params(&binding, event); + if (err) { + LOG_ERR("Failed to convert relative to absolute behavior binding (err %d)", err); + return err; + } + + enum behavior_locality locality = BEHAVIOR_LOCALITY_CENTRAL; + err = behavior_get_locality(behavior, &locality); + if (err) { + LOG_ERR("Failed to get behavior locality %d", err); + return err; + } + + switch (locality) { + case BEHAVIOR_LOCALITY_CENTRAL: + return invoke_locally(&binding, event, pressed); + case BEHAVIOR_LOCALITY_EVENT_SOURCE: +#if ZMK_BLE_IS_CENTRAL + if (source == ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL) { + return invoke_locally(&binding, event, pressed); + } else { + return zmk_split_bt_invoke_behavior(source, &binding, event, pressed); + } +#else + return invoke_locally(&binding, event, pressed); +#endif + case BEHAVIOR_LOCALITY_GLOBAL: +#if ZMK_BLE_IS_CENTRAL + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { + zmk_split_bt_invoke_behavior(i, &binding, event, pressed); + } +#endif + return invoke_locally(&binding, event, pressed); + } + + return -ENOTSUP; } int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pressed, @@ -723,19 +229,9 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr if (pressed) { zmk_keymap_active_behavior_layer[position] = _zmk_keymap_layer_state; } - - // We use int here to be sure we don't loop layer_idx back to UINT8_MAX - for (int layer_idx = ZMK_KEYMAP_LAYERS_LEN - 1; - layer_idx >= LAYER_ID_TO_INDEX(_zmk_keymap_layer_default); layer_idx--) { - zmk_keymap_layer_id_t layer_id = LAYER_INDEX_TO_ID(layer_idx); - - if (layer_id == ZMK_KEYMAP_LAYER_ID_INVAL) { - continue; - } - if (zmk_keymap_layer_active_with_state(layer_id, - zmk_keymap_active_behavior_layer[position])) { - int ret = - zmk_keymap_apply_position_state(source, layer_id, position, pressed, timestamp); + for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { + if (zmk_keymap_layer_active_with_state(layer, zmk_keymap_active_behavior_layer[position])) { + int ret = zmk_keymap_apply_position_state(source, layer, position, pressed, timestamp); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); continue; @@ -757,26 +253,20 @@ int zmk_keymap_sensor_event(uint8_t sensor_index, size_t channel_data_size, int64_t timestamp) { bool opaque_response = false; - for (int layer_idx = ZMK_KEYMAP_LAYERS_LEN - 1; layer_idx >= 0; layer_idx--) { - uint8_t layer_id = LAYER_INDEX_TO_ID(layer_idx); + for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_index]; - if (layer_id >= ZMK_KEYMAP_LAYERS_LEN) { - continue; - } + LOG_DBG("layer: %d sensor_index: %d, binding name: %s", layer, sensor_index, + binding->behavior_dev); - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer_id][sensor_index]; - - LOG_DBG("layer idx: %d, layer id: %d sensor_index: %d, binding name: %s", layer_idx, - layer_id, sensor_index, binding->behavior_dev); - - const struct device *behavior = zmk_behavior_get_binding(binding->behavior_dev); + const struct device *behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer_id); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer); continue; } struct zmk_behavior_binding_event event = { - .layer = layer_id, + .layer = layer, .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index), .timestamp = timestamp, }; @@ -793,8 +283,8 @@ int zmk_keymap_sensor_event(uint8_t sensor_index, } enum behavior_sensor_binding_process_mode mode = - (!opaque_response && layer_idx >= LAYER_ID_TO_INDEX(_zmk_keymap_layer_default) && - zmk_keymap_layer_active(layer_id)) + (!opaque_response && layer >= _zmk_keymap_layer_default && + zmk_keymap_layer_active(layer)) ? BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER : BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD; @@ -838,146 +328,3 @@ ZMK_SUBSCRIPTION(keymap, zmk_position_state_changed); #if ZMK_KEYMAP_HAS_SENSORS ZMK_SUBSCRIPTION(keymap, zmk_sensor_event); #endif /* ZMK_KEYMAP_HAS_SENSORS */ - -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -static int keymap_handle_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { - const char *next; - - LOG_DBG("Setting Keymap setting %s", name); - - if (settings_name_steq(name, "l_n", &next) && next) { - char *endptr; - zmk_keymap_layer_id_t layer = strtoul(next, &endptr, 10); - - if (*endptr != '\0') { - LOG_WRN("Invalid layer number: %s with endptr %s", next, endptr); - return -EINVAL; - } - - if (layer >= ZMK_KEYMAP_LAYERS_LEN) { - LOG_WRN("Found layer name for invalid layer ID %d", layer); - } - - int ret = read_cb(cb_arg, zmk_keymap_layer_names[layer], - MIN(len, CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN - 1)); - if (ret <= 0) { - LOG_ERR("Failed to handle keymap layer name from settings (err %d)", ret); - return ret; - } - - zmk_keymap_layer_names[layer][ret] = 0; - } else if (settings_name_steq(name, "l", &next) && next) { - char *endptr; - uint8_t layer = strtoul(next, &endptr, 10); - if (*endptr != '/') { - LOG_WRN("Invalid layer number: %s with endptr %s", next, endptr); - return -EINVAL; - } - - uint8_t key_position = strtoul(endptr + 1, &endptr, 10); - - if (*endptr != '\0') { - LOG_WRN("Invalid key_position number: %s with endptr %s", next, endptr); - return -EINVAL; - } - - if (len > sizeof(struct zmk_behavior_binding_setting)) { - LOG_ERR("Too large binding setting size (got %d expected %d)", len, - sizeof(struct zmk_behavior_binding_setting)); - return -EINVAL; - } - - if (layer >= ZMK_KEYMAP_LAYERS_LEN) { - LOG_WRN("Layer %d is larger than max of %d", layer, ZMK_KEYMAP_LAYERS_LEN); - return -EINVAL; - } - - if (key_position >= ZMK_KEYMAP_LEN) { - LOG_WRN("Key position %d is larger than max of %d", key_position, ZMK_KEYMAP_LEN); - return -EINVAL; - } - - struct zmk_behavior_binding_setting binding_setting = {0}; - int err = read_cb(cb_arg, &binding_setting, len); - if (err <= 0) { - LOG_ERR("Failed to handle keymap binding from settings (err %d)", err); - return err; - } - - const char *name = - zmk_behavior_find_behavior_name_from_local_id(binding_setting.behavior_local_id); - - if (!name) { - LOG_WRN("Loaded device %d from settings but no device found by that local ID", - binding_setting.behavior_local_id); - } - - zmk_keymap[layer][key_position] = (struct zmk_behavior_binding){ -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS) - .local_id = binding_setting.behavior_local_id, -#endif - .behavior_dev = name, - .param1 = binding_setting.param1, - .param2 = binding_setting.param2, - }; - } -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - else if (settings_name_steq(name, "layer_order", &next) && !next) { - int err = - read_cb(cb_arg, settings_layer_orders, MIN(len, ARRAY_SIZE(settings_layer_orders))); - if (err <= 0) { - LOG_ERR("Failed to handle keymap layer orders from settings (err %d)", err); - return err; - } - - LOG_HEXDUMP_DBG(settings_layer_orders, ARRAY_SIZE(settings_layer_orders), - "Settings Layer Order"); - - memcpy(keymap_layer_orders, settings_layer_orders, - MIN(len, ARRAY_SIZE(settings_layer_orders))); - } -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - - return 0; -}; - -static int keymap_handle_commit(void) { -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS) - for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - for (int p = 0; p < ZMK_KEYMAP_LEN; p++) { - struct zmk_behavior_binding *binding = &zmk_keymap[l][p]; - - if (binding->local_id > 0 && !binding->behavior_dev) { - binding->behavior_dev = - zmk_behavior_find_behavior_name_from_local_id(binding->local_id); - - if (!binding->behavior_dev) { - LOG_ERR("Failed to finding device for local ID %d after settings load", - binding->local_id); - } - } - } - } -#endif - - return 0; -} - -SETTINGS_STATIC_HANDLER_DEFINE(keymap, "keymap", NULL, keymap_handle_set, keymap_handle_commit, - NULL); - -#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) - -int keymap_init(void) { -#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) - load_stock_keymap_layer_ordering(); -#endif -#if IS_ENABLED(CONFIG_ZMK_STUDIO) - reload_from_stock_keymap(); -#endif - - return 0; -} - -SYS_INIT(keymap_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/src/kscan.c b/app/src/kscan.c new file mode 100644 index 00000000..62d0cf07 --- /dev/null +++ b/app/src/kscan.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include +#include + +#define ZMK_KSCAN_EVENT_STATE_PRESSED 0 +#define ZMK_KSCAN_EVENT_STATE_RELEASED 1 + +struct zmk_kscan_event { + uint32_t row; + uint32_t column; + uint32_t state; +}; + +struct zmk_kscan_msg_processor { + struct k_work work; +} msg_processor; + +K_MSGQ_DEFINE(zmk_kscan_msgq, sizeof(struct zmk_kscan_event), CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE, 4); + +static void zmk_kscan_callback(const struct device *dev, uint32_t row, uint32_t column, + bool pressed) { + struct zmk_kscan_event ev = { + .row = row, + .column = column, + .state = (pressed ? ZMK_KSCAN_EVENT_STATE_PRESSED : ZMK_KSCAN_EVENT_STATE_RELEASED)}; + + k_msgq_put(&zmk_kscan_msgq, &ev, K_NO_WAIT); + k_work_submit(&msg_processor.work); +} + +void zmk_kscan_process_msgq(struct k_work *item) { + struct zmk_kscan_event ev; + + while (k_msgq_get(&zmk_kscan_msgq, &ev, K_NO_WAIT) == 0) { + bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); + int32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + + if (position < 0) { + LOG_WRN("Not found in transform: row: %d, col: %d, pressed: %s", ev.row, ev.column, + (pressed ? "true" : "false")); + continue; + } + + LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s", ev.row, ev.column, position, + (pressed ? "true" : "false")); + ZMK_EVENT_RAISE(new_zmk_position_state_changed( + (struct zmk_position_state_changed){.source = ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, + .state = pressed, + .position = position, + .timestamp = k_uptime_get()})); + } +} + +int zmk_kscan_init(const struct device *dev) { + if (dev == NULL) { + LOG_ERR("Failed to get the KSCAN device"); + return -EINVAL; + } + + k_work_init(&msg_processor.work, zmk_kscan_process_msgq); + + kscan_config(dev, zmk_kscan_callback); + kscan_enable_callback(dev); + + return 0; +} diff --git a/app/src/kscan_sideband_behaviors.c b/app/src/kscan_sideband_behaviors.c deleted file mode 100644 index eab7f043..00000000 --- a/app/src/kscan_sideband_behaviors.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_kscan_sideband_behaviors - -#include -#include -#include -#include -#include - -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct ksbb_entry { - struct zmk_behavior_binding binding; - uint8_t row; - uint8_t column; -}; - -struct ksbb_config { - const struct device *kscan; - bool auto_enable; - struct ksbb_entry *entries; - size_t entries_len; -}; - -struct ksbb_data { - kscan_callback_t callback; - bool enabled; -}; - -#define GET_KSBB_DEV(n) DEVICE_DT_GET(DT_DRV_INST(n)), - -// The kscan callback has no context with it, so we keep a static array of all possible -// KSBBs to check when a kscan callback from the "wrapped" inner kscan fires. -static const struct device *ksbbs[] = {DT_INST_FOREACH_STATUS_OKAY(GET_KSBB_DEV)}; - -const struct device *find_ksbb_for_inner(const struct device *inner_dev) { - for (int i = 0; i < ARRAY_SIZE(ksbbs); i++) { - const struct device *ksbb = ksbbs[i]; - const struct ksbb_config *cfg = ksbb->config; - - if (cfg->kscan == inner_dev) { - return ksbb; - } - } - - return NULL; -} - -struct ksbb_entry *find_sideband_behavior(const struct device *dev, uint32_t row, uint32_t column) { - const struct ksbb_config *cfg = dev->config; - - for (int e = 0; e < cfg->entries_len; e++) { - struct ksbb_entry *candidate = &cfg->entries[e]; - - if (candidate->row == row && candidate->column == column) { - return candidate; - } - } - - return NULL; -} - -void ksbb_inner_kscan_callback(const struct device *dev, uint32_t row, uint32_t column, - bool pressed) { - const struct device *ksbb = find_ksbb_for_inner(dev); - if (ksbb) { - struct ksbb_data *data = ksbb->data; - - struct ksbb_entry *entry = find_sideband_behavior(ksbb, row, column); - if (entry) { - struct zmk_behavior_binding_event event = {.position = INT32_MAX, - .timestamp = k_uptime_get()}; - - if (pressed) { - behavior_keymap_binding_pressed(&entry->binding, event); - } else { - behavior_keymap_binding_released(&entry->binding, event); - } - } - - if (data->enabled && data->callback) { - data->callback(ksbb, row, column, pressed); - } - } -} - -static int ksbb_configure(const struct device *dev, kscan_callback_t callback) { - struct ksbb_data *data = dev->data; - - data->callback = callback; - - return 0; -} - -static int ksbb_enable(const struct device *dev) { - struct ksbb_data *data = dev->data; - const struct ksbb_config *config = dev->config; - data->enabled = true; - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - if (!pm_device_runtime_is_enabled(dev) && pm_device_runtime_is_enabled(config->kscan)) { - pm_device_runtime_get(config->kscan); - } -#elif IS_ENABLED(CONFIG_PM_DEVICE) - if (pm_device_wakeup_is_capable(config->kscan)) { - pm_device_wakeup_enable(config->kscan, true); - } - pm_device_action_run(config->kscan, PM_DEVICE_ACTION_RESUME); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - - kscan_config(config->kscan, &ksbb_inner_kscan_callback); - kscan_enable_callback(config->kscan); - - return 0; -} - -static int ksbb_disable(const struct device *dev) { - struct ksbb_data *data = dev->data; - const struct ksbb_config *config = dev->config; - data->enabled = false; - - kscan_disable_callback(config->kscan); - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - if (!pm_device_runtime_is_enabled(dev) && pm_device_runtime_is_enabled(config->kscan)) { - pm_device_runtime_put(config->kscan); - } -#elif IS_ENABLED(CONFIG_PM_DEVICE) - if (pm_device_wakeup_is_capable(config->kscan) && !pm_device_wakeup_is_enabled(dev) && - pm_device_wakeup_is_enabled(config->kscan)) { - pm_device_wakeup_enable(config->kscan, false); - } - pm_device_action_run(config->kscan, PM_DEVICE_ACTION_SUSPEND); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - - return 0; -} - -#if IS_ENABLED(CONFIG_PM_DEVICE) - -static int ksbb_pm_action(const struct device *dev, enum pm_device_action action) { - switch (action) { - case PM_DEVICE_ACTION_SUSPEND: - return ksbb_disable(dev); - case PM_DEVICE_ACTION_RESUME: - return ksbb_enable(dev); - default: - return -ENOTSUP; - } -} - -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -static int ksbb_init(const struct device *dev) { - const struct ksbb_config *config = dev->config; - - if (!device_is_ready(config->kscan)) { - LOG_ERR("kscan %s is not ready", config->kscan->name); - return -ENODEV; - } - -#if IS_ENABLED(CONFIG_PM_DEVICE) - if (!config->auto_enable) { - pm_device_init_suspended(dev); - } -#endif - - return 0; -} - -static const struct kscan_driver_api ksbb_api = { - .config = ksbb_configure, - .enable_callback = ksbb_enable, - .disable_callback = ksbb_disable, -}; - -#define ENTRY(e) \ - { \ - .row = DT_PROP(e, row), \ - .column = DT_PROP(e, column), \ - .binding = ZMK_KEYMAP_EXTRACT_BINDING(0, e), \ - } - -#define KSBB_INST(n) \ - COND_CODE_1(DT_INST_PROP_OR(n, auto_enable, false), (static int ksbb_auto_enable_##n(void) { \ - const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(n)); \ - COND_CODE_1(IS_ENABLED(CONFIG_PM_DEVICE), \ - (ksbb_pm_action(dev, PM_DEVICE_ACTION_RESUME);), \ - (const struct ksbb_config *config = dev->config; \ - kscan_config(config->kscan, &ksbb_inner_kscan_callback); \ - kscan_enable_callback(config->kscan);)) \ - return 0; \ - } SYS_INIT(ksbb_auto_enable_##n, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);), \ - ()) \ - static struct ksbb_entry entries_##n[] = { \ - DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(n, ENTRY, (, ))}; \ - const struct ksbb_config ksbb_config_##n = { \ - .kscan = DEVICE_DT_GET(DT_INST_PHANDLE(n, kscan)), \ - .auto_enable = DT_INST_PROP_OR(n, auto_enable, false), \ - .entries = entries_##n, \ - .entries_len = ARRAY_SIZE(entries_##n), \ - }; \ - struct ksbb_data ksbb_data_##n = {}; \ - PM_DEVICE_DT_INST_DEFINE(n, ksbb_pm_action); \ - DEVICE_DT_INST_DEFINE(n, ksbb_init, PM_DEVICE_DT_INST_GET(n), &ksbb_data_##n, \ - &ksbb_config_##n, POST_KERNEL, \ - CONFIG_ZMK_KSCAN_SIDEBAND_BEHAVIORS_INIT_PRIORITY, &ksbb_api); - -DT_INST_FOREACH_STATUS_OKAY(KSBB_INST) diff --git a/app/src/main.c b/app/src/main.c index 0f77382a..3fd6b116 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -12,34 +12,19 @@ #include LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); -#if IS_ENABLED(CONFIG_ZMK_DISPLAY) - +#include +#include #include -#include +#include -#endif - -int main(void) { +void main(void) { LOG_INF("Welcome to ZMK!\n"); -#if IS_ENABLED(CONFIG_SETTINGS) - settings_subsys_init(); - settings_load(); -#endif + if (zmk_kscan_init(DEVICE_DT_GET(ZMK_MATRIX_NODE_ID)) != 0) { + return; + } #ifdef CONFIG_ZMK_DISPLAY zmk_display_init(); - -#if IS_ENABLED(CONFIG_ARCH_POSIX) - // Workaround for an SDL display issue: - // https://github.com/zephyrproject-rtos/zephyr/issues/71410 - while (1) { - lv_task_handler(); - k_sleep(K_MSEC(10)); - } -#endif - #endif /* CONFIG_ZMK_DISPLAY */ - - return 0; } diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 97ab0efe..6c616d5e 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -4,23 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include #include -#include #include #include #include -#define DT_DRV_COMPAT zmk_matrix_transform - -struct zmk_matrix_transform { - uint32_t const *lookup_table; - size_t len; - uint8_t rows; - uint8_t columns; - uint8_t col_offset; - uint8_t row_offset; -}; +#ifdef ZMK_KEYMAP_TRANSFORM_NODE /* the transform in the device tree is a list of (row,column) pairs that is * indexed by by the keymap position of that key. We want to invert this in @@ -39,58 +28,38 @@ struct zmk_matrix_transform { #define INDEX_OFFSET 1 -#if DT_HAS_COMPAT_STATUS_OKAY(zmk_matrix_transform) +#define TRANSFORM_ENTRY(i, _) \ + [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i + INDEX_OFFSET -#define TRANSFORM_LOOKUP_ENTRY(i, n) \ - [(KT_ROW(DT_INST_PROP_BY_IDX(n, map, i)) * DT_INST_PROP(n, columns)) + \ - KT_COL(DT_INST_PROP_BY_IDX(n, map, i))] = i + INDEX_OFFSET +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, TRANSFORM_ENTRY, (, ), 0)}; -#define MATRIX_TRANSFORM_INIT(n) \ - static const uint32_t _CONCAT(zmk_transform_lookup_table_, n)[] = { \ - LISTIFY(DT_INST_PROP_LEN(n, map), TRANSFORM_LOOKUP_ENTRY, (, ), n)}; \ - const struct zmk_matrix_transform _CONCAT(zmk_matrix_transform_, DT_DRV_INST(n)) = { \ - .rows = DT_INST_PROP(n, rows), \ - .columns = DT_INST_PROP(n, columns), \ - .col_offset = DT_INST_PROP(n, col_offset), \ - .row_offset = DT_INST_PROP(n, row_offset), \ - .lookup_table = _CONCAT(zmk_transform_lookup_table_, n), \ - .len = ARRAY_SIZE(_CONCAT(zmk_transform_lookup_table_, n)), \ - }; +#endif -DT_INST_FOREACH_STATUS_OKAY(MATRIX_TRANSFORM_INIT); +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { +#if DT_NODE_HAS_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset) + column += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset); +#endif -#elif DT_HAS_CHOSEN(zmk_kscan) && defined(ZMK_MATRIX_COLS) && defined(ZMK_MATRIX_ROWS) +#if DT_NODE_HAS_PROP(ZMK_KEYMAP_TRANSFORM_NODE, row_offset) + row += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, row_offset); +#endif -const struct zmk_matrix_transform zmk_matrix_transform_default = { - .rows = ZMK_MATRIX_ROWS, - .columns = ZMK_MATRIX_COLS, - .len = ZMK_KEYMAP_LEN, -}; + const uint32_t matrix_index = (row * ZMK_MATRIX_COLS) + column; +#ifdef ZMK_KEYMAP_TRANSFORM_NODE + if (matrix_index >= ARRAY_SIZE(transform)) { + return -EINVAL; + } + + const uint32_t value = transform[matrix_index]; + + if (!value) { + return -EINVAL; + } + + return value - INDEX_OFFSET; #else - -#error "Need a matrix transform or compatible kscan selected to determine keymap size!" -` -#endif // DT_HAS_COMPAT_STATUS_OKAY(zmk_matrix_transform) - -int32_t zmk_matrix_transform_row_column_to_position(zmk_matrix_transform_t mt, uint32_t row, - uint32_t column) { - column += mt->col_offset; - row += mt->row_offset; - - if (!mt->lookup_table) { - return (row * mt->columns) + column; - } - - uint16_t lookup_index = ((row * mt->columns) + column); - if (lookup_index >= mt->len) { - return -EINVAL; - } - - int32_t val = mt->lookup_table[lookup_index]; - if (val == 0) { - return -EINVAL; - } - - return val - INDEX_OFFSET; -}; \ No newline at end of file + return matrix_index; +#endif /* ZMK_KEYMAP_TRANSFORM_NODE */ +}; diff --git a/app/src/physical_layouts.c b/app/src/physical_layouts.c deleted file mode 100644 index ba21ae31..00000000 --- a/app/src/physical_layouts.c +++ /dev/null @@ -1,573 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include - -#if IS_ENABLED(CONFIG_SETTINGS) -#include -#endif - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include -#include -#include - -ZMK_EVENT_IMPL(zmk_physical_layout_selection_changed); - -#define DT_DRV_COMPAT zmk_physical_layout - -#define MATRIX_INPUT_SUPPORT \ - UTIL_AND(IS_ENABLED(CONFIG_INPUT), \ - UTIL_OR(DT_ANY_INST_HAS_PROP_STATUS_OKAY(input), DT_HAS_CHOSEN(zmk_matrix_input))) - -#if MATRIX_INPUT_SUPPORT - -static void zmk_physical_layout_input_event_cb(struct input_event *evt, void *user_data); - -#endif - -#define USE_PHY_LAYOUTS \ - (DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) && !DT_HAS_CHOSEN(zmk_matrix_transform)) - -BUILD_ASSERT( - !IS_ENABLED(CONFIG_ZMK_STUDIO) || USE_PHY_LAYOUTS, - "ISSUE FOUND: Keyboards require additional configuration to allow for firmware with ZMK " - "Studio enabled. You have attempted to build a keyboard lacking such configuration. Please see " - "https://zmk.dev/docs/features/studio#adding-zmk-studio-support-to-a-keyboard for " - "more information on how to resolve this error, or contact the maintainer of your keyboard's " - "firmware for assistance."); - -#if USE_PHY_LAYOUTS - -#define ZKPA_INIT(i, n) \ - (const struct zmk_key_physical_attrs) { \ - .width = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, width), \ - .height = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, height), \ - .x = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, x), \ - .y = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, y), \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_PHYSICAL_LAYOUT_KEY_ROTATION), \ - (.rx = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, rx), \ - .ry = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, ry), \ - .r = (int16_t)(int32_t)DT_INST_PHA_BY_IDX(n, keys, i, r), ), \ - ()) \ - } - -#define INPUT_FOR_INST(n) \ - DEVICE_DT_GET(COND_CODE_1(DT_INST_PROP_LEN(n, input), (DT_INST_PHANDLE(n, input)), \ - (DT_CHOSEN(zmk_matrix_input)))) - -#define ZMK_LAYOUT_INST(n) \ - BUILD_ASSERT(!IS_ENABLED(CONFIG_ZMK_STUDIO) || DT_INST_NODE_HAS_PROP(n, keys), \ - "ZMK Studio requires physical layouts with key positions. See " \ - "https://zmk.dev/docs/hardware-integration/studio-setup"); \ - static const struct zmk_key_physical_attrs _CONCAT(_zmk_physical_layout_keys_, \ - n)[DT_INST_PROP_LEN_OR(n, keys, 0)] = { \ - LISTIFY(DT_INST_PROP_LEN_OR(n, keys, 0), ZKPA_INIT, (, ), n)}; \ - ZMK_MATRIX_TRANSFORM_EXTERN(DT_INST_PHANDLE(n, transform)); \ - static const struct zmk_physical_layout _CONCAT(_zmk_physical_layout_, DT_DRV_INST(n)) = { \ - .display_name = DT_INST_PROP_OR(n, display_name, "Layout #" #n), \ - .matrix_transform = ZMK_MATRIX_TRANSFORM_T_FOR_NODE(DT_INST_PHANDLE(n, transform)), \ - .keys = _CONCAT(_zmk_physical_layout_keys_, n), \ - .keys_len = DT_INST_PROP_LEN_OR(n, keys, 0), \ - COND_CODE_1(UTIL_AND(MATRIX_INPUT_SUPPORT, DT_INST_PROP_LEN(n, input)), \ - (.input = INPUT_FOR_INST(n)), ()) \ - COND_CODE_1(UTIL_OR(DT_HAS_CHOSEN(zmk_kscan), DT_INST_PROP_LEN(n, kscan)), \ - (.kscan = DEVICE_DT_GET(COND_CODE_1(DT_INST_PROP_LEN(n, kscan), \ - (DT_INST_PHANDLE(n, kscan)), \ - (DT_CHOSEN(zmk_kscan))))), \ - ())}; \ - COND_CODE_1( \ - UTIL_AND(MATRIX_INPUT_SUPPORT, DT_INST_PROP_LEN(n, input)), \ - (INPUT_CALLBACK_DEFINE(INPUT_FOR_INST(n), zmk_physical_layout_input_event_cb, \ - (void *)&(_CONCAT(_zmk_physical_layout_, DT_DRV_INST(n))));), \ - ()) - -DT_INST_FOREACH_STATUS_OKAY(ZMK_LAYOUT_INST) - -#define POS_MAP_COMPAT zmk_physical_layout_position_map -#define HAVE_POS_MAP DT_HAS_COMPAT_STATUS_OKAY(POS_MAP_COMPAT) - -#define POS_MAP_COMPLETE (HAVE_POS_MAP && DT_PROP(DT_INST(0, POS_MAP_COMPAT), complete)) - -#if HAVE_POS_MAP - -// Using sizeof + union trick to calculate the "positions" length statically. -#define ZMK_POS_MAP_POSITIONS_ARRAY(node_id) \ - uint8_t _CONCAT(prop_, node_id)[DT_PROP_LEN(node_id, positions)]; - -#define ZMK_POS_MAP_LEN \ - sizeof(union {DT_FOREACH_CHILD(DT_INST(0, POS_MAP_COMPAT), ZMK_POS_MAP_POSITIONS_ARRAY)}) - -struct position_map_entry { - const struct zmk_physical_layout *layout; - const uint32_t positions[ZMK_POS_MAP_LEN]; -}; - -#define ZMK_POS_MAP_LEN_CHECK(node_id) \ - BUILD_ASSERT(ZMK_POS_MAP_LEN == DT_PROP_LEN(node_id, positions), \ - "Position maps must all have the same number of entries") - -DT_FOREACH_CHILD_SEP(DT_INST(0, POS_MAP_COMPAT), ZMK_POS_MAP_LEN_CHECK, (;)); - -#define ZMK_POS_MAP_ENTRY(node_id) \ - { \ - .layout = COND_CODE_1( \ - UTIL_AND(DT_NODE_HAS_COMPAT(DT_PHANDLE(node_id, physical_layout), DT_DRV_COMPAT), \ - DT_NODE_HAS_STATUS(DT_PHANDLE(node_id, physical_layout), okay)), \ - (&_CONCAT(_zmk_physical_layout_, DT_PHANDLE(node_id, physical_layout))), (NULL)), \ - .positions = DT_PROP(node_id, positions), \ - } - -static const struct position_map_entry positions_maps[] = { - DT_FOREACH_CHILD_SEP(DT_INST(0, POS_MAP_COMPAT), ZMK_POS_MAP_ENTRY, (, ))}; - -#endif - -#define ZMK_LAYOUT_REF(n) &_CONCAT(_zmk_physical_layout_, DT_DRV_INST(n)), - -static const struct zmk_physical_layout *const layouts[] = { - DT_INST_FOREACH_STATUS_OKAY(ZMK_LAYOUT_REF)}; - -#elif DT_HAS_CHOSEN(zmk_matrix_transform) - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -#warning \ - "Ignoring the physical layouts and using the chosen matrix transform. Consider setting a chosen physical layout instead." - -#endif - -ZMK_MATRIX_TRANSFORM_EXTERN(DT_CHOSEN(zmk_matrix_transform)); - -static const struct zmk_physical_layout _CONCAT(_zmk_physical_layout_, chosen) = { - .display_name = "Default", - .matrix_transform = ZMK_MATRIX_TRANSFORM_T_FOR_NODE(DT_CHOSEN(zmk_matrix_transform)), - COND_CODE_1(DT_HAS_CHOSEN(zmk_kscan), (.kscan = DEVICE_DT_GET(DT_CHOSEN(zmk_kscan)), ), ())}; - -static const struct zmk_physical_layout *const layouts[] = { - &_CONCAT(_zmk_physical_layout_, chosen)}; - -#elif UTIL_OR(DT_HAS_CHOSEN(zmk_kscan), DT_HAS_CHOSEN(zmk_matrix_input)) - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -#warning \ - "Ignoring the physical layouts and using the chosen kscan/matrix-input with a synthetic transform. Consider setting a chosen physical layout instead." - -#endif - -ZMK_MATRIX_TRANSFORM_DEFAULT_EXTERN(); -static const struct zmk_physical_layout _CONCAT(_zmk_physical_layout_, chosen) = { - .display_name = "Default", - .matrix_transform = &zmk_matrix_transform_default, -#if DT_HAS_CHOSEN(zmk_matrix_input) - .input = DEVICE_DT_GET(DT_CHOSEN(zmk_matrix_input)), -#elif DT_HAS_CHOSEN(zmk_kscan) - .kscan = DEVICE_DT_GET(DT_CHOSEN(zmk_kscan)), -#endif -}; - -#if DT_HAS_CHOSEN(zmk_matrix_input) -INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_CHOSEN(zmk_matrix_input)), - zmk_physical_layout_input_event_cb, - (void *)&(_CONCAT(_zmk_physical_layout_, chosen))); -#endif - -static const struct zmk_physical_layout *const layouts[] = { - &_CONCAT(_zmk_physical_layout_, chosen)}; - -#endif - -const struct zmk_physical_layout *active; - -size_t zmk_physical_layouts_get_list(struct zmk_physical_layout const *const **dest_layouts) { - *dest_layouts = &layouts[0]; - - return ARRAY_SIZE(layouts); -} - -#define ZMK_KSCAN_EVENT_STATE_PRESSED 0 -#define ZMK_KSCAN_EVENT_STATE_RELEASED 1 - -struct zmk_kscan_event { - uint32_t row; - uint32_t column; - uint32_t state; -}; - -static struct zmk_kscan_msg_processor { - struct k_work work; -} msg_processor; - -K_MSGQ_DEFINE(physical_layouts_kscan_msgq, sizeof(struct zmk_kscan_event), - CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE, 4); - -#if MATRIX_INPUT_SUPPORT - -static struct zmk_kscan_event pending_input_event; - -static void zmk_physical_layout_input_event_cb(struct input_event *evt, void *user_data) { - const struct zmk_physical_layout *layout = (const struct zmk_physical_layout *)user_data; - if (layout != active) { - LOG_WRN("Ignoring input event from non-active layout"); - return; - } - - switch (evt->type) { - case INPUT_EV_ABS: - switch (evt->code) { - case INPUT_ABS_X: - pending_input_event.column = evt->value; - break; - case INPUT_ABS_Y: - pending_input_event.row = evt->value; - break; - default: - LOG_WRN("Unknown abs code"); - return; - } - break; - case INPUT_EV_KEY: - switch (evt->code) { - case INPUT_BTN_TOUCH: - pending_input_event.state = - (evt->value ? ZMK_KSCAN_EVENT_STATE_PRESSED : ZMK_KSCAN_EVENT_STATE_RELEASED); - break; - default: - LOG_WRN("Unknown key code"); - return; - } - break; - default: - LOG_WRN("Unknown type"); - return; - } - - if (evt->sync) { - k_msgq_put(&physical_layouts_kscan_msgq, &pending_input_event, K_NO_WAIT); - k_work_submit(&msg_processor.work); - } -} - -#endif - -static void zmk_physical_layout_kscan_callback(const struct device *dev, uint32_t row, - uint32_t column, bool pressed) { - if (dev != active->kscan) { - return; - } - - struct zmk_kscan_event ev = { - .row = row, - .column = column, - .state = (pressed ? ZMK_KSCAN_EVENT_STATE_PRESSED : ZMK_KSCAN_EVENT_STATE_RELEASED)}; - - k_msgq_put(&physical_layouts_kscan_msgq, &ev, K_NO_WAIT); - k_work_submit(&msg_processor.work); -} - -static void zmk_physical_layouts_kscan_process_msgq(struct k_work *item) { - struct zmk_kscan_event ev; - - while (k_msgq_get(&physical_layouts_kscan_msgq, &ev, K_NO_WAIT) == 0) { - bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); - int32_t position = zmk_matrix_transform_row_column_to_position(active->matrix_transform, - ev.row, ev.column); - - if (position < 0) { - LOG_WRN("Not found in transform: row: %d, col: %d, pressed: %s", ev.row, ev.column, - (pressed ? "true" : "false")); - continue; - } - - LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s", ev.row, ev.column, position, - (pressed ? "true" : "false")); - raise_zmk_position_state_changed( - (struct zmk_position_state_changed){.source = ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, - .state = pressed, - .position = position, - .timestamp = k_uptime_get()}); - } -} - -static const struct zmk_physical_layout *get_default_layout(void) { - const struct zmk_physical_layout *initial; - -#if USE_PHY_LAYOUTS && DT_HAS_CHOSEN(zmk_physical_layout) - initial = &_CONCAT(_zmk_physical_layout_, DT_CHOSEN(zmk_physical_layout)); -#else - initial = layouts[0]; -#endif - - return initial; -} - -static int get_index_of_layout(const struct zmk_physical_layout *layout) { - for (int i = 0; i < ARRAY_SIZE(layouts); i++) { - if (layouts[i] == layout) { - return i; - } - } - - return -ENODEV; -} - -static uint32_t selected_to_stock_map[ZMK_KEYMAP_LEN]; - -int zmk_physical_layouts_get_selected_to_stock_position_map(uint32_t const **map) { - *map = selected_to_stock_map; - return ZMK_KEYMAP_LEN; -} - -int zmk_physical_layouts_select_layout(const struct zmk_physical_layout *dest_layout) { - if (!dest_layout) { - return -ENODEV; - } - - if (dest_layout == active) { - return 0; - } - - if (active) { - if (active->kscan) { - kscan_disable_callback(active->kscan); -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_put(active->kscan); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(active->kscan, PM_DEVICE_ACTION_SUSPEND); -#endif - } - } - - int new_idx = get_index_of_layout(dest_layout); - int stock_idx = get_index_of_layout(get_default_layout()); - int ret = zmk_physical_layouts_get_position_map(stock_idx, new_idx, ZMK_KEYMAP_LEN, - selected_to_stock_map); - if (ret < 0) { - LOG_ERR("Failed to refresh the selected to stock mapping (%d)", ret); - return ret; - } - - active = dest_layout; - - if (active->kscan) { -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - int err = pm_device_runtime_get(active->kscan); - if (err < 0) { - LOG_WRN("PM runtime get of kscan device to enable it %d", err); - return err; - } -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(active->kscan, PM_DEVICE_ACTION_RESUME); -#endif - kscan_config(active->kscan, zmk_physical_layout_kscan_callback); - kscan_enable_callback(active->kscan); - } - - return 0; -} - -int zmk_physical_layouts_select(uint8_t index) { - if (index >= ARRAY_SIZE(layouts)) { - return -EINVAL; - } - - int ret = zmk_physical_layouts_select_layout(layouts[index]); - - if (ret >= 0) { - raise_zmk_physical_layout_selection_changed( - (struct zmk_physical_layout_selection_changed){.selection = index}); - } - - return ret; -} - -int zmk_physical_layouts_get_selected(void) { - for (int i = 0; i < ARRAY_SIZE(layouts); i++) { - if (layouts[i] == active) { - return i; - } - } - - return -ENODEV; -} - -#if IS_ENABLED(CONFIG_SETTINGS) - -static int8_t saved_selected_index = -1; - -#endif - -int zmk_physical_layouts_select_initial(void) { - int ret = zmk_physical_layouts_select_layout(get_default_layout()); - - return ret; -} - -int zmk_physical_layouts_check_unsaved_selection(void) { -#if IS_ENABLED(CONFIG_SETTINGS) - return saved_selected_index < 0 || - saved_selected_index == (uint8_t)zmk_physical_layouts_get_selected() - ? 0 - : 1; -#else - return -ENOTSUP; -#endif -} - -int zmk_physical_layouts_save_selected(void) { -#if IS_ENABLED(CONFIG_SETTINGS) - uint8_t val = (uint8_t)zmk_physical_layouts_get_selected(); - - return settings_save_one("physical_layouts/selected", &val, sizeof(val)); -#else - return -ENOTSUP; -#endif -} - -int zmk_physical_layouts_revert_selected(void) { return zmk_physical_layouts_select_initial(); } - -int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, size_t map_size, - uint32_t map[map_size]) { - if (source >= ARRAY_SIZE(layouts) || dest >= ARRAY_SIZE(layouts)) { - return -EINVAL; - } - - if (source == dest) { - for (int i = 0; i < map_size; i++) { - map[i] = i; - } - - return 0; - } - - const struct zmk_physical_layout *src_layout = layouts[source]; - const struct zmk_physical_layout *dest_layout = layouts[dest]; - int max_kp = dest_layout->keys_len; - -#if HAVE_POS_MAP - const struct position_map_entry *src_pos_map = NULL; - const struct position_map_entry *dest_pos_map = NULL; - - for (int pm = 0; pm < ARRAY_SIZE(positions_maps); pm++) { - if (positions_maps[pm].layout == src_layout) { - src_pos_map = &positions_maps[pm]; - } - - if (positions_maps[pm].layout == dest_layout) { - dest_pos_map = &positions_maps[pm]; - } - } - - // Maps can place items "off the end" of other layouts so they are - // preserved but not visible, so adjust our max here if that is being used. - if (src_pos_map && dest_pos_map) { - for (int mp = 0; mp < ZMK_POS_MAP_LEN; mp++) { - max_kp = - MAX(max_kp, MAX(src_pos_map->positions[mp] + 1, dest_pos_map->positions[mp] + 1)); - } - } -#endif - - if (map_size < max_kp) { - return -EINVAL; - } - - memset(map, UINT32_MAX, map_size); - - for (int b = 0; b < max_kp; b++) { - bool found = false; - -#if HAVE_POS_MAP - if (src_pos_map && dest_pos_map) { - for (int m = 0; m < ZMK_POS_MAP_LEN; m++) { - if (dest_pos_map->positions[m] == b) { - map[b] = src_pos_map->positions[m]; - found = true; - break; - } - } - } -#endif - -#if !POS_MAP_COMPLETE - if (!found) { - const struct zmk_key_physical_attrs *key = &dest_layout->keys[b]; - for (int old_b = 0; old_b < src_layout->keys_len; old_b++) { - const struct zmk_key_physical_attrs *candidate_key = &src_layout->keys[old_b]; - - if (candidate_key->x == key->x && candidate_key->y == key->y) { - map[b] = old_b; - found = true; - break; - } - } - } -#endif - } - - return max_kp; -} - -#if IS_ENABLED(CONFIG_SETTINGS) - -static int physical_layouts_handle_set(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { - const char *next; - - if (settings_name_steq(name, "selected", &next) && !next) { - if (len != sizeof(saved_selected_index)) { - return -EINVAL; - } - - int err = read_cb(cb_arg, &saved_selected_index, len); - if (err <= 0) { - LOG_ERR("Failed to handle selected physical dest_layout from settings (err %d)", err); - return err; - } - - return zmk_physical_layouts_select(saved_selected_index); - } - - return 0; -}; - -SETTINGS_STATIC_HANDLER_DEFINE(physical_layouts, "physical_layouts", NULL, - physical_layouts_handle_set, NULL, NULL); - -#endif // IS_ENABLED(CONFIG_SETTINGS) - -static int zmk_physical_layouts_init(void) { - k_work_init(&msg_processor.work, zmk_physical_layouts_kscan_process_msgq); - -#if IS_ENABLED(CONFIG_PM_DEVICE) - for (int l = 0; l < ARRAY_SIZE(layouts); l++) { - const struct zmk_physical_layout *pl = layouts[l]; - if (pl->kscan && pm_device_wakeup_is_capable(pl->kscan) && - !pm_device_wakeup_enable(pl->kscan, true)) { - LOG_WRN("Failed to wakeup enable %s", pl->kscan->name); - } - } -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - - // Initialize a sane mapping - for (int i = 0; i < ZMK_KEYMAP_LEN; i++) { - selected_to_stock_map[i] = i; - } - - return zmk_physical_layouts_select_initial(); -} - -SYS_INIT(zmk_physical_layouts_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/src/pm.c b/app/src/pm.c deleted file mode 100644 index eaae3b5c..00000000 --- a/app/src/pm.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include - -// Reimplement some of the device work from Zephyr PM to work with the new `sys_poweroff` API. -// TODO: Tweak this to smarter runtime PM of subsystems on sleep. - -#ifdef CONFIG_ZMK_PM_DEVICE_SUSPEND_RESUME -TYPE_SECTION_START_EXTERN(const struct device *, pm_device_slots); - -#if defined(CONFIG_PM_DEVICE_SYSTEM_MANAGED) -/* Number of devices successfully suspended. */ -static size_t zmk_num_susp; - -int zmk_pm_suspend_devices(void) { - const struct device *devs; - size_t devc; - - devc = z_device_get_all_static(&devs); - - zmk_num_susp = 0; - - for (const struct device *dev = devs + devc - 1; dev >= devs; dev--) { - int ret; - - /* - * Ignore uninitialized devices, busy devices, wake up sources, and - * devices with runtime PM enabled. - */ - if (!device_is_ready(dev) || pm_device_is_busy(dev) || pm_device_wakeup_is_enabled(dev) || - pm_device_runtime_is_enabled(dev)) { - continue; - } - - ret = pm_device_action_run(dev, PM_DEVICE_ACTION_SUSPEND); - /* ignore devices not supporting or already at the given state */ - if ((ret == -ENOSYS) || (ret == -ENOTSUP) || (ret == -EALREADY)) { - continue; - } else if (ret < 0) { - LOG_ERR("Device %s did not enter %s state (%d)", dev->name, - pm_device_state_str(PM_DEVICE_STATE_SUSPENDED), ret); - return ret; - } - - TYPE_SECTION_START(pm_device_slots)[zmk_num_susp] = dev; - zmk_num_susp++; - } - - return 0; -} - -void zmk_pm_resume_devices(void) { - for (int i = (zmk_num_susp - 1); i >= 0; i--) { - pm_device_action_run(TYPE_SECTION_START(pm_device_slots)[i], PM_DEVICE_ACTION_RESUME); - } - - zmk_num_susp = 0; -} -#endif /* !CONFIG_PM_DEVICE_RUNTIME_EXCLUSIVE */ -#endif /* CONFIG_ZMK_PM_DEVICE_SUSPEND_RESUME */ - -#if IS_ENABLED(CONFIG_ZMK_PM_SOFT_OFF) - -#define HAS_WAKERS DT_HAS_COMPAT_STATUS_OKAY(zmk_soft_off_wakeup_sources) - -#if HAS_WAKERS - -#define DEVICE_WITH_SEP(node_id, prop, idx) DEVICE_DT_GET(DT_PROP_BY_IDX(node_id, prop, idx)), - -const struct device *soft_off_wakeup_sources[] = { - DT_FOREACH_PROP_ELEM(DT_INST(0, zmk_soft_off_wakeup_sources), wakeup_sources, DEVICE_WITH_SEP)}; - -#endif - -int zmk_pm_soft_off(void) { -#if IS_ENABLED(CONFIG_PM_DEVICE) - size_t device_count; - const struct device *devs; - -#if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - zmk_endpoint_clear_reports(); - // Need to sleep to give any other threads a chance so submit endpoint data. - k_sleep(K_MSEC(100)); -#endif - - device_count = z_device_get_all_static(&devs); - - // There may be some matrix/direct kscan devices that would be used for wakeup - // from normal "inactive goes to sleep" behavior, so disable them as wakeup devices - // and then suspend them so we're ready to take over setting up our system - // and then putting it into an off state. - LOG_DBG("soft-on-off pressed cb: suspend devices"); - for (int i = 0; i < device_count; i++) { - const struct device *dev = &devs[i]; - - if (pm_device_wakeup_is_enabled(dev)) { - pm_device_wakeup_enable(dev, false); - } - pm_device_action_run(dev, PM_DEVICE_ACTION_SUSPEND); - } -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#if HAS_WAKERS - for (int i = 0; i < ARRAY_SIZE(soft_off_wakeup_sources); i++) { - const struct device *dev = soft_off_wakeup_sources[i]; - pm_device_wakeup_enable(dev, true); - pm_device_action_run(dev, PM_DEVICE_ACTION_RESUME); - } -#endif // HAS_WAKERS - - int err = zmk_pm_suspend_devices(); - if (err < 0) { - zmk_pm_resume_devices(); - return err; - } - - LOG_DBG("soft-off: go to sleep"); - sys_poweroff(); - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_PM_SOFT_OFF) \ No newline at end of file diff --git a/app/src/pointing/CMakeLists.txt b/app/src/pointing/CMakeLists.txt deleted file mode 100644 index 8609277d..00000000 --- a/app/src/pointing/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -target_sources_ifdef(CONFIG_ZMK_INPUT_LISTENER app PRIVATE input_listener.c) -target_sources_ifdef(CONFIG_ZMK_INPUT_PROCESSOR_TRANSFORM app PRIVATE input_processor_transform.c) -target_sources_ifdef(CONFIG_ZMK_INPUT_PROCESSOR_SCALER app PRIVATE input_processor_scaler.c) -target_sources_ifdef(CONFIG_ZMK_INPUT_PROCESSOR_TEMP_LAYER app PRIVATE input_processor_temp_layer.c) -target_sources_ifdef(CONFIG_ZMK_INPUT_PROCESSOR_CODE_MAPPER app PRIVATE input_processor_code_mapper.c) -target_sources_ifdef(CONFIG_ZMK_INPUT_PROCESSOR_BEHAVIORS app PRIVATE input_processor_behaviors.c) -target_sources_ifdef(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING app PRIVATE resolution_multipliers.c) -target_sources_ifdef(CONFIG_ZMK_INPUT_SPLIT app PRIVATE input_split.c) diff --git a/app/src/pointing/Kconfig b/app/src/pointing/Kconfig deleted file mode 100644 index fc91f144..00000000 --- a/app/src/pointing/Kconfig +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -menu "Pointing Options" - -# Deprecated old config, kept for backwards compat -config ZMK_MOUSE - bool "(Deprecated) Mouse Support" - -config ZMK_POINTING - bool "Pointing Device Support" - default y if ZMK_MOUSE - select INPUT - select INPUT_THREAD_PRIORITY_OVERRIDE - -if ZMK_POINTING - -# Needed for anyone using gpio-keys for things like soft-off setup. -config INPUT_GPIO_KEYS - default n - -config INPUT_THREAD_STACK_SIZE - default 1024 if ZMK_SPLIT && !ZMK_SPLIT_ROLE_CENTRAL - -if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - -config ZMK_POINTING_SMOOTH_SCROLLING - bool "Smooth Scrolling" - help - Enable smooth scrolling, with hosts that support HID Resolution Multipliers - -config ZMK_INPUT_LISTENER - bool "Input listener for processing input events in the system" - default y - depends on DT_HAS_ZMK_INPUT_LISTENER_ENABLED - - -config ZMK_INPUT_PROCESSOR_TEMP_LAYER - bool "Temporary Layer Input Processor" - default y - depends on DT_HAS_ZMK_INPUT_PROCESSOR_TEMP_LAYER_ENABLED - -config ZMK_INPUT_PROCESSOR_TEMP_LAYER_MAX_ACTION_EVENTS - int "Temporary Layer Input Processor Max Action Events" - default 4 - depends on ZMK_INPUT_PROCESSOR_TEMP_LAYER - -endif - -config ZMK_INPUT_PROCESSOR_TRANSFORM - bool "Transform Input Processor" - default y - depends on DT_HAS_ZMK_INPUT_PROCESSOR_TRANSFORM_ENABLED - -config ZMK_INPUT_PROCESSOR_SCALER - bool "Scaling Input Processor" - default y - depends on DT_HAS_ZMK_INPUT_PROCESSOR_SCALER_ENABLED - -config ZMK_INPUT_PROCESSOR_CODE_MAPPER - bool "Code Mapper Input Processor" - default y - depends on DT_HAS_ZMK_INPUT_PROCESSOR_CODE_MAPPER_ENABLED - -config ZMK_INPUT_PROCESSOR_BEHAVIORS - bool "Behaviors Input Processor" - default y - depends on DT_HAS_ZMK_INPUT_PROCESSOR_BEHAVIORS_ENABLED - -config ZMK_INPUT_SPLIT - bool "Split input support" - default y - depends on DT_HAS_ZMK_INPUT_SPLIT_ENABLED && ZMK_SPLIT - -if ZMK_INPUT_SPLIT - -config ZMK_INPUT_SPLIT_INIT_PRIORITY - int "Input Split initialization priority" - default INPUT_INIT_PRIORITY - - -config ZMK_INPUT_SPLIT_MAX_TRACKED_KEYS - int "Input Split max tracked keys to release on peripheral disconnect" - default 5 - -endif # ZMK_INPUT_SPLIT - -endif # ZMK_POINTING - -endmenu # Mouse Options diff --git a/app/src/pointing/input_listener.c b/app/src/pointing/input_listener.c deleted file mode 100644 index cd18f791..00000000 --- a/app/src/pointing/input_listener.c +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_listener - -#include -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include - -#include -#include -#include - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) -#include -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -#include -#include - -#define ONE_IF_DEV_OK(n) \ - COND_CODE_1(DT_NODE_HAS_STATUS(DT_INST_PHANDLE(n, device), okay), (1 +), (0 +)) - -#define VALID_LISTENER_COUNT (DT_INST_FOREACH_STATUS_OKAY(ONE_IF_DEV_OK) 0) - -#if VALID_LISTENER_COUNT > 0 - -enum input_listener_xy_data_mode { - INPUT_LISTENER_XY_DATA_MODE_NONE, - INPUT_LISTENER_XY_DATA_MODE_REL, - INPUT_LISTENER_XY_DATA_MODE_ABS, -}; - -struct input_listener_axis_data { - int16_t value; -}; - -struct input_listener_xy_data { - enum input_listener_xy_data_mode mode; - struct input_listener_axis_data x; - struct input_listener_axis_data y; -}; - -struct input_listener_config_entry { - size_t processors_len; - const struct zmk_input_processor_entry *processors; -}; - -struct input_listener_layer_override { - uint32_t layer_mask; - bool process_next; - struct input_listener_config_entry config; -}; - -struct input_processor_remainder_data { - int16_t x, y, wheel, h_wheel; -}; - -struct input_listener_processor_data { - size_t remainders_len; - struct input_processor_remainder_data *remainders; -}; - -struct input_listener_config { - uint8_t listener_index; - struct input_listener_config_entry base; - size_t layer_overrides_len; - struct input_listener_layer_override layer_overrides[]; -}; - -struct input_listener_data { - union { - struct { - struct input_listener_xy_data data; - struct input_listener_xy_data wheel_data; - - uint8_t button_set; - uint8_t button_clear; - } mouse; - }; - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - int16_t wheel_remainder; - int16_t h_wheel_remainder; -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - - struct input_listener_processor_data base_processor_data; - struct input_listener_processor_data layer_override_data[]; -}; - -static void handle_rel_code(struct input_listener_data *data, struct input_event *evt) { - switch (evt->code) { - case INPUT_REL_X: - data->mouse.data.mode = INPUT_LISTENER_XY_DATA_MODE_REL; - data->mouse.data.x.value += evt->value; - break; - case INPUT_REL_Y: - data->mouse.data.mode = INPUT_LISTENER_XY_DATA_MODE_REL; - data->mouse.data.y.value += evt->value; - break; - case INPUT_REL_WHEEL: - data->mouse.wheel_data.mode = INPUT_LISTENER_XY_DATA_MODE_REL; - data->mouse.wheel_data.y.value += evt->value; - break; - case INPUT_REL_HWHEEL: - data->mouse.wheel_data.mode = INPUT_LISTENER_XY_DATA_MODE_REL; - data->mouse.wheel_data.x.value += evt->value; - break; - default: - break; - } -} - -static void handle_abs_code(const struct input_listener_config *config, - struct input_listener_data *data, struct input_event *evt) {} - -static void handle_key_code(const struct input_listener_config *config, - struct input_listener_data *data, struct input_event *evt) { - int8_t btn; - - switch (evt->code) { - case INPUT_BTN_TOUCH: - btn = 0; - if (evt->value > 0) { - WRITE_BIT(data->mouse.button_set, btn, 1); - } else { - WRITE_BIT(data->mouse.button_clear, btn, 1); - } - break; - case INPUT_BTN_0: - case INPUT_BTN_1: - case INPUT_BTN_2: - case INPUT_BTN_3: - case INPUT_BTN_4: - btn = evt->code - INPUT_BTN_0; - if (evt->value > 0) { - WRITE_BIT(data->mouse.button_set, btn, 1); - } else { - WRITE_BIT(data->mouse.button_clear, btn, 1); - } - break; - default: - break; - } -} - -static inline bool is_x_data(const struct input_event *evt) { - return evt->type == INPUT_EV_REL && evt->code == INPUT_REL_X; -} - -static inline bool is_y_data(const struct input_event *evt) { - return evt->type == INPUT_EV_REL && evt->code == INPUT_REL_Y; -} - -static int apply_config(uint8_t listener_index, const struct input_listener_config_entry *cfg, - struct input_listener_processor_data *processor_data, - struct input_listener_data *data, struct input_event *evt) { - size_t remainder_index = 0; - for (size_t p = 0; p < cfg->processors_len; p++) { - const struct zmk_input_processor_entry *proc_e = &cfg->processors[p]; - struct input_processor_remainder_data *remainders = NULL; - if (proc_e->track_remainders) { - remainders = &processor_data->remainders[remainder_index++]; - } - - int16_t *remainder = NULL; - if (remainders) { - if (evt->type == INPUT_EV_REL) { - switch (evt->code) { - case INPUT_REL_X: - remainder = &remainders->x; - break; - case INPUT_REL_Y: - remainder = &remainders->y; - break; - case INPUT_REL_WHEEL: - remainder = &remainders->wheel; - break; - case INPUT_REL_HWHEEL: - remainder = &remainders->h_wheel; - break; - } - } - } - - LOG_DBG("LISTENER INDEX: %d", listener_index); - struct zmk_input_processor_state state = {.input_device_index = listener_index, - .remainder = remainder}; - - int ret = zmk_input_processor_handle_event(proc_e->dev, evt, proc_e->param1, proc_e->param2, - &state); - switch (ret) { - case ZMK_INPUT_PROC_CONTINUE: - continue; - default: - return ret; - } - } - - return ZMK_INPUT_PROC_CONTINUE; -} - -static int filter_with_input_config(const struct input_listener_config *cfg, - struct input_listener_data *data, struct input_event *evt) { - if (!evt->dev) { - return -ENODEV; - } - - for (size_t oi = 0; oi < cfg->layer_overrides_len; oi++) { - const struct input_listener_layer_override *override = &cfg->layer_overrides[oi]; - struct input_listener_processor_data *override_data = &data->layer_override_data[oi]; - uint32_t mask = override->layer_mask; - uint8_t layer = 0; - while (mask != 0) { - if (mask & BIT(0) && zmk_keymap_layer_active(layer)) { - int ret = - apply_config(cfg->listener_index, &override->config, override_data, data, evt); - - if (ret < 0) { - return ret; - } - if (!override->process_next) { - return 0; - } - } - - layer++; - mask = mask >> 1; - } - } - - return apply_config(cfg->listener_index, &cfg->base, &data->base_processor_data, data, evt); -} - -static void clear_xy_data(struct input_listener_xy_data *data) { - data->x.value = data->y.value = 0; - data->mode = INPUT_LISTENER_XY_DATA_MODE_NONE; -} - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) -static void apply_resolution_scaling(struct input_listener_data *data, struct input_event *evt) { - int16_t *remainder; - uint8_t div; - - switch (evt->code) { - case INPUT_REL_WHEEL: - remainder = &data->wheel_remainder; - div = (16 - zmk_pointing_resolution_multipliers_get_current_profile().wheel); - break; - case INPUT_REL_HWHEEL: - remainder = &data->h_wheel_remainder; - div = (16 - zmk_pointing_resolution_multipliers_get_current_profile().hor_wheel); - break; - default: - return; - } - - int16_t val = evt->value + *remainder; - int16_t scaled = val / (int16_t)div; - *remainder = val - (scaled * (int16_t)div); - evt->value = val; -} -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -static void input_handler(const struct input_listener_config *config, - struct input_listener_data *data, struct input_event *evt) { - // First, process to update the event data as needed. - int ret = filter_with_input_config(config, data, evt); - - if (ret < 0) { - LOG_ERR("Error applying input processors: %d", ret); - return; - } else if (ret == ZMK_INPUT_PROC_STOP) { - return; - } - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - apply_resolution_scaling(data, evt); -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - - switch (evt->type) { - case INPUT_EV_REL: - handle_rel_code(data, evt); - break; - case INPUT_EV_ABS: - handle_abs_code(config, data, evt); - break; - case INPUT_EV_KEY: - handle_key_code(config, data, evt); - break; - } - - if (evt->sync) { - if (data->mouse.wheel_data.mode == INPUT_LISTENER_XY_DATA_MODE_REL) { - zmk_hid_mouse_scroll_set(data->mouse.wheel_data.x.value, - data->mouse.wheel_data.y.value); - } - - if (data->mouse.data.mode == INPUT_LISTENER_XY_DATA_MODE_REL) { - zmk_hid_mouse_movement_set(data->mouse.data.x.value, data->mouse.data.y.value); - } - - if (data->mouse.button_set != 0) { - for (int i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { - if ((data->mouse.button_set & BIT(i)) != 0) { - zmk_hid_mouse_button_press(i); - } - } - } - - if (data->mouse.button_clear != 0) { - for (int i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { - if ((data->mouse.button_clear & BIT(i)) != 0) { - zmk_hid_mouse_button_release(i); - } - } - } - - zmk_endpoint_send_mouse_report(); - zmk_hid_mouse_scroll_set(0, 0); - zmk_hid_mouse_movement_set(0, 0); - - clear_xy_data(&data->mouse.data); - clear_xy_data(&data->mouse.wheel_data); - - data->mouse.button_set = data->mouse.button_clear = 0; - } -} - -#endif // VALID_LISTENER_COUNT > 0 - -#define ONE_FOR_TRACKED(n, elem, idx) \ - +DT_PROP(DT_PHANDLE_BY_IDX(n, input_processors, idx), track_remainders) -#define PROCESSOR_REM_TRACKERS(n) (0 DT_FOREACH_PROP_ELEM(n, input_processors, ONE_FOR_TRACKED)) - -#define SCOPED_PROCESSOR(scope, n, id) \ - COND_CODE_1(DT_NODE_HAS_PROP(n, input_processors), \ - (static struct input_processor_remainder_data _CONCAT( \ - input_processor_remainders_##id, scope)[PROCESSOR_REM_TRACKERS(n)] = {};), \ - ()) \ - static const struct zmk_input_processor_entry _CONCAT( \ - processor_##id, scope)[DT_PROP_LEN_OR(n, input_processors, 0)] = \ - COND_CODE_1(DT_NODE_HAS_PROP(n, input_processors), \ - ({LISTIFY(DT_PROP_LEN(n, input_processors), ZMK_INPUT_PROCESSOR_ENTRY_AT_IDX, \ - (, ), n)}), \ - ({})); - -#define IL_EXTRACT_CONFIG(n, id, scope) \ - { \ - .processors_len = DT_PROP_LEN_OR(n, input_processors, 0), \ - .processors = _CONCAT(processor_##id, scope), \ - } - -#define IL_EXTRACT_DATA(n, id, scope) \ - {COND_CODE_1(DT_NODE_HAS_PROP(n, input_processors), \ - (.remainders_len = PROCESSOR_REM_TRACKERS(n), \ - .remainders = _CONCAT(input_processor_remainders_##id, scope), ), \ - ())} - -#define IL_ONE(...) +1 - -#define CHILD_CONFIG(node, parent) SCOPED_PROCESSOR(node, node, parent) - -#define OVERRIDE_LAYER_BIT(node, prop, idx) BIT(DT_PROP_BY_IDX(node, prop, idx)) - -#define IL_OVERRIDE(node, parent) \ - { \ - .layer_mask = DT_FOREACH_PROP_ELEM_SEP(node, layers, OVERRIDE_LAYER_BIT, (|)), \ - .process_next = DT_PROP_OR(node, process_next, false), \ - .config = IL_EXTRACT_CONFIG(node, parent, node), \ - } - -#define IL_OVERRIDE_DATA(node, parent) IL_EXTRACT_DATA(node, parent, node) - -#define IL_INST(n) \ - COND_CODE_1( \ - DT_NODE_HAS_STATUS(DT_INST_PHANDLE(n, device), okay), \ - (SCOPED_PROCESSOR(base, DT_DRV_INST(n), n); \ - DT_INST_FOREACH_CHILD_VARGS(n, CHILD_CONFIG, \ - n) static const struct input_listener_config config_##n = \ - { \ - .listener_index = n, \ - .base = IL_EXTRACT_CONFIG(DT_DRV_INST(n), n, base), \ - .layer_overrides_len = (0 DT_INST_FOREACH_CHILD(n, IL_ONE)), \ - .layer_overrides = {DT_INST_FOREACH_CHILD_SEP_VARGS(n, IL_OVERRIDE, (, ), n)}, \ - }; \ - static struct input_listener_data data_##n = \ - { \ - .base_processor_data = IL_EXTRACT_DATA(DT_DRV_INST(n), n, base), \ - .layer_override_data = {DT_INST_FOREACH_CHILD_SEP_VARGS(n, IL_OVERRIDE_DATA, \ - (, ), n)}, \ - }; \ - void input_handler_##n(struct input_event *evt, void *user_data) { \ - input_handler(&config_##n, &data_##n, evt); \ - } INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), input_handler_##n, \ - NULL);), \ - ()) - -DT_INST_FOREACH_STATUS_OKAY(IL_INST) diff --git a/app/src/pointing/input_processor_behaviors.c b/app/src/pointing/input_processor_behaviors.c deleted file mode 100644 index 0c8d75cd..00000000 --- a/app/src/pointing/input_processor_behaviors.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_processor_behaviors - -#include - -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include -#include - -struct ip_behaviors_config { - uint8_t index; - size_t size; - uint16_t type; - - const uint16_t *codes; - const struct zmk_behavior_binding *bindings; -}; - -static int ip_behaviors_handle_event(const struct device *dev, struct input_event *event, - uint32_t param1, uint32_t param2, - struct zmk_input_processor_state *state) { - const struct ip_behaviors_config *cfg = dev->config; - - if (event->type != cfg->type) { - return 0; - } - - for (size_t i = 0; i < cfg->size; i++) { - if (cfg->codes[i] == event->code) { - struct zmk_behavior_binding_event behavior_event = { - .position = ZMK_VIRTUAL_KEY_POSITION_BEHAVIOR_INPUT_PROCESSOR( - state->input_device_index, cfg->index), - .timestamp = k_uptime_get(), -#if IS_ENABLED(CONFIG_ZMK_SPLIT) - .source = ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, -#endif - }; - - LOG_DBG("FOUND A MATCHING CODE, invoke %s for position %d with %d listeners", - cfg->bindings[i].behavior_dev, behavior_event.position, - ZMK_INPUT_LISTENERS_LEN); - int ret = zmk_behavior_invoke_binding(&cfg->bindings[i], behavior_event, event->value); - if (ret < 0) { - return ret; - } - - return ZMK_INPUT_PROC_STOP; - } - } - - return 0; -} - -static struct zmk_input_processor_driver_api ip_behaviors_driver_api = { - .handle_event = ip_behaviors_handle_event, -}; - -static int ip_behaviors_init(const struct device *dev) { return 0; } - -#define ENTRY(i, node) ZMK_KEYMAP_EXTRACT_BINDING(i, node) - -#define IP_BEHAVIORS_INST(n) \ - static const uint16_t ip_behaviors_codes_##n[] = DT_INST_PROP(n, codes); \ - static const struct zmk_behavior_binding ip_behaviors_bindings_##n[] = { \ - LISTIFY(DT_INST_PROP_LEN(n, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), DT_DRV_INST(n))}; \ - BUILD_ASSERT(ARRAY_SIZE(ip_behaviors_codes_##n) == ARRAY_SIZE(ip_behaviors_bindings_##n), \ - "codes and bindings need to be the same length"); \ - static const struct ip_behaviors_config ip_behaviors_config_##n = { \ - .index = n, \ - .type = DT_INST_PROP_OR(n, type, INPUT_EV_KEY), \ - .size = DT_INST_PROP_LEN(n, codes), \ - .codes = ip_behaviors_codes_##n, \ - .bindings = ip_behaviors_bindings_##n, \ - }; \ - DEVICE_DT_INST_DEFINE(n, &ip_behaviors_init, NULL, NULL, &ip_behaviors_config_##n, \ - POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &ip_behaviors_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(IP_BEHAVIORS_INST) \ No newline at end of file diff --git a/app/src/pointing/input_processor_code_mapper.c b/app/src/pointing/input_processor_code_mapper.c deleted file mode 100644 index b42d3478..00000000 --- a/app/src/pointing/input_processor_code_mapper.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_processor_code_mapper - -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct cm_config { - uint8_t type; - size_t mapping_size; - uint16_t mapping[]; -}; - -static int cm_handle_event(const struct device *dev, struct input_event *event, uint32_t param1, - uint32_t param2, struct zmk_input_processor_state *state) { - const struct cm_config *cfg = dev->config; - - if (event->type != cfg->type) { - return ZMK_INPUT_PROC_CONTINUE; - } - - for (int i = 0; i < cfg->mapping_size / 2; i++) { - if (cfg->mapping[i * 2] == event->code) { - uint16_t orig = event->code; - event->code = cfg->mapping[(i * 2) + 1]; - LOG_DBG("Remapped %d to %d", orig, event->code); - break; - } - } - - return ZMK_INPUT_PROC_CONTINUE; -} - -static struct zmk_input_processor_driver_api cm_driver_api = { - .handle_event = cm_handle_event, -}; - -#define TL_INST(n) \ - static const struct cm_config cm_config_##n = { \ - .type = DT_INST_PROP_OR(n, type, INPUT_EV_REL), \ - .mapping_size = DT_INST_PROP_LEN(n, map), \ - .mapping = DT_INST_PROP(n, map), \ - }; \ - BUILD_ASSERT(DT_INST_PROP_LEN(n, map) % 2 == 0, \ - "Must have an even number of mapping entries"); \ - DEVICE_DT_INST_DEFINE(n, NULL, NULL, NULL, &cm_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &cm_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(TL_INST) \ No newline at end of file diff --git a/app/src/pointing/input_processor_scaler.c b/app/src/pointing/input_processor_scaler.c deleted file mode 100644 index c7e08ecd..00000000 --- a/app/src/pointing/input_processor_scaler.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_processor_scaler - -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -struct scaler_config { - uint8_t type; - size_t codes_len; - uint16_t codes[]; -}; - -static int scale_val(struct input_event *event, uint32_t mul, uint32_t div, - struct zmk_input_processor_state *state) { - int16_t value_mul = event->value * (int16_t)mul; - - if (state && state->remainder) { - value_mul += *state->remainder; - } - - int16_t scaled = value_mul / (int16_t)div; - - if (state && state->remainder) { - *state->remainder = value_mul - (scaled * (int16_t)div); - } - - LOG_DBG("scaled %d with %d/%d to %d with remainder %d", event->value, mul, div, scaled, - (state && state->remainder) ? *state->remainder : 0); - - event->value = scaled; - - return 0; -} - -static int scaler_handle_event(const struct device *dev, struct input_event *event, uint32_t param1, - uint32_t param2, struct zmk_input_processor_state *state) { - const struct scaler_config *cfg = dev->config; - - if (event->type != cfg->type) { - return ZMK_INPUT_PROC_CONTINUE; - } - - for (int i = 0; i < cfg->codes_len; i++) { - if (cfg->codes[i] == event->code) { - return scale_val(event, param1, param2, state); - } - } - - return ZMK_INPUT_PROC_CONTINUE; -} - -static struct zmk_input_processor_driver_api scaler_driver_api = { - .handle_event = scaler_handle_event, -}; - -#define SCALER_INST(n) \ - static const struct scaler_config scaler_config_##n = { \ - .type = DT_INST_PROP_OR(n, type, INPUT_EV_REL), \ - .codes_len = DT_INST_PROP_LEN(n, codes), \ - .codes = DT_INST_PROP(n, codes), \ - }; \ - DEVICE_DT_INST_DEFINE(n, NULL, NULL, NULL, &scaler_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &scaler_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(SCALER_INST) \ No newline at end of file diff --git a/app/src/pointing/input_processor_temp_layer.c b/app/src/pointing/input_processor_temp_layer.c deleted file mode 100644 index 45562312..00000000 --- a/app/src/pointing/input_processor_temp_layer.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_processor_temp_layer - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -/* Constants and Types */ -#define MAX_LAYERS ZMK_KEYMAP_LAYERS_LEN - -struct temp_layer_config { - int16_t require_prior_idle_ms; - const uint16_t *excluded_positions; - size_t num_positions; -}; - -struct temp_layer_state { - uint8_t toggle_layer; - bool is_active; - int64_t last_tapped_timestamp; -}; - -struct temp_layer_data { - const struct device *dev; - struct k_mutex lock; - struct temp_layer_state state; -}; - -/* Static Work Queue Items */ -static struct k_work_delayable layer_disable_works[MAX_LAYERS]; - -/* Position Search */ -static bool position_is_excluded(const struct temp_layer_config *config, uint32_t position) { - if (!config->excluded_positions || !config->num_positions) { - return false; - } - - const uint16_t *end = config->excluded_positions + config->num_positions; - for (const uint16_t *pos = config->excluded_positions; pos < end; pos++) { - if (*pos == position) { - return true; - } - } - - return false; -} - -/* Timing Check */ -static bool should_quick_tap(const struct temp_layer_config *config, int64_t last_tapped, - int64_t current_time) { - return (last_tapped + config->require_prior_idle_ms) > current_time; -} - -/* Layer State Management */ -static void update_layer_state(struct temp_layer_state *state, bool activate) { - if (state->is_active == activate) { - return; - } - - state->is_active = activate; - if (activate) { - zmk_keymap_layer_activate(state->toggle_layer, false); - LOG_DBG("Layer %d activated", state->toggle_layer); - } else { - zmk_keymap_layer_deactivate(state->toggle_layer, false); - LOG_DBG("Layer %d deactivated", state->toggle_layer); - } -} - -struct layer_state_action { - uint8_t layer; - bool activate; -}; - -K_MSGQ_DEFINE(temp_layer_action_msgq, sizeof(struct layer_state_action), - CONFIG_ZMK_INPUT_PROCESSOR_TEMP_LAYER_MAX_ACTION_EVENTS, 4); - -static void layer_action_work_cb(struct k_work *work) { - - const struct device *dev = DEVICE_DT_INST_GET(0); - struct temp_layer_data *data = (struct temp_layer_data *)dev->data; - - int ret = k_mutex_lock(&data->lock, K_FOREVER); - if (ret < 0) { - LOG_ERR("Error locking for updating %d", ret); - return; - } - - struct layer_state_action action; - - while (k_msgq_get(&temp_layer_action_msgq, &action, K_MSEC(10)) >= 0) { - if (!action.activate) { - if (zmk_keymap_layer_active(action.layer)) { - update_layer_state(&data->state, false); - } - } else { - update_layer_state(&data->state, true); - } - } - - k_mutex_unlock(&data->lock); -} - -static K_WORK_DEFINE(layer_action_work, layer_action_work_cb); - -/* Work Queue Callback */ -static void layer_disable_callback(struct k_work *work) { - struct k_work_delayable *d_work = k_work_delayable_from_work(work); - int layer_index = ARRAY_INDEX(layer_disable_works, d_work); - - struct layer_state_action action = {.layer = layer_index, .activate = false}; - - int ret = k_msgq_put(&temp_layer_action_msgq, &action, K_MSEC(10)); - k_work_submit(&layer_action_work); -} - -/* Event Handlers */ -static int handle_layer_state_changed(const struct device *dev, const zmk_event_t *eh) { - struct temp_layer_data *data = (struct temp_layer_data *)dev->data; - int ret = k_mutex_lock(&data->lock, K_FOREVER); - if (ret < 0) { - return ret; - } - if (!zmk_keymap_layer_active(zmk_keymap_layer_index_to_id(data->state.toggle_layer))) { - LOG_DBG("Deactivating layer that was activated by this processor"); - data->state.is_active = false; - k_work_cancel_delayable(&layer_disable_works[data->state.toggle_layer]); - } - ret = k_mutex_unlock(&data->lock); - if (ret < 0) { - return ret; - } - - return ZMK_EV_EVENT_BUBBLE; -} - -static int handle_position_state_changed(const struct device *dev, const zmk_event_t *eh) { - const struct zmk_position_state_changed *ev = as_zmk_position_state_changed(eh); - if (!ev->state) { - return ZMK_EV_EVENT_BUBBLE; - } - - struct temp_layer_data *data = (struct temp_layer_data *)dev->data; - int ret = k_mutex_lock(&data->lock, K_FOREVER); - if (ret < 0) { - return ret; - } - - const struct temp_layer_config *cfg = dev->config; - - if (data->state.is_active && cfg->excluded_positions && cfg->num_positions > 0) { - if (!position_is_excluded(cfg, ev->position)) { - LOG_DBG("Position not excluded, deactivating layer"); - update_layer_state(&data->state, false); - } - } - LOG_DBG("Position excluded, continuing"); - - k_mutex_unlock(&data->lock); - - return ZMK_EV_EVENT_BUBBLE; -} - -static int handle_keycode_state_changed(const struct device *dev, const zmk_event_t *eh) { - const struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); - if (!ev->state) { - return ZMK_EV_EVENT_BUBBLE; - } - - struct temp_layer_data *data = (struct temp_layer_data *)dev->data; - - int ret = k_mutex_lock(&data->lock, K_FOREVER); - if (ret < 0) { - return ret; - } - - LOG_DBG("Setting last_tapped_timestamp to: %lld", ev->timestamp); - data->state.last_tapped_timestamp = ev->timestamp; - - ret = k_mutex_unlock(&data->lock); - if (ret < 0) { - return ret; - } - - return ZMK_EV_EVENT_BUBBLE; -} - -static int handle_state_changed_dispatcher(const struct device *dev, const zmk_event_t *eh) { - if (as_zmk_layer_state_changed(eh) != NULL) { - LOG_DBG("Dispatching handle_layer_state_changed"); - return handle_layer_state_changed(dev, eh); - } else if (as_zmk_position_state_changed(eh) != NULL) { - LOG_DBG("Dispatching handle_position_state_changed"); - return handle_position_state_changed(dev, eh); - } else if (as_zmk_keycode_state_changed(eh) != NULL) { - LOG_DBG("Dispatching handle_keycode_state_changed"); - return handle_keycode_state_changed(dev, eh); - } - - return ZMK_EV_EVENT_BUBBLE; -} - -#define DISPATCH_EVENT(inst) \ - { \ - int err = handle_state_changed_dispatcher(DEVICE_DT_INST_GET(inst), eh); \ - if (err < 0) { \ - return err; \ - } \ - } - -static int handle_event_dispatcher(const zmk_event_t *eh) { - DT_INST_FOREACH_STATUS_OKAY(DISPATCH_EVENT) - - return 0; -} - -/* Driver Implementation */ -static int temp_layer_handle_event(const struct device *dev, struct input_event *event, - uint32_t param1, uint32_t param2, - struct zmk_input_processor_state *state) { - if (param1 >= MAX_LAYERS) { - LOG_ERR("Invalid layer index: %d", param1); - return -EINVAL; - } - - struct temp_layer_data *data = (struct temp_layer_data *)dev->data; - - int ret = k_mutex_lock(&data->lock, K_FOREVER); - if (ret < 0) { - return ret; - } - - const struct temp_layer_config *cfg = dev->config; - - data->state.toggle_layer = param1; - - if (!data->state.is_active && - !should_quick_tap(cfg, data->state.last_tapped_timestamp, k_uptime_get())) { - struct layer_state_action action = {.layer = param1, .activate = true}; - - int ret = k_msgq_put(&temp_layer_action_msgq, &action, K_MSEC(10)); - if (ret < 0) { - LOG_ERR("Failed to enqueue action to enable layer %d (%d)", param1, ret); - } else { - k_work_submit(&layer_action_work); - } - } - - if (param2 > 0) { - k_work_reschedule(&layer_disable_works[param1], K_MSEC(param2)); - } - - k_mutex_unlock(&data->lock); - - return ZMK_INPUT_PROC_CONTINUE; -} - -static int temp_layer_init(const struct device *dev) { - struct temp_layer_data *data = (struct temp_layer_data *)dev->data; - k_mutex_init(&data->lock); - - for (int i = 0; i < MAX_LAYERS; i++) { - k_work_init_delayable(&layer_disable_works[i], layer_disable_callback); - } - - return 0; -} - -/* Driver API */ -static const struct zmk_input_processor_driver_api temp_layer_driver_api = { - .handle_event = temp_layer_handle_event, -}; - -/* Event Listeners Conditions */ -#define NEEDS_POSITION_HANDLERS(n, ...) DT_INST_PROP_HAS_IDX(n, excluded_positions, 0) -#define NEEDS_KEYCODE_HANDLERS(n, ...) (DT_INST_PROP_OR(n, require_prior_idle_ms, 0) > 0) - -/* Event Handlers Registration */ -ZMK_LISTENER(processor_temp_layer, handle_event_dispatcher); -ZMK_SUBSCRIPTION(processor_temp_layer, zmk_layer_state_changed); - -/* Individual Subscriptions */ -#if DT_INST_FOREACH_STATUS_OKAY_VARGS(NEEDS_POSITION_HANDLERS, ||) -ZMK_SUBSCRIPTION(processor_temp_layer, zmk_position_state_changed); -#endif - -#if DT_INST_FOREACH_STATUS_OKAY_VARGS(NEEDS_KEYCODE_HANDLERS, ||) -ZMK_SUBSCRIPTION(processor_temp_layer, zmk_keycode_state_changed); -#endif - -/* Device Instantiation */ -#define TEMP_LAYER_INST(n) \ - static struct temp_layer_data processor_temp_layer_data_##n = {}; \ - static const uint16_t excluded_positions_##n[] = DT_INST_PROP(n, excluded_positions); \ - static const struct temp_layer_config processor_temp_layer_config_##n = { \ - .require_prior_idle_ms = DT_INST_PROP_OR(n, require_prior_idle_ms, 0), \ - .excluded_positions = excluded_positions_##n, \ - .num_positions = DT_INST_PROP_LEN(n, excluded_positions), \ - }; \ - DEVICE_DT_INST_DEFINE(n, temp_layer_init, NULL, &processor_temp_layer_data_##n, \ - &processor_temp_layer_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &temp_layer_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(TEMP_LAYER_INST) diff --git a/app/src/pointing/input_processor_transform.c b/app/src/pointing/input_processor_transform.c deleted file mode 100644 index c214baee..00000000 --- a/app/src/pointing/input_processor_transform.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_processor_transform - -#include -#include -#include - -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include - -struct ipt_config { - size_t x_codes_size; - size_t y_codes_size; - uint8_t type; - - const uint16_t *x_codes; - const uint16_t *y_codes; -}; - -static int code_idx(uint16_t code, const uint16_t *list, size_t len) { - for (int i = 0; i < len; i++) { - if (list[i] == code) { - return i; - } - } - - return -ENODEV; -} - -static int ipt_handle_event(const struct device *dev, struct input_event *event, uint32_t param1, - uint32_t param2, struct zmk_input_processor_state *state) { - const struct ipt_config *cfg = dev->config; - - if (event->type != cfg->type) { - return ZMK_INPUT_PROC_CONTINUE; - } - - if (param1 & INPUT_TRANSFORM_XY_SWAP) { - int idx = code_idx(event->code, cfg->x_codes, cfg->x_codes_size); - if (idx >= 0) { - event->code = cfg->y_codes[idx]; - } else { - idx = code_idx(event->code, cfg->y_codes, cfg->y_codes_size); - - if (idx >= 0) { - event->code = cfg->x_codes[idx]; - } - } - } - - if ((param1 & INPUT_TRANSFORM_X_INVERT && - code_idx(event->code, cfg->x_codes, cfg->x_codes_size) >= 0) || - (param1 & INPUT_TRANSFORM_Y_INVERT && - code_idx(event->code, cfg->y_codes, cfg->y_codes_size) >= 0)) { - event->value = -event->value; - } - - return ZMK_INPUT_PROC_CONTINUE; -} - -static struct zmk_input_processor_driver_api ipt_driver_api = { - .handle_event = ipt_handle_event, -}; - -static int ipt_init(const struct device *dev) { return 0; } - -#define IPT_INST(n) \ - static const uint16_t ipt_x_codes_##n[] = DT_INST_PROP(n, x_codes); \ - static const uint16_t ipt_y_codes_##n[] = DT_INST_PROP(n, y_codes); \ - BUILD_ASSERT(ARRAY_SIZE(ipt_x_codes_##n) == ARRAY_SIZE(ipt_x_codes_##n), \ - "X and Y codes need to be the same size"); \ - static const struct ipt_config ipt_config_##n = { \ - .type = DT_INST_PROP_OR(n, type, INPUT_EV_REL), \ - .x_codes_size = DT_INST_PROP_LEN(n, x_codes), \ - .y_codes_size = DT_INST_PROP_LEN(n, y_codes), \ - .x_codes = ipt_x_codes_##n, \ - .y_codes = ipt_y_codes_##n, \ - }; \ - DEVICE_DT_INST_DEFINE(n, &ipt_init, NULL, NULL, &ipt_config_##n, POST_KERNEL, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &ipt_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(IPT_INST) \ No newline at end of file diff --git a/app/src/pointing/input_split.c b/app/src/pointing/input_split.c deleted file mode 100644 index 6662111d..00000000 --- a/app/src/pointing/input_split.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_input_split - -#include -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - -struct zis_entry { - uint8_t reg; - const struct device *dev; -}; - -#define ZIS_ENTRY(n) {.reg = DT_INST_REG_ADDR(n), .dev = DEVICE_DT_GET(DT_DRV_INST(n))}, - -static const struct zis_entry proxy_inputs[] = {DT_INST_FOREACH_STATUS_OKAY(ZIS_ENTRY)}; - -static uint16_t proxy_active_keys[DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT)] - [CONFIG_ZMK_INPUT_SPLIT_MAX_TRACKED_KEYS]; - -static int replace_active_key(size_t input, uint16_t find, uint16_t replace) { - for (size_t k = 0; k < CONFIG_ZMK_INPUT_SPLIT_MAX_TRACKED_KEYS; k++) { - if (proxy_active_keys[input][k] == find) { - proxy_active_keys[input][k] = replace; - return 0; - } - } - - return -ENODEV; -} - -int zmk_input_split_report_peripheral_event(uint8_t reg, uint8_t type, uint16_t code, int32_t value, - bool sync) { - LOG_DBG("Got peripheral event for %d!", reg); - for (size_t i = 0; i < ARRAY_SIZE(proxy_inputs); i++) { - if (reg == proxy_inputs[i].reg) { - if (type == INPUT_EV_KEY) { - uint16_t find, replace; - - if (value) { - find = 0; - replace = code; - } else { - find = code; - replace = 0; - } - - int ret = replace_active_key(i, find, replace); - if (ret < 0) { - LOG_WRN("Failed to %s key %d", value ? "track pressed" : "untrack released", - ret); - } - } - return input_report(proxy_inputs[i].dev, type, code, value, sync, K_NO_WAIT); - } - } - - return -ENODEV; -} - -int zmk_input_split_peripheral_disconnected(uint8_t reg) { - for (size_t i = 0; i < ARRAY_SIZE(proxy_inputs); i++) { - if (reg == proxy_inputs[i].reg) { - uint16_t prev = 0; - for (size_t k = 0; k < CONFIG_ZMK_INPUT_SPLIT_MAX_TRACKED_KEYS; k++) { - if (proxy_active_keys[i][k] != 0) { - if (prev != 0) { - int ret = input_report(proxy_inputs[i].dev, INPUT_EV_KEY, prev, 0, false, - K_NO_WAIT); - if (ret < 0) { - LOG_WRN("Failed to report release event on disconnect (%d)", ret); - } - } - - prev = proxy_active_keys[i][k]; - proxy_active_keys[i][k] = 0; - } - } - - if (prev != 0) { - int ret = input_report(proxy_inputs[i].dev, INPUT_EV_KEY, prev, 0, true, K_NO_WAIT); - if (ret < 0) { - LOG_WRN("Failed to report release event on disconnect (%d)", ret); - } - } - } - } - - return -ENODEV; -} - -#define ZIS_INST(n) \ - DEVICE_DT_INST_DEFINE(n, NULL, NULL, NULL, NULL, POST_KERNEL, \ - CONFIG_ZMK_INPUT_SPLIT_INIT_PRIORITY, NULL); - -#else - -#include - -#define ZIS_INST(n) \ - static const struct zmk_input_processor_entry processors_##n[] = \ - COND_CODE_1(DT_INST_NODE_HAS_PROP(n, input_processors), \ - ({LISTIFY(DT_INST_PROP_LEN(n, input_processors), \ - ZMK_INPUT_PROCESSOR_ENTRY_AT_IDX, (, ), DT_DRV_INST(n))}), \ - ({})); \ - BUILD_ASSERT(DT_INST_NODE_HAS_PROP(n, device), \ - "Peripheral input splits need an `input` property set"); \ - void split_input_handler_##n(struct input_event *evt, void *user_data) { \ - for (size_t i = 0; i < ARRAY_SIZE(processors_##n); i++) { \ - int ret = zmk_input_processor_handle_event(processors_##n[i].dev, evt, \ - processors_##n[i].param1, \ - processors_##n[i].param2, NULL); \ - if (ret != ZMK_INPUT_PROC_CONTINUE) { \ - return; \ - } \ - } \ - struct zmk_split_transport_peripheral_event ev = { \ - .type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_INPUT_EVENT, \ - .data = {.input_event = { \ - .reg = DT_INST_REG_ADDR(n), \ - .type = evt->type, \ - .code = evt->code, \ - .value = evt->value, \ - .sync = evt->sync, \ - }}}; \ - zmk_split_peripheral_report_event(&ev); \ - } \ - INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), split_input_handler_##n, NULL); - -#endif - -DT_INST_FOREACH_STATUS_OKAY(ZIS_INST) diff --git a/app/src/pointing/resolution_multipliers.c b/app/src/pointing/resolution_multipliers.c deleted file mode 100644 index fa798462..00000000 --- a/app/src/pointing/resolution_multipliers.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -static struct zmk_pointing_resolution_multipliers multipliers[ZMK_ENDPOINT_COUNT] = { - [0 ... ZMK_ENDPOINT_COUNT - 1] = - { - .wheel = 15, - .hor_wheel = 15, - }, -}; - -struct zmk_pointing_resolution_multipliers -zmk_pointing_resolution_multipliers_get_current_profile(void) { - return zmk_pointing_resolution_multipliers_get_profile(zmk_endpoint_get_selected()); -} - -struct zmk_pointing_resolution_multipliers -zmk_pointing_resolution_multipliers_get_profile(struct zmk_endpoint_instance endpoint) { - const int profile = zmk_endpoint_instance_to_index(endpoint); - return multipliers[profile]; -} - -void zmk_pointing_resolution_multipliers_set_profile(struct zmk_pointing_resolution_multipliers m, - struct zmk_endpoint_instance endpoint) { - int profile = zmk_endpoint_instance_to_index(endpoint); - - // This write is not happening on the main thread. To prevent potential data races, every - // operation involving hid_indicators must be atomic. Currently, each function either reads - // or writes only one entry at a time, so it is safe to do these operations without a lock. - multipliers[profile] = m; -} - -void zmk_pointing_resolution_multipliers_process_report( - struct zmk_hid_mouse_resolution_feature_report_body *report, - struct zmk_endpoint_instance endpoint) { - struct zmk_pointing_resolution_multipliers vals = { - .wheel = report->wheel_res, - .hor_wheel = report->hwheel_res, - }; - zmk_pointing_resolution_multipliers_set_profile(vals, endpoint); - - LOG_DBG("Update resolution multipliers: endpoint=%d, wheel=%d, hor_wheel=%d", - endpoint.transport, vals.wheel, vals.hor_wheel); -} diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 3453fb44..b80d4039 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -67,7 +67,7 @@ static struct led_rgb pixels[STRIP_NUM_PIXELS]; static struct rgb_underglow_state state; #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) -static const struct device *const ext_power = DEVICE_DT_GET(DT_INST(0, zmk_ext_power_generic)); +static const struct device *ext_power; #endif static struct zmk_led_hsb hsb_scale_min_max(struct zmk_led_hsb hsb) { @@ -82,7 +82,7 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { } static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { - float r = 0, g = 0, b = 0; + float r, g, b; uint8_t i = hsb.h / 60; float v = hsb.b / ((float)BRT_MAX); @@ -130,13 +130,13 @@ static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { return rgb; } -static void zmk_rgb_underglow_effect_solid(void) { +static void zmk_rgb_underglow_effect_solid() { for (int i = 0; i < STRIP_NUM_PIXELS; i++) { pixels[i] = hsb_to_rgb(hsb_scale_min_max(state.color)); } } -static void zmk_rgb_underglow_effect_breathe(void) { +static void zmk_rgb_underglow_effect_breathe() { for (int i = 0; i < STRIP_NUM_PIXELS; i++) { struct zmk_led_hsb hsb = state.color; hsb.b = abs(state.animation_step - 1200) / 12; @@ -151,7 +151,7 @@ static void zmk_rgb_underglow_effect_breathe(void) { } } -static void zmk_rgb_underglow_effect_spectrum(void) { +static void zmk_rgb_underglow_effect_spectrum() { for (int i = 0; i < STRIP_NUM_PIXELS; i++) { struct zmk_led_hsb hsb = state.color; hsb.h = state.animation_step; @@ -163,7 +163,7 @@ static void zmk_rgb_underglow_effect_spectrum(void) { state.animation_step = state.animation_step % HUE_MAX; } -static void zmk_rgb_underglow_effect_swirl(void) { +static void zmk_rgb_underglow_effect_swirl() { for (int i = 0; i < STRIP_NUM_PIXELS; i++) { struct zmk_led_hsb hsb = state.color; hsb.h = (HUE_MAX / STRIP_NUM_PIXELS * i + state.animation_step) % HUE_MAX; @@ -221,10 +221,6 @@ static int rgb_settings_set(const char *name, size_t len, settings_read_cb read_ rc = read_cb(cb_arg, &state, sizeof(state)); if (rc >= 0) { - if (state.on) { - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); - } - return 0; } @@ -234,22 +230,22 @@ static int rgb_settings_set(const char *name, size_t len, settings_read_cb read_ return -ENOENT; } -SETTINGS_STATIC_HANDLER_DEFINE(rgb_underglow, "rgb/underglow", NULL, rgb_settings_set, NULL, NULL); +struct settings_handler rgb_conf = {.name = "rgb/underglow", .h_set = rgb_settings_set}; -static void zmk_rgb_underglow_save_state_work(struct k_work *_work) { +static void zmk_rgb_underglow_save_state_work() { settings_save_one("rgb/underglow/state", &state, sizeof(state)); } static struct k_work_delayable underglow_save_work; #endif -static int zmk_rgb_underglow_init(void) { +static int zmk_rgb_underglow_init(const struct device *_arg) { led_strip = DEVICE_DT_GET(STRIP_CHOSEN); #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) - if (!device_is_ready(ext_power)) { - LOG_ERR("External power device \"%s\" is not ready", ext_power->name); - return -ENODEV; + ext_power = device_get_binding("EXT_POWER"); + if (ext_power == NULL) { + LOG_ERR("Unable to retrieve ext_power device: EXT_POWER"); } #endif @@ -266,7 +262,17 @@ static int zmk_rgb_underglow_init(void) { }; #if IS_ENABLED(CONFIG_SETTINGS) + settings_subsys_init(); + + int err = settings_register(&rgb_conf); + if (err) { + LOG_ERR("Failed to register the ext_power settings handler (err %d)", err); + return err; + } + k_work_init_delayable(&underglow_save_work, zmk_rgb_underglow_save_state_work); + + settings_load_subtree("rgb/underglow"); #endif #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) @@ -280,7 +286,7 @@ static int zmk_rgb_underglow_init(void) { return 0; } -int zmk_rgb_underglow_save_state(void) { +int zmk_rgb_underglow_save_state() { #if IS_ENABLED(CONFIG_SETTINGS) int ret = k_work_reschedule(&underglow_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); return MIN(ret, 0); @@ -297,7 +303,7 @@ int zmk_rgb_underglow_get_state(bool *on_off) { return 0; } -int zmk_rgb_underglow_on(void) { +int zmk_rgb_underglow_on() { if (!led_strip) return -ENODEV; @@ -327,7 +333,7 @@ static void zmk_rgb_underglow_off_handler(struct k_work *work) { K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler); -int zmk_rgb_underglow_off(void) { +int zmk_rgb_underglow_off() { if (!led_strip) return -ENODEV; @@ -370,7 +376,7 @@ int zmk_rgb_underglow_cycle_effect(int direction) { return zmk_rgb_underglow_select_effect(zmk_rgb_underglow_calc_effect(direction)); } -int zmk_rgb_underglow_toggle(void) { +int zmk_rgb_underglow_toggle() { return state.on ? zmk_rgb_underglow_off() : zmk_rgb_underglow_on(); } @@ -462,31 +468,17 @@ int zmk_rgb_underglow_change_spd(int direction) { #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) || \ IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) -struct rgb_underglow_sleep_state { - bool is_awake; - bool rgb_state_before_sleeping; -}; - -static int rgb_underglow_auto_state(bool target_wake_state) { - static struct rgb_underglow_sleep_state sleep_state = { - is_awake : true, - rgb_state_before_sleeping : false - }; - - // wake up event while awake, or sleep event while sleeping -> no-op - if (target_wake_state == sleep_state.is_awake) { +static int rgb_underglow_auto_state(bool *prev_state, bool new_state) { + if (state.on == new_state) { return 0; } - sleep_state.is_awake = target_wake_state; - - if (sleep_state.is_awake) { - if (sleep_state.rgb_state_before_sleeping) { - return zmk_rgb_underglow_on(); - } else { - return zmk_rgb_underglow_off(); - } + if (new_state) { + state.on = *prev_state; + *prev_state = false; + return zmk_rgb_underglow_on(); } else { - sleep_state.rgb_state_before_sleeping = state.on; + state.on = false; + *prev_state = true; return zmk_rgb_underglow_off(); } } @@ -495,13 +487,16 @@ static int rgb_underglow_event_listener(const zmk_event_t *eh) { #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) if (as_zmk_activity_state_changed(eh)) { - return rgb_underglow_auto_state(zmk_activity_get_state() == ZMK_ACTIVITY_ACTIVE); + static bool prev_state = false; + return rgb_underglow_auto_state(&prev_state, + zmk_activity_get_state() == ZMK_ACTIVITY_ACTIVE); } #endif #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) if (as_zmk_usb_conn_state_changed(eh)) { - return rgb_underglow_auto_state(zmk_usb_is_powered()); + static bool prev_state = false; + return rgb_underglow_auto_state(&prev_state, zmk_usb_is_powered()); } #endif diff --git a/app/src/sensors.c b/app/src/sensors.c index e1295de8..60f2bd2a 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -26,22 +26,28 @@ struct sensors_item_cfg { }; #define _SENSOR_ITEM(idx, node) \ - {.dev = DEVICE_DT_GET_OR_NULL(node), \ - .trigger = {.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_ROTATION}, \ - .config = &configs[idx], \ - .sensor_index = idx} + { \ + .dev = DEVICE_DT_GET_OR_NULL(node), \ + .trigger = {.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_ROTATION}, \ + .config = &configs[idx], .sensor_index = idx \ + } #define SENSOR_ITEM(idx, _i) _SENSOR_ITEM(idx, ZMK_KEYMAP_SENSORS_BY_IDX(idx)) #define PLUS_ONE(n) +1 #define ZMK_KEYMAP_SENSORS_CHILD_COUNT (0 DT_FOREACH_CHILD(ZMK_KEYMAP_SENSORS_NODE, PLUS_ONE)) #define SENSOR_CHILD_ITEM(node) \ - {.triggers_per_rotation = \ - DT_PROP_OR(node, triggers_per_rotation, \ - DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ - CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION))} + { \ + .triggers_per_rotation = \ + DT_PROP_OR(node, triggers_per_rotation, \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ + } #define SENSOR_CHILD_DEFAULTS(idx, arg) \ - {.triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ - CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)} + { \ + .triggers_per_rotation = \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION) \ + } static struct zmk_sensor_config configs[] = { #if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 @@ -73,7 +79,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_index) { return; } - struct sensor_value value = {0}; + struct sensor_value value; err = sensor_channel_get(item->dev, item->trigger.chan, &value); if (err) { @@ -81,12 +87,12 @@ static void trigger_sensor_data_for_position(uint32_t sensor_index) { return; } - raise_zmk_sensor_event( + ZMK_EVENT_RAISE(new_zmk_sensor_event( (struct zmk_sensor_event){.sensor_index = item->sensor_index, .channel_data_size = 1, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, - .timestamp = k_uptime_get()}); + .timestamp = k_uptime_get()})); } static void run_sensors_data_trigger(struct k_work *work) { @@ -134,7 +140,7 @@ static void zmk_sensors_init_item(uint8_t i) { #define SENSOR_INIT(idx, _t) zmk_sensors_init_item(idx); -static int zmk_sensors_init(void) { +static int zmk_sensors_init(const struct device *_arg) { LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) return 0; diff --git a/app/src/settings/CMakeLists.txt b/app/src/settings/CMakeLists.txt deleted file mode 100644 index 28664a4e..00000000 --- a/app/src/settings/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2023 The ZMK Contributors -# SPDX-License-Identifier: MIT - -target_sources_ifdef(CONFIG_SETTINGS_NONE app PRIVATE reset_settings_none.c) -target_sources_ifdef(CONFIG_SETTINGS_FCB app PRIVATE reset_settings_fcb.c) -target_sources_ifdef(CONFIG_SETTINGS_FILE app PRIVATE reset_settings_file.c) -target_sources_ifdef(CONFIG_SETTINGS_NVS app PRIVATE reset_settings_nvs.c) - -target_sources_ifdef(CONFIG_ZMK_SETTINGS_RESET_ON_START app PRIVATE reset_settings_on_start.c) diff --git a/app/src/settings/reset_settings_fcb.c b/app/src/settings/reset_settings_fcb.c deleted file mode 100644 index 1d555d34..00000000 --- a/app/src/settings/reset_settings_fcb.c +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -int zmk_settings_erase(void) { - LOG_ERR("Settings reset is not implemented for deprecated FCB backend."); - return -ENOSYS; -} diff --git a/app/src/settings/reset_settings_file.c b/app/src/settings/reset_settings_file.c deleted file mode 100644 index 1d142868..00000000 --- a/app/src/settings/reset_settings_file.c +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#include - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -int zmk_settings_erase(void) { - LOG_INF("Erasing settings file"); - - int rc = fs_unlink(CONFIG_SETTINGS_FS_FILE); - if (rc) { - LOG_ERR("Failed to unlink '%s': %d", CONFIG_SETTINGS_FS_FILE, rc); - } - - return rc; -} diff --git a/app/src/settings/reset_settings_none.c b/app/src/settings/reset_settings_none.c deleted file mode 100644 index c5e0ae04..00000000 --- a/app/src/settings/reset_settings_none.c +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -int zmk_settings_erase(void) { - // No storage backend; nothing to do - return 0; -} diff --git a/app/src/settings/reset_settings_nvs.c b/app/src/settings/reset_settings_nvs.c deleted file mode 100644 index 65157b3d..00000000 --- a/app/src/settings/reset_settings_nvs.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -// SETTINGS_PARTITION must match settings_nvs.c -#if DT_HAS_CHOSEN(zephyr_settings_partition) -#define SETTINGS_PARTITION DT_FIXED_PARTITION_ID(DT_CHOSEN(zephyr_settings_partition)) -#else -#define SETTINGS_PARTITION FIXED_PARTITION_ID(storage_partition) -#endif - -int zmk_settings_erase(void) { - LOG_INF("Erasing settings flash partition"); - - const struct flash_area *fa; - int rc = flash_area_open(SETTINGS_PARTITION, &fa); - if (rc) { - LOG_ERR("Failed to open settings flash: %d", rc); - return rc; - } - - rc = flash_area_erase(fa, 0, fa->fa_size); - if (rc) { - LOG_ERR("Failed to erase settings flash: %d", rc); - } - - flash_area_close(fa); - - return rc; -} diff --git a/app/src/settings/reset_settings_on_start.c b/app/src/settings/reset_settings_on_start.c deleted file mode 100644 index 0f6d4fae..00000000 --- a/app/src/settings/reset_settings_on_start.c +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#include - -// Reset after the kernel is initialized but before any application code to -// ensure settings are cleared before anything tries to use them. -SYS_INIT(zmk_settings_erase, POST_KERNEL, CONFIG_ZMK_SETTINGS_RESET_ON_START_INIT_PRIORITY); diff --git a/app/src/split/CMakeLists.txt b/app/src/split/CMakeLists.txt index 20c73089..27abb82a 100644 --- a/app/src/split/CMakeLists.txt +++ b/app/src/split/CMakeLists.txt @@ -3,16 +3,4 @@ if (CONFIG_ZMK_SPLIT_BLE) add_subdirectory(bluetooth) -endif() - -if (CONFIG_ZMK_SPLIT_WIRED) - add_subdirectory(wired) -endif() - -if (CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - target_sources(app PRIVATE central.c) - zephyr_linker_sources(SECTIONS ../../include/linker/zmk-split-transport-central.ld) -else() - target_sources(app PRIVATE peripheral.c) - zephyr_linker_sources(SECTIONS ../../include/linker/zmk-split-transport-peripheral.ld) endif() \ No newline at end of file diff --git a/app/src/split/Kconfig b/app/src/split/Kconfig index 00ce0840..dbe5f092 100644 --- a/app/src/split/Kconfig +++ b/app/src/split/Kconfig @@ -9,28 +9,18 @@ if ZMK_SPLIT config ZMK_SPLIT_ROLE_CENTRAL bool "Split central device" +choice ZMK_SPLIT_TRANSPORT + prompt "Split transport" + config ZMK_SPLIT_BLE - bool "BLE Split" - default y + bool "BLE" depends on ZMK_BLE select BT_USER_PHY_UPDATE select BT_AUTO_PHY_UPDATE -config ZMK_SPLIT_WIRED - bool "Wired Split" - default y - depends on DT_HAS_ZMK_WIRED_SPLIT_ENABLED - select SERIAL - select RING_BUFFER - select CRC +endchoice -config ZMK_SPLIT_PERIPHERAL_HID_INDICATORS - bool "Peripheral HID Indicators" - depends on ZMK_HID_INDICATORS - help - Enable propagating the HID (LED) Indicator state to the split peripheral(s). - -endif # ZMK_SPLIT +#ZMK_SPLIT +endif rsource "bluetooth/Kconfig" -rsource "wired/Kconfig" diff --git a/app/src/split/Kconfig.defaults b/app/src/split/Kconfig.defaults deleted file mode 100644 index f3827b01..00000000 --- a/app/src/split/Kconfig.defaults +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -rsource "bluetooth/Kconfig.defaults" -rsource "wired/Kconfig.defaults" - diff --git a/app/src/split/bluetooth/CMakeLists.txt b/app/src/split/bluetooth/CMakeLists.txt index f4e12a9d..241a9b8d 100644 --- a/app/src/split/bluetooth/CMakeLists.txt +++ b/app/src/split/bluetooth/CMakeLists.txt @@ -2,13 +2,10 @@ # SPDX-License-Identifier: MIT if (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + target_sources(app PRIVATE split_listener.c) target_sources(app PRIVATE service.c) target_sources(app PRIVATE peripheral.c) endif() if (CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE central.c) -endif() - -if (CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_PROXY) - target_sources(app PRIVATE central_bas_proxy.c) endif() \ No newline at end of file diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index ca0b261f..858e7308 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -5,12 +5,7 @@ if ZMK_SPLIT && ZMK_SPLIT_BLE menu "BLE Transport" -config ZMK_SPLIT_BLE_PRIORITY - int "BLE transport priority" - help - Lower number priorities transports are favored over higher numbers. - -# Added for backwards compatibility. New shields / board should set `ZMK_SPLIT_ROLE_CENTRAL` only. +# Added for backwards compatibility. New shields/board should set `ZMK_SPLIT_ROLE_CENTRAL` only. config ZMK_SPLIT_BLE_ROLE_CENTRAL bool select ZMK_SPLIT_ROLE_CENTRAL @@ -21,34 +16,11 @@ config ZMK_SPLIT_ROLE_CENTRAL select BT_GATT_AUTO_DISCOVER_CCC select BT_SCAN_WITH_IDENTITY -# Bump this value needed for concurrent GATT discovery of splits -config BT_ATT_TX_COUNT - default 10 if ZMK_SPLIT_ROLE_CENTRAL - if ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS int "Number of peripherals that will connect to the central." - -menuconfig ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING - bool "Fetch Peripheral Battery Level Info" - help - Adds internal support for fetching the battery levels from peripherals - and generating events in the ZMK eventing system. - -if ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING - -config ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_QUEUE_SIZE - int "Max number of battery level events to queue when received from peripherals" - default ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS - -config ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_PROXY - bool "Proxy Peripheral Battery Level Info" - help - Adds support for reporting the battery levels of connected split - peripherals through an additional Battery Level service. - -endif + default 1 config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" @@ -80,7 +52,7 @@ if !ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE int "BLE split peripheral notify thread stack size" - default 756 + default 650 config ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY int "BLE split peripheral notify thread priority" @@ -100,8 +72,39 @@ config BT_MAX_CONN config BT_GAP_AUTO_UPDATE_CONN_PARAMS default n -endif # !ZMK_SPLIT_ROLE_CENTRAL +#!ZMK_SPLIT_ROLE_CENTRAL +endif endmenu -endif # ZMK_SPLIT_BLE +#ZMK_SPLIT_BLE +endif + + +if ZMK_BLE + +if ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL + +config BT_MAX_CONN + default 6 + +config BT_MAX_PAIRED + default 6 + +#ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL +endif + +if !ZMK_SPLIT_BLE + +config BT_MAX_CONN + default 5 + +config BT_MAX_PAIRED + default 5 + +#!ZMK_SPLIT_BLE +endif + +#ZMK_BLE +endif + diff --git a/app/src/split/bluetooth/Kconfig.defaults b/app/src/split/bluetooth/Kconfig.defaults deleted file mode 100644 index 85bd4d62..00000000 --- a/app/src/split/bluetooth/Kconfig.defaults +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if ZMK_BLE - -if ZMK_SPLIT_BLE - -config ZMK_SPLIT_BLE_PRIORITY - default 1 - -if ZMK_SPLIT_ROLE_CENTRAL - -config ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS - default 1 - -config BT_MAX_CONN - default 6 - -config BT_MAX_PAIRED - default 6 - -#ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL -endif - -endif - -if !ZMK_SPLIT_BLE - -config BT_MAX_CONN - default 5 - -config BT_MAX_PAIRED - default 5 - -#!ZMK_SPLIT_BLE -endif - -#ZMK_BLE -endif - diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index b4b61ce7..860e89a5 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -23,16 +22,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include #include #include #include #include #include -#include -#include -#include -#include static int start_scanning(void); @@ -52,101 +46,26 @@ struct peripheral_slot { struct bt_gatt_subscribe_params sensor_subscribe_params; struct bt_gatt_discover_params sub_discover_params; uint16_t run_behavior_handle; -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - struct bt_gatt_subscribe_params batt_lvl_subscribe_params; - struct bt_gatt_read_params batt_lvl_read_params; -#endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) */ -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - uint16_t update_hid_indicators; -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - uint16_t selected_physical_layout_handle; uint8_t position_state[POSITION_STATE_DATA_LEN]; uint8_t changed_positions[POSITION_STATE_DATA_LEN]; }; -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - -static const struct bt_uuid *gatt_ccc_uuid = BT_UUID_GATT_CCC; -static const struct bt_uuid *gatt_cpf_uuid = BT_UUID_GATT_CPF; - -struct peripheral_input_slot { - struct bt_conn *conn; - struct bt_gatt_subscribe_params sub; - uint8_t reg; -}; - -#define COUNT_INPUT_SPLIT(n) +1 - -static struct peripheral_input_slot - peripheral_input_slots[(0 DT_FOREACH_STATUS_OKAY(zmk_input_split, COUNT_INPUT_SPLIT))]; - -static bool input_slot_is_open(size_t i) { - return i < ARRAY_SIZE(peripheral_input_slots) && peripheral_input_slots[i].conn == NULL; -} - -static bool input_slot_is_pending(size_t i) { - return i < ARRAY_SIZE(peripheral_input_slots) && peripheral_input_slots[i].conn != NULL && - (!peripheral_input_slots[i].sub.value_handle || - !peripheral_input_slots[i].sub.ccc_handle || !peripheral_input_slots[i].reg); -} - -static int reserve_next_open_input_slot(struct peripheral_input_slot **slot, struct bt_conn *conn) { - for (size_t i = 0; i < ARRAY_SIZE(peripheral_input_slots); i++) { - if (input_slot_is_open(i)) { - peripheral_input_slots[i].conn = conn; - - // Clear out any previously set values - peripheral_input_slots[i].sub.value_handle = 0; - peripheral_input_slots[i].sub.ccc_handle = 0; - peripheral_input_slots[i].reg = 0; - *slot = &peripheral_input_slots[i]; - return i; - } - } - - return -ENOMEM; -} - -static int find_pending_input_slot(struct peripheral_input_slot **slot, struct bt_conn *conn) { - for (size_t i = 0; i < ARRAY_SIZE(peripheral_input_slots); i++) { - if (peripheral_input_slots[i].conn == conn && input_slot_is_pending(i)) { - *slot = &peripheral_input_slots[i]; - return i; - } - } - - return -ENODEV; -} - -void release_peripheral_input_subs(struct bt_conn *conn) { - for (size_t i = 0; i < ARRAY_SIZE(peripheral_input_slots); i++) { - if (peripheral_input_slots[i].conn == conn) { - peripheral_input_slots[i].conn = NULL; - zmk_input_split_peripheral_disconnected(peripheral_input_slots[i].reg); - } - } -} - -#endif // IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - -static zmk_split_transport_central_status_changed_cb_t transport_status_cb; -static bool is_enabled; - static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; static bool is_scanning = false; static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); -struct peripheral_event_wrapper { - uint8_t source; - struct zmk_split_transport_peripheral_event event; -}; - -K_MSGQ_DEFINE(peripheral_event_msgq, sizeof(struct peripheral_event_wrapper), +K_MSGQ_DEFINE(peripheral_event_msgq, sizeof(struct zmk_position_state_changed), CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE, 4); -void peripheral_event_work_callback(struct k_work *work); +void peripheral_event_work_callback(struct k_work *work) { + struct zmk_position_state_changed ev; + while (k_msgq_get(&peripheral_event_msgq, &ev, K_NO_WAIT) == 0) { + LOG_DBG("Trigger key position state change for %d", ev.position); + ZMK_EVENT_RAISE(new_zmk_position_state_changed(ev)); + } +} K_WORK_DEFINE(peripheral_event_work, peripheral_event_work_callback); @@ -193,13 +112,10 @@ int release_peripheral_slot(int index) { for (int j = 0; j < 8; j++) { if (slot->position_state[i] & BIT(j)) { uint32_t position = (i * 8) + j; - struct peripheral_event_wrapper ev = { - .source = index, - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT, - .data = {.key_position_event = { - .position = position, - .pressed = false, - }}}}; + struct zmk_position_state_changed ev = {.source = index, + .position = position, + .state = false, + .timestamp = k_uptime_get()}; k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); k_work_submit(&peripheral_event_work); @@ -215,10 +131,6 @@ int release_peripheral_slot(int index) { // Clean up previously discovered handles; slot->subscribe_params.value_handle = 0; slot->run_behavior_handle = 0; - slot->selected_physical_layout_handle = 0; -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - slot->update_hid_indicators = 0; -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) return 0; } @@ -256,13 +168,19 @@ int confirm_peripheral_slot_conn(struct bt_conn *conn) { return 0; } -static void notify_transport_status(void); - -static void notify_status_work_cb(struct k_work *_work) { notify_transport_status(); } - -static K_WORK_DEFINE(notify_status_work, notify_status_work_cb); - #if ZMK_KEYMAP_HAS_SENSORS +K_MSGQ_DEFINE(peripheral_sensor_event_msgq, sizeof(struct zmk_sensor_event), + CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE, 4); + +void peripheral_sensor_event_work_callback(struct k_work *work) { + struct zmk_sensor_event ev; + while (k_msgq_get(&peripheral_sensor_event_msgq, &ev, K_NO_WAIT) == 0) { + LOG_DBG("Trigger sensor change for %d", ev.sensor_index); + ZMK_EVENT_RAISE(new_zmk_sensor_event(ev)); + } +} + +K_WORK_DEFINE(peripheral_sensor_event_work, peripheral_sensor_event_work_callback); static uint8_t split_central_sensor_notify_func(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, @@ -282,70 +200,20 @@ static uint8_t split_central_sensor_notify_func(struct bt_conn *conn, struct sensor_event sensor_event; memcpy(&sensor_event, data, MIN(length, sizeof(sensor_event))); - if (sensor_event.channel_data_size != 1) { - return BT_GATT_ITER_STOP; - } + struct zmk_sensor_event ev = { + .sensor_index = sensor_event.sensor_index, + .channel_data_size = MIN(sensor_event.channel_data_size, ZMK_SENSOR_EVENT_MAX_CHANNELS), + .timestamp = k_uptime_get()}; - struct peripheral_event_wrapper event_wrapper = { - .source = peripheral_slot_index_for_conn(conn), - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_SENSOR_EVENT, - .data = {.sensor_event = { - .channel_data = sensor_event.channel_data[0], - .sensor_index = sensor_event.sensor_index, - }}}}; - - k_msgq_put(&peripheral_event_msgq, &event_wrapper, K_NO_WAIT); - k_work_submit(&peripheral_event_work); + memcpy(ev.channel_data, sensor_event.channel_data, + sizeof(struct zmk_sensor_channel_data) * sensor_event.channel_data_size); + k_msgq_put(&peripheral_sensor_event_msgq, &ev, K_NO_WAIT); + k_work_submit(&peripheral_sensor_event_work); return BT_GATT_ITER_CONTINUE; } #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - -static uint8_t peripheral_input_event_notify_cb(struct bt_conn *conn, - struct bt_gatt_subscribe_params *params, - const void *data, uint16_t length) { - if (!data) { - LOG_DBG("[UNSUBSCRIBED]"); - params->value_handle = 0U; - return BT_GATT_ITER_STOP; - } - - LOG_DBG("[INPUT EVENT] data %p length %u", data, length); - - if (length != sizeof(struct zmk_split_input_event_payload)) { - LOG_WRN("Ignoring input event notify with incorrect data length (%d)", length); - return BT_GATT_ITER_STOP; - } - - struct zmk_split_input_event_payload payload; - memcpy(&payload, data, MIN(length, sizeof(struct zmk_split_input_event_payload))); - - for (size_t i = 0; i < ARRAY_SIZE(peripheral_input_slots); i++) { - if (&peripheral_input_slots[i].sub == params) { - struct peripheral_event_wrapper event_wrapper = { - .source = peripheral_slot_index_for_conn(conn), - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_INPUT_EVENT, - .data = {.input_event = { - .reg = peripheral_input_slots[i].reg, - .sync = payload.sync, - .code = payload.code, - .type = payload.type, - .value = payload.value, - }}}}; - - k_msgq_put(&peripheral_event_msgq, &event_wrapper, K_NO_WAIT); - k_work_submit(&peripheral_event_work); - break; - } - } - - return BT_GATT_ITER_CONTINUE; -} - -#endif - static uint8_t split_central_notify_func(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, const void *data, uint16_t length) { @@ -367,21 +235,20 @@ static uint8_t split_central_notify_func(struct bt_conn *conn, for (int i = 0; i < POSITION_STATE_DATA_LEN; i++) { slot->changed_positions[i] = ((uint8_t *)data)[i] ^ slot->position_state[i]; slot->position_state[i] = ((uint8_t *)data)[i]; + LOG_DBG("data: %d", slot->position_state[i]); } - LOG_HEXDUMP_DBG(slot->position_state, POSITION_STATE_DATA_LEN, "data"); for (int i = 0; i < POSITION_STATE_DATA_LEN; i++) { for (int j = 0; j < 8; j++) { if (slot->changed_positions[i] & BIT(j)) { uint32_t position = (i * 8) + j; bool pressed = slot->position_state[i] & BIT(j); - struct peripheral_event_wrapper ev = { - .source = peripheral_slot_index_for_conn(conn), - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT, - .data = {.key_position_event = { - .position = position, - .pressed = pressed, - }}}}; + struct zmk_position_state_changed ev = {.source = + peripheral_slot_index_for_conn(conn), + .position = position, + .state = pressed, + .timestamp = k_uptime_get()}; + k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); k_work_submit(&peripheral_event_work); } @@ -391,94 +258,7 @@ static uint8_t split_central_notify_func(struct bt_conn *conn, return BT_GATT_ITER_CONTINUE; } -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -static uint8_t split_central_battery_level_notify_func(struct bt_conn *conn, - struct bt_gatt_subscribe_params *params, - const void *data, uint16_t length) { - struct peripheral_slot *slot = peripheral_slot_for_conn(conn); - - if (!slot) { - LOG_ERR("No peripheral state found for connection"); - return BT_GATT_ITER_CONTINUE; - } - - if (!data) { - LOG_DBG("[UNSUBSCRIBED]"); - params->value_handle = 0U; - return BT_GATT_ITER_STOP; - } - - if (length == 0) { - LOG_ERR("Zero length battery notification received"); - return BT_GATT_ITER_CONTINUE; - } - - LOG_DBG("[BATTERY LEVEL NOTIFICATION] data %p length %u", data, length); - uint8_t battery_level = ((uint8_t *)data)[0]; - LOG_DBG("Battery level: %u", battery_level); - - struct peripheral_event_wrapper ev = { - .source = peripheral_slot_index_for_conn(conn), - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT, - .data = {.battery_event = { - .level = battery_level, - }}}}; - - k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); - k_work_submit(&peripheral_event_work); - - return BT_GATT_ITER_CONTINUE; -} - -static uint8_t split_central_battery_level_read_func(struct bt_conn *conn, uint8_t err, - struct bt_gatt_read_params *params, - const void *data, uint16_t length) { - if (err > 0) { - LOG_ERR("Error during reading peripheral battery level: %u", err); - return BT_GATT_ITER_STOP; - } - - struct peripheral_slot *slot = peripheral_slot_for_conn(conn); - - if (!slot) { - LOG_ERR("No peripheral state found for connection"); - return BT_GATT_ITER_CONTINUE; - } - - if (!data) { - LOG_DBG("[READ COMPLETED]"); - return BT_GATT_ITER_STOP; - } - - LOG_DBG("[BATTERY LEVEL READ] data %p length %u", data, length); - - if (length == 0) { - LOG_ERR("Zero length battery notification received"); - return BT_GATT_ITER_CONTINUE; - } - - uint8_t battery_level = ((uint8_t *)data)[0]; - - LOG_DBG("Battery level: %u", battery_level); - - struct peripheral_event_wrapper ev = { - .source = peripheral_slot_index_for_conn(conn), - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT, - .data = {.battery_event = { - .level = battery_level, - }}}}; - - k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); - k_work_submit(&peripheral_event_work); - - return BT_GATT_ITER_CONTINUE; -} - -#endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) */ - static int split_central_subscribe(struct bt_conn *conn, struct bt_gatt_subscribe_params *params) { - atomic_set(params->flags, BT_GATT_SUBSCRIBE_FLAG_NO_RESUB); int err = bt_gatt_subscribe(conn, params); switch (err) { case -EALREADY: @@ -495,46 +275,6 @@ static int split_central_subscribe(struct bt_conn *conn, struct bt_gatt_subscrib return err; } -static int update_peripheral_selected_layout(struct peripheral_slot *slot, uint8_t layout_idx) { - if (slot->state != PERIPHERAL_SLOT_STATE_CONNECTED) { - return -ENOTCONN; - } - - if (slot->selected_physical_layout_handle == 0) { - // It appears that sometimes the peripheral is considered connected - // before the GATT characteristics have been discovered. If this is - // the case, the selected_physical_layout_handle will not yet be set. - return -EAGAIN; - } - - if (bt_conn_get_security(slot->conn) < BT_SECURITY_L2) { - return -EAGAIN; - } - - int err = bt_gatt_write_without_response(slot->conn, slot->selected_physical_layout_handle, - &layout_idx, sizeof(layout_idx), true); - - if (err < 0) { - LOG_ERR("Failed to write physical layout index to peripheral (err %d)", err); - } - - return err; -} - -static void update_peripherals_selected_physical_layout(struct k_work *_work) { - uint8_t layout_idx = zmk_physical_layouts_get_selected(); - for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { - if (peripherals[i].state != PERIPHERAL_SLOT_STATE_CONNECTED) { - continue; - } - - update_peripheral_selected_layout(&peripherals[i], layout_idx); - } -} - -K_WORK_DEFINE(update_peripherals_selected_layouts_work, - update_peripherals_selected_physical_layout); - static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, const struct bt_gatt_attr *attr, struct bt_gatt_discover_params *params) { @@ -555,158 +295,47 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, } LOG_DBG("[ATTRIBUTE] handle %u", attr->handle); - switch (params->type) { - case BT_GATT_DISCOVER_CHARACTERISTIC: { - const struct bt_uuid *chrc_uuid = ((struct bt_gatt_chrc *)attr->user_data)->uuid; + const struct bt_uuid *chrc_uuid = ((struct bt_gatt_chrc *)attr->user_data)->uuid; - if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID)) == - 0) { - LOG_DBG("Found position state characteristic"); - slot->subscribe_params.disc_params = &slot->sub_discover_params; - slot->subscribe_params.end_handle = slot->discover_params.end_handle; - slot->subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); - slot->subscribe_params.notify = split_central_notify_func; - slot->subscribe_params.value = BT_GATT_CCC_NOTIFY; - split_central_subscribe(conn, &slot->subscribe_params); + if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID)) == 0) { + LOG_DBG("Found position state characteristic"); + slot->discover_params.uuid = NULL; + slot->discover_params.start_handle = attr->handle + 2; + slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; + + slot->subscribe_params.disc_params = &slot->sub_discover_params; + slot->subscribe_params.end_handle = slot->discover_params.end_handle; + slot->subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); + slot->subscribe_params.notify = split_central_notify_func; + slot->subscribe_params.value = BT_GATT_CCC_NOTIFY; + split_central_subscribe(conn, &slot->subscribe_params); #if ZMK_KEYMAP_HAS_SENSORS - } else if (bt_uuid_cmp(chrc_uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID)) == 0) { - slot->discover_params.uuid = NULL; - slot->discover_params.start_handle = attr->handle + 2; - slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; + } else if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID)) == + 0) { + slot->discover_params.uuid = NULL; + slot->discover_params.start_handle = attr->handle + 2; + slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; - slot->sensor_subscribe_params.disc_params = &slot->sub_discover_params; - slot->sensor_subscribe_params.end_handle = slot->discover_params.end_handle; - slot->sensor_subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); - slot->sensor_subscribe_params.notify = split_central_sensor_notify_func; - slot->sensor_subscribe_params.value = BT_GATT_CCC_NOTIFY; - split_central_subscribe(conn, &slot->sensor_subscribe_params); + slot->sensor_subscribe_params.disc_params = &slot->sub_discover_params; + slot->sensor_subscribe_params.end_handle = slot->discover_params.end_handle; + slot->sensor_subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); + slot->sensor_subscribe_params.notify = split_central_sensor_notify_func; + slot->sensor_subscribe_params.value = BT_GATT_CCC_NOTIFY; + split_central_subscribe(conn, &slot->sensor_subscribe_params); #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - } else if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_INPUT_EVENT_UUID)) == - 0) { - LOG_DBG("Found an input characteristic"); - struct peripheral_input_slot *input_slot; - int ret = reserve_next_open_input_slot(&input_slot, conn); - if (ret < 0) { - LOG_WRN("No available slot for peripheral input subscriptions (%d)", ret); - - slot->discover_params.uuid = NULL; - slot->discover_params.start_handle = attr->handle + 1; - slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; - } else { - LOG_DBG("Reserved a slot for the input subscription"); - input_slot->sub.value_handle = bt_gatt_attr_value_handle(attr); - - slot->discover_params.uuid = gatt_ccc_uuid; - slot->discover_params.start_handle = attr->handle; - slot->discover_params.type = BT_GATT_DISCOVER_STD_CHAR_DESC; - } -#endif // IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - } else if (bt_uuid_cmp(chrc_uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID)) == 0) { - LOG_DBG("Found run behavior handle"); - slot->discover_params.uuid = NULL; - slot->discover_params.start_handle = attr->handle + 2; - slot->run_behavior_handle = bt_gatt_attr_value_handle(attr); - } else if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SELECT_PHYS_LAYOUT_UUID))) { - LOG_DBG("Found select physical layout handle"); - slot->selected_physical_layout_handle = bt_gatt_attr_value_handle(attr); - k_work_submit(&update_peripherals_selected_layouts_work); -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - } else if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_UPDATE_HID_INDICATORS_UUID))) { - LOG_DBG("Found update HID indicators handle"); - slot->update_hid_indicators = bt_gatt_attr_value_handle(attr); -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - } else if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_BAS_BATTERY_LEVEL)) { - LOG_DBG("Found battery level characteristics"); - slot->batt_lvl_subscribe_params.disc_params = &slot->sub_discover_params; - slot->batt_lvl_subscribe_params.end_handle = slot->discover_params.end_handle; - slot->batt_lvl_subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); - slot->batt_lvl_subscribe_params.notify = split_central_battery_level_notify_func; - slot->batt_lvl_subscribe_params.value = BT_GATT_CCC_NOTIFY; - split_central_subscribe(conn, &slot->batt_lvl_subscribe_params); - - slot->batt_lvl_read_params.func = split_central_battery_level_read_func; - slot->batt_lvl_read_params.handle_count = 1; - slot->batt_lvl_read_params.single.handle = bt_gatt_attr_value_handle(attr); - slot->batt_lvl_read_params.single.offset = 0; - bt_gatt_read(conn, &slot->batt_lvl_read_params); -#endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) */ - } - break; - } - case BT_GATT_DISCOVER_STD_CHAR_DESC: -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - if (bt_uuid_cmp(slot->discover_params.uuid, BT_UUID_GATT_CCC) == 0) { - LOG_DBG("Found input CCC descriptor"); - struct peripheral_input_slot *input_slot; - int ret = find_pending_input_slot(&input_slot, conn); - if (ret < 0) { - LOG_DBG("No pending input slot (%d)", ret); - slot->discover_params.uuid = NULL; - slot->discover_params.start_handle = attr->handle + 1; - slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; - } else { - LOG_DBG("Found pending input slot"); - input_slot->sub.ccc_handle = attr->handle; - - slot->discover_params.uuid = gatt_cpf_uuid; - slot->discover_params.start_handle = attr->handle + 1; - slot->discover_params.type = BT_GATT_DISCOVER_STD_CHAR_DESC; - } - } else if (bt_uuid_cmp(slot->discover_params.uuid, BT_UUID_GATT_CPF) == 0) { - LOG_DBG("Found input CPF descriptor"); - struct bt_gatt_cpf *cpf = attr->user_data; - struct peripheral_input_slot *input_slot; - int ret = find_pending_input_slot(&input_slot, conn); - if (ret < 0) { - LOG_DBG("No pending input slot (%d)", ret); - } else { - LOG_DBG("Found pending input slot"); - input_slot->reg = cpf->description; - input_slot->sub.notify = peripheral_input_event_notify_cb; - input_slot->sub.value = BT_GATT_CCC_NOTIFY; - int err = split_central_subscribe(conn, &input_slot->sub); - if (err < 0) { - LOG_WRN("Failed to subscribe to input notifications %d", err); - } - } - - slot->discover_params.uuid = NULL; - slot->discover_params.start_handle = attr->handle + 1; - slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; - } -#endif // IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - break; + } else if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID)) == + 0) { + LOG_DBG("Found run behavior handle"); + slot->discover_params.uuid = NULL; + slot->discover_params.start_handle = attr->handle + 2; + slot->run_behavior_handle = bt_gatt_attr_value_handle(attr); } - bool subscribed = slot->run_behavior_handle && slot->subscribe_params.value_handle && - slot->selected_physical_layout_handle; - + bool subscribed = slot->run_behavior_handle && slot->subscribe_params.value_handle; #if ZMK_KEYMAP_HAS_SENSORS subscribed = subscribed && slot->sensor_subscribe_params.value_handle; #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - subscribed = subscribed && slot->update_hid_indicators; -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - subscribed = subscribed && slot->batt_lvl_subscribe_params.value_handle; -#endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) */ -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - for (size_t i = 0; i < ARRAY_SIZE(peripheral_input_slots); i++) { - if (input_slot_is_open(i) || input_slot_is_pending(i)) { - subscribed = false; - break; - } - } -#endif // IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - return subscribed ? BT_GATT_ITER_STOP : BT_GATT_ITER_CONTINUE; } @@ -736,6 +365,7 @@ static uint8_t split_central_service_discovery_func(struct bt_conn *conn, LOG_DBG("Found split service"); slot->discover_params.uuid = NULL; slot->discover_params.func = split_central_chrc_discovery_func; + slot->discover_params.start_handle = attr->handle + 1; slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; int err = bt_gatt_discover(conn, &slot->discover_params); @@ -750,6 +380,12 @@ static void split_central_process_connection(struct bt_conn *conn) { LOG_DBG("Current security for connection: %d", bt_conn_get_security(conn)); + err = bt_conn_set_security(conn, BT_SECURITY_L2); + if (err) { + LOG_ERR("Failed to set security (reason %d)", err); + return; + } + struct peripheral_slot *slot = peripheral_slot_for_conn(conn); if (slot == NULL) { LOG_ERR("No peripheral state found for connection"); @@ -781,7 +417,7 @@ static void split_central_process_connection(struct bt_conn *conn) { start_scanning(); } -static int stop_scanning(void) { +static int stop_scanning() { LOG_DBG("Stopping peripheral scanning"); is_scanning = false; @@ -813,7 +449,7 @@ static bool split_central_eir_found(const bt_addr_le_t *addr) { return false; } - LOG_DBG("Initiating new connection"); + LOG_DBG("Initiating new connnection"); struct bt_le_conn_param *param = BT_LE_CONN_PARAM(CONFIG_ZMK_SPLIT_BLE_PREF_INT, CONFIG_ZMK_SPLIT_BLE_PREF_INT, CONFIG_ZMK_SPLIT_BLE_PREF_LATENCY, CONFIG_ZMK_SPLIT_BLE_PREF_TIMEOUT); @@ -883,11 +519,6 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui } static int start_scanning(void) { - if (!is_enabled) { - LOG_DBG("Not scanning, we're disabled"); - return 0; - } - // No action is necessary if central is already scanning. if (is_scanning) { LOG_DBG("Scanning already running"); @@ -945,7 +576,6 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { confirm_peripheral_slot_conn(conn); split_central_process_connection(conn); - k_work_submit(¬ify_status_work); } static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { @@ -956,57 +586,18 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { LOG_DBG("Disconnected: %s (reason %d)", addr, reason); -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - struct peripheral_event_wrapper ev = { - .source = peripheral_slot_index_for_conn(conn), - .event = {.type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT, - .data = {.battery_event = { - .level = 0, - }}}}; - - k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); - k_work_submit(&peripheral_event_work); -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - release_peripheral_input_subs(conn); -#endif - err = release_peripheral_slot_for_conn(conn); if (err < 0) { - LOG_WRN("Failed to release peripheral slot (%d)", err); + return; } - k_work_submit(¬ify_status_work); - start_scanning(); } -static void split_central_security_changed(struct bt_conn *conn, bt_security_t level, - enum bt_security_err err) { - struct peripheral_slot *slot = peripheral_slot_for_conn(conn); - if (!slot || !slot->selected_physical_layout_handle) { - return; - } - - if (err > 0) { - LOG_DBG("Skipping updating the physical layout for peripheral with security error"); - return; - } - - if (level < BT_SECURITY_L2) { - LOG_DBG("Skipping updating the physical layout for peripheral with insufficient security"); - return; - } - - k_work_submit(&update_peripherals_selected_layouts_work); -} - static struct bt_conn_cb conn_callbacks = { .connected = split_central_connected, .disconnected = split_central_disconnected, - .security_changed = split_central_security_changed, }; K_THREAD_STACK_DEFINE(split_central_split_run_q_stack, @@ -1014,16 +605,17 @@ K_THREAD_STACK_DEFINE(split_central_split_run_q_stack, struct k_work_q split_central_split_run_q; -struct central_cmd_wrapper { +struct zmk_split_run_behavior_payload_wrapper { uint8_t source; - struct zmk_split_transport_central_command cmd; + struct zmk_split_run_behavior_payload payload; }; -K_MSGQ_DEFINE(zmk_split_central_split_run_msgq, sizeof(struct central_cmd_wrapper), +K_MSGQ_DEFINE(zmk_split_central_split_run_msgq, + sizeof(struct zmk_split_run_behavior_payload_wrapper), CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); void split_central_split_run_callback(struct k_work *work) { - struct central_cmd_wrapper payload_wrapper; + struct zmk_split_run_behavior_payload_wrapper payload_wrapper; LOG_DBG(""); @@ -1032,85 +624,34 @@ void split_central_split_run_callback(struct k_work *work) { LOG_ERR("Source not connected"); continue; } - - switch (payload_wrapper.cmd.type) { - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR: { - if (!peripherals[payload_wrapper.source].run_behavior_handle) { - LOG_ERR("Run behavior handle not found"); - continue; - } - - struct zmk_split_run_behavior_payload payload = { - .data = { - .param1 = payload_wrapper.cmd.data.invoke_behavior.param1, - .param2 = payload_wrapper.cmd.data.invoke_behavior.param2, - .position = payload_wrapper.cmd.data.invoke_behavior.position, - .source = payload_wrapper.cmd.data.invoke_behavior.event_source, - .state = payload_wrapper.cmd.data.invoke_behavior.state ? 1 : 0, - }}; - const size_t payload_dev_size = sizeof(payload.behavior_dev); - if (strlcpy(payload.behavior_dev, payload_wrapper.cmd.data.invoke_behavior.behavior_dev, - payload_dev_size) >= payload_dev_size) { - LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", - payload_wrapper.cmd.data.invoke_behavior.behavior_dev, - payload.behavior_dev); - } - - int err = bt_gatt_write_without_response( - peripherals[payload_wrapper.source].conn, - peripherals[payload_wrapper.source].run_behavior_handle, &payload, - sizeof(struct zmk_split_run_behavior_payload), true); - - if (err) { - LOG_ERR("Failed to write the behavior characteristic (err %d)", err); - } - break; + if (!peripherals[payload_wrapper.source].run_behavior_handle) { + LOG_ERR("Run behavior handle not found"); + continue; } - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_PHYSICAL_LAYOUT: - update_peripheral_selected_layout( - &peripherals[payload_wrapper.source], - payload_wrapper.cmd.data.set_physical_layout.layout_idx); - break; -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_HID_INDICATORS: - LOG_WRN("do the indicators dance"); - if (peripherals[payload_wrapper.source].update_hid_indicators == 0) { - // It appears that sometimes the peripheral is considered connected - // before the GATT characteristics have been discovered. If this is - // the case, the update_hid_indicators handle will not yet be set. - LOG_WRN("NO HANDLE TO SET ON PERIPHERAL"); - break; - } - int err = bt_gatt_write_without_response( - peripherals[payload_wrapper.source].conn, - peripherals[payload_wrapper.source].update_hid_indicators, - &payload_wrapper.cmd.data.set_hid_indicators.indicators, - sizeof(payload_wrapper.cmd.data.set_hid_indicators.indicators), true); + int err = bt_gatt_write_without_response( + peripherals[payload_wrapper.source].conn, + peripherals[payload_wrapper.source].run_behavior_handle, &payload_wrapper.payload, + sizeof(struct zmk_split_run_behavior_payload), true); - if (err) { - LOG_ERR("Failed to write HID indicator characteristic (err %d)", err); - } - break; -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - default: - LOG_WRN("Unsupported wrapped central command type %d", payload_wrapper.cmd.type); - return; + if (err) { + LOG_ERR("Failed to write the behavior characteristic (err %d)", err); } } } K_WORK_DEFINE(split_central_split_run_work, split_central_split_run_callback); -static int split_bt_invoke_behavior_payload(struct central_cmd_wrapper payload_wrapper) { +static int +split_bt_invoke_behavior_payload(struct zmk_split_run_behavior_payload_wrapper payload_wrapper) { LOG_DBG(""); int err = k_msgq_put(&zmk_split_central_split_run_msgq, &payload_wrapper, K_MSEC(100)); if (err) { switch (err) { case -EAGAIN: { - LOG_WRN("Run command message queue full, popping first message and queueing again"); - struct central_cmd_wrapper discarded_report; + LOG_WRN("Consumer message queue full, popping first message and queueing again"); + struct zmk_split_run_behavior_payload_wrapper discarded_report; k_msgq_get(&zmk_split_central_split_run_msgq, &discarded_report, K_NO_WAIT); return split_bt_invoke_behavior_payload(payload_wrapper); } @@ -1125,166 +666,32 @@ static int split_bt_invoke_behavior_payload(struct central_cmd_wrapper payload_w return 0; }; -static int finish_init(); +int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, bool state) { + struct zmk_split_run_behavior_payload payload = {.data = { + .param1 = binding->param1, + .param2 = binding->param2, + .position = event.position, + .state = state ? 1 : 0, + }}; + const size_t payload_dev_size = sizeof(payload.behavior_dev); + if (strlcpy(payload.behavior_dev, binding->behavior_dev, payload_dev_size) >= + payload_dev_size) { + LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", + binding->behavior_dev, payload.behavior_dev); + } -static bool settings_loaded = false; - -#if IS_ENABLED(CONFIG_SETTINGS) - -static int central_ble_handle_set(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { - return 0; + struct zmk_split_run_behavior_payload_wrapper wrapper = {.source = source, .payload = payload}; + return split_bt_invoke_behavior_payload(wrapper); } -static struct settings_handler ble_central_settings_handler = { - .name = "ble_central", .h_set = central_ble_handle_set, .h_commit = finish_init}; - -#endif // IS_ENABLED(CONFIG_SETTINGS) - -static int zmk_split_bt_central_init(void) { +int zmk_split_bt_central_init(const struct device *_arg) { k_work_queue_start(&split_central_split_run_q, split_central_split_run_q_stack, K_THREAD_STACK_SIZEOF(split_central_split_run_q_stack), CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); -#if IS_ENABLED(CONFIG_SETTINGS) - settings_register(&ble_central_settings_handler); - return 0; -#else - return finish_init(); -#endif // IS_ENABLED(CONFIG_SETTINGS) + return IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) ? 0 : start_scanning(); } SYS_INIT(zmk_split_bt_central_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); - -static int zmk_split_bt_central_listener_cb(const zmk_event_t *eh) { - if (as_zmk_physical_layout_selection_changed(eh)) { - k_work_submit(&update_peripherals_selected_layouts_work); - } - return ZMK_EV_EVENT_BUBBLE; -} - -ZMK_LISTENER(zmk_split_bt_central, zmk_split_bt_central_listener_cb); -ZMK_SUBSCRIPTION(zmk_split_bt_central, zmk_physical_layout_selection_changed); - -static int split_central_bt_send_command(uint8_t source, - struct zmk_split_transport_central_command cmd) { - if (source >= ARRAY_SIZE(peripherals)) { - return -EINVAL; - } - - switch (cmd.type) { - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_HID_INDICATORS: - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_PHYSICAL_LAYOUT: - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR: { - struct central_cmd_wrapper wrapper = {.source = source, .cmd = cmd}; - return split_bt_invoke_behavior_payload(wrapper); - } - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_POLL_EVENTS: - return -ENOTSUP; - default: - return -ENOTSUP; - } - - return 0; -} - -static int split_central_bt_get_available_source_ids(uint8_t *sources) { - int count = 0; - for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { - if (peripherals[i].state != PERIPHERAL_SLOT_STATE_CONNECTED) { - continue; - } - - sources[count++] = i; - } - - return count; -} - -static int split_central_bt_set_enabled(bool enabled) { - is_enabled = enabled; - if (enabled) { - return start_scanning(); - } else { - int err = stop_scanning(); - if (err < 0) { - LOG_WRN("Failed to stop scanning for peripherals (%d)", err); - } - - for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { - if (peripherals[i].state != PERIPHERAL_SLOT_STATE_CONNECTED) { - continue; - } - - err = bt_conn_disconnect(peripherals[i].conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); - if (err < 0) { - LOG_WRN("Failed to disconnect a peripheral (%d)", err); - } - } - - return 0; - } -} - -static int -split_central_bt_set_status_callback(zmk_split_transport_central_status_changed_cb_t cb) { - transport_status_cb = cb; - return 0; -} - -static struct zmk_split_transport_status split_central_bt_get_status() { - uint8_t _source_ids[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; - - int count = split_central_bt_get_available_source_ids(_source_ids); - - enum zmk_split_transport_connections_status conn_status; - - if (count == 0) { - conn_status = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED; - } else if (count == ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { - conn_status = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_ALL_CONNECTED; - } else { - conn_status = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_SOME_CONNECTED; - } - - return (struct zmk_split_transport_status){ - .available = !IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) && settings_loaded, - .enabled = is_enabled, - .connections = conn_status, - }; -} - -static const struct zmk_split_transport_central_api central_api = { - .send_command = split_central_bt_send_command, - .get_available_source_ids = split_central_bt_get_available_source_ids, - .set_enabled = split_central_bt_set_enabled, - .set_status_callback = split_central_bt_set_status_callback, - .get_status = split_central_bt_get_status, -}; - -ZMK_SPLIT_TRANSPORT_CENTRAL_REGISTER(bt_central, ¢ral_api, CONFIG_ZMK_SPLIT_BLE_PRIORITY); - -static void notify_transport_status(void) { - if (transport_status_cb) { - transport_status_cb(&bt_central, split_central_bt_get_status()); - } -} - -static int finish_init() { - settings_loaded = true; - - if (!transport_status_cb) { - return 0; - } - - return transport_status_cb(&bt_central, split_central_bt_get_status()); -} - -void peripheral_event_work_callback(struct k_work *work) { - struct peripheral_event_wrapper ev; - while (k_msgq_get(&peripheral_event_msgq, &ev, K_NO_WAIT) == 0) { - LOG_DBG("Trigger key position state change of type %d", ev.event.type); - zmk_split_transport_central_peripheral_event_handler(&bt_central, ev.source, ev.event); - } -} diff --git a/app/src/split/bluetooth/central_bas_proxy.c b/app/src/split/bluetooth/central_bas_proxy.c deleted file mode 100644 index f706d78f..00000000 --- a/app/src/split/bluetooth/central_bas_proxy.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include -#include -#include - -static void blvl_ccc_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value) { - ARG_UNUSED(attr); - - bool notif_enabled = (value == BT_GATT_CCC_NOTIFY); - - LOG_INF("BAS Notifications %s", notif_enabled ? "enabled" : "disabled"); -} - -static ssize_t read_blvl(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, - uint16_t len, uint16_t offset) { - const uint8_t source = *(uint8_t *)attr->user_data; - uint8_t level = 0; - int rc = zmk_split_central_get_peripheral_battery_level(source, &level); - - if (rc == -EINVAL) { - LOG_ERR("Invalid peripheral index requested for battery level read: %d", source); - return 0; - } - - return bt_gatt_attr_read(conn, attr, buf, len, offset, &level, sizeof(uint8_t)); -} - -static const struct bt_gatt_cpf aux_level_cpf = { - .format = 0x04, // uint8 - .exponent = 0x0, - .unit = 0x27AD, // Percentage - .name_space = 0x01, // Bluetooth SIG - .description = 0x0108, // "auxiliary" -}; - -#define PERIPH_CUD_(x) "Peripheral " #x -#define PERIPH_CUD(x) PERIPH_CUD_(x) - -// How many GATT attributes each battery level adds to our service -#define PERIPH_BATT_LEVEL_ATTR_COUNT 5 -// The second generated attribute is the one used to send GATT notifications -#define PERIPH_BATT_LEVEL_ATTR_NOTIFY_IDX 1 - -#define PERIPH_BATT_LEVEL_ATTRS(i, _) \ - BT_GATT_CHARACTERISTIC(BT_UUID_BAS_BATTERY_LEVEL, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, \ - BT_GATT_PERM_READ, read_blvl, NULL, ((uint8_t[]){i})), \ - BT_GATT_CCC(blvl_ccc_cfg_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), \ - BT_GATT_CPF(&aux_level_cpf), BT_GATT_CUD(PERIPH_CUD(i), BT_GATT_PERM_READ), - -BT_GATT_SERVICE_DEFINE(bas_aux, BT_GATT_PRIMARY_SERVICE(BT_UUID_BAS), - LISTIFY(CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS, PERIPH_BATT_LEVEL_ATTRS, - ())); - -int peripheral_batt_lvl_listener(const zmk_event_t *eh) { - const struct zmk_peripheral_battery_state_changed *ev = - as_zmk_peripheral_battery_state_changed(eh); - if (ev == NULL) { - return ZMK_EV_EVENT_BUBBLE; - }; - - if (ev->source >= CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS) { - LOG_WRN("Got battery level event for an out of range peripheral index"); - return ZMK_EV_EVENT_BUBBLE; - } - - LOG_DBG("Peripheral battery level event: %u", ev->state_of_charge); - - // Offset by the index of the source plus the specific offset to find the attribute to notify - // on. - int index = (PERIPH_BATT_LEVEL_ATTR_COUNT * ev->source) + PERIPH_BATT_LEVEL_ATTR_NOTIFY_IDX; - - int rc = bt_gatt_notify(NULL, &bas_aux.attrs[index], &ev->state_of_charge, sizeof(uint8_t)); - if (rc < 0 && rc != -ENOTCONN) { - LOG_WRN("Failed to notify hosts of peripheral battery level: %d", rc); - } - - return ZMK_EV_EVENT_BUBBLE; -}; - -ZMK_LISTENER(peripheral_batt_lvl_listener, peripheral_batt_lvl_listener); -ZMK_SUBSCRIPTION(peripheral_batt_lvl_listener, zmk_peripheral_battery_state_changed); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 0d3ad2de..1d649f71 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -18,10 +18,7 @@ #include #include #include -#include - -#include "peripheral.h" -#include "service.h" +#include #if IS_ENABLED(CONFIG_SETTINGS) @@ -46,8 +43,6 @@ static const struct bt_data zmk_ble_ad[] = { static bool is_connected = false; -static bool is_bonded = false; - static void each_bond(const struct bt_bond_info *info, void *user_data) { bt_addr_le_t *addr = (bt_addr_le_t *)user_data; @@ -62,18 +57,15 @@ static int start_advertising(bool low_duty) { bt_foreach_bond(BT_ID_DEFAULT, each_bond, ¢ral_addr); if (bt_addr_le_cmp(¢ral_addr, BT_ADDR_LE_NONE) != 0) { - is_bonded = true; struct bt_le_adv_param adv_param = low_duty ? *BT_LE_ADV_CONN_DIR_LOW_DUTY(¢ral_addr) : *BT_LE_ADV_CONN_DIR(¢ral_addr); return bt_le_adv_start(&adv_param, NULL, 0, NULL, 0); } else { - is_bonded = false; - return bt_le_adv_start(BT_LE_ADV_CONN_FAST_2, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); + return bt_le_adv_start(BT_LE_ADV_CONN, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); } }; static bool low_duty_advertising = false; -static bool enabled = false; static void advertising_cb(struct k_work *work) { const int err = start_advertising(low_duty_advertising); @@ -87,22 +79,15 @@ K_WORK_DEFINE(advertising_work, advertising_cb); static void connected(struct bt_conn *conn, uint8_t err) { is_connected = (err == 0); - raise_zmk_split_peripheral_status_changed( - (struct zmk_split_peripheral_status_changed){.connected = is_connected}); + ZMK_EVENT_RAISE(new_zmk_split_peripheral_status_changed( + (struct zmk_split_peripheral_status_changed){.connected = is_connected})); - if (err == BT_HCI_ERR_ADV_TIMEOUT && enabled) { + if (err == BT_HCI_ERR_ADV_TIMEOUT) { low_duty_advertising = true; k_work_submit(&advertising_work); } } -static void recycled(void) { - if (enabled) { - low_duty_advertising = false; - k_work_submit(&advertising_work); - } -} - static void disconnected(struct bt_conn *conn, uint8_t reason) { char addr[BT_ADDR_LE_STR_LEN]; @@ -112,8 +97,11 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { is_connected = false; - raise_zmk_split_peripheral_status_changed( - (struct zmk_split_peripheral_status_changed){.connected = is_connected}); + ZMK_EVENT_RAISE(new_zmk_split_peripheral_status_changed( + (struct zmk_split_peripheral_status_changed){.connected = is_connected})); + + low_duty_advertising = false; + k_work_submit(&advertising_work); } static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_security_err err) { @@ -140,133 +128,13 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l static struct bt_conn_cb conn_callbacks = { .connected = connected, .disconnected = disconnected, - .recycled = recycled, .security_changed = security_changed, .le_param_updated = le_param_updated, }; -static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { is_bonded = bonded; } +bool zmk_split_bt_peripheral_is_connected() { return is_connected; } -static struct bt_conn_auth_info_cb zmk_peripheral_ble_auth_info_cb = { - .pairing_complete = auth_pairing_complete, -}; - -bool zmk_split_bt_peripheral_is_connected(void) { return is_connected; } - -bool zmk_split_bt_peripheral_is_bonded(void) { return is_bonded; } - -static zmk_split_transport_peripheral_status_changed_cb_t transport_status_cb; - -static int -split_peripheral_bt_set_status_callback(zmk_split_transport_peripheral_status_changed_cb_t cb) { - transport_status_cb = cb; - return 0; -} - -static void find_first_conn(struct bt_conn *conn, void *data) { - struct bt_conn **cp = (struct bt_conn **)data; - - *cp = conn; -} - -static int split_peripheral_bt_set_enabled(bool en) { - int err; - - enabled = en; - if (en) { - k_work_submit(&advertising_work); - return 0; - } else { - struct bt_conn *conn = NULL; - bt_conn_foreach(BT_CONN_TYPE_LE, find_first_conn, &conn); - if (conn) { - err = bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); - if (err < 0) { - LOG_WRN("Failed to disconnect connection to central (%d)", err); - } - } - - err = bt_le_adv_stop(); - - if (err < 0) { - LOG_WRN("Failed to stop advertising (%d)", err); - } - - return 0; - } -} - -static void notify_transport_status(void); - -static void notify_status_work_cb(struct k_work *_work) { notify_transport_status(); } - -static K_WORK_DEFINE(notify_status_work, notify_status_work_cb); - -static bool settings_loaded = false; - -static struct zmk_split_transport_status split_peripheral_bt_get_status(void) { - return (struct zmk_split_transport_status){ - .available = !IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) && settings_loaded, - .enabled = enabled, - .connections = zmk_split_bt_peripheral_is_connected() - ? ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_ALL_CONNECTED - : ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED, - }; -} - -static const struct zmk_split_transport_peripheral_api peripheral_api = { - .report_event = zmk_split_transport_peripheral_bt_report_event, - .set_enabled = split_peripheral_bt_set_enabled, - .set_status_callback = split_peripheral_bt_set_status_callback, - .get_status = split_peripheral_bt_get_status, -}; - -ZMK_SPLIT_TRANSPORT_PERIPHERAL_REGISTER(bt_peripheral, &peripheral_api, - CONFIG_ZMK_SPLIT_BLE_PRIORITY); - -struct zmk_split_transport_peripheral *zmk_split_transport_peripheral_bt(void) { - return &bt_peripheral; -} - -static void notify_transport_status(void) { - if (transport_status_cb) { - transport_status_cb(&bt_peripheral, split_peripheral_bt_get_status()); - } -} - -static int zmk_peripheral_ble_complete_startup(void) { -#if IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) - LOG_WRN("Clearing all existing BLE bond information from the keyboard"); - - bt_unpair(BT_ID_DEFAULT, NULL); -#else - bt_conn_cb_register(&conn_callbacks); - bt_conn_auth_info_cb_register(&zmk_peripheral_ble_auth_info_cb); - - low_duty_advertising = false; - - settings_loaded = true; - k_work_submit(¬ify_status_work); -#endif - - return 0; -} - -#if IS_ENABLED(CONFIG_SETTINGS) - -static int peripheral_ble_handle_set(const char *name, size_t len, settings_read_cb read_cb, - void *cb_arg) { - return 0; -} - -static struct settings_handler ble_peripheral_settings_handler = { - .name = "ble_peripheral", - .h_set = peripheral_ble_handle_set, - .h_commit = zmk_peripheral_ble_complete_startup}; - -#endif // IS_ENABLED(CONFIG_SETTINGS) - -static int zmk_peripheral_ble_init(void) { +static int zmk_peripheral_ble_init(const struct device *_arg) { int err = bt_enable(NULL); if (err) { @@ -275,9 +143,21 @@ static int zmk_peripheral_ble_init(void) { } #if IS_ENABLED(CONFIG_SETTINGS) - settings_register(&ble_peripheral_settings_handler); + settings_subsys_init(); + + settings_load_subtree("ble"); + settings_load_subtree("bt"); +#endif + +#if IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) + LOG_WRN("Clearing all existing BLE bond information from the keyboard"); + + bt_unpair(BT_ID_DEFAULT, NULL); #else - zmk_peripheral_ble_complete_startup(); + bt_conn_cb_register(&conn_callbacks); + + low_duty_advertising = false; + k_work_submit(&advertising_work); #endif return 0; diff --git a/app/src/split/bluetooth/peripheral.h b/app/src/split/bluetooth/peripheral.h deleted file mode 100644 index fd6c22f4..00000000 --- a/app/src/split/bluetooth/peripheral.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -struct zmk_split_transport_peripheral *zmk_split_transport_peripheral_bt(void); \ No newline at end of file diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index 5bbed137..620df53e 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -18,20 +17,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#include #include #include -#include -#include #include #include - -#include "peripheral.h" - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) -#include -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - #include #include @@ -64,7 +53,48 @@ static ssize_t split_svc_pos_state(struct bt_conn *conn, const struct bt_gatt_at static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt_attr *attrs, const void *buf, uint16_t len, uint16_t offset, - uint8_t flags); + uint8_t flags) { + struct zmk_split_run_behavior_payload *payload = attrs->user_data; + uint16_t end_addr = offset + len; + + LOG_DBG("offset %d len %d", offset, len); + + if (end_addr > sizeof(struct zmk_split_run_behavior_payload)) { + return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); + } + + memcpy(payload + offset, buf, len); + + // We run if: + // 1: We've gotten all the position/state/param data. + // 2: We have a null terminated string for the behavior device label. + const size_t behavior_dev_offset = + offsetof(struct zmk_split_run_behavior_payload, behavior_dev); + if ((end_addr > sizeof(struct zmk_split_run_behavior_data)) && + payload->behavior_dev[end_addr - behavior_dev_offset - 1] == '\0') { + struct zmk_behavior_binding binding = { + .param1 = payload->data.param1, + .param2 = payload->data.param2, + .behavior_dev = payload->behavior_dev, + }; + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, + binding.param2, payload->data.state); + struct zmk_behavior_binding_event event = {.position = payload->data.position, + .timestamp = k_uptime_get()}; + int err; + if (payload->data.state > 0) { + err = behavior_keymap_binding_pressed(&binding, event); + } else { + err = behavior_keymap_binding_released(&binding, event); + } + + if (err) { + LOG_ERR("Failed to invoke behavior %s: %d", binding.behavior_dev, err); + } + } + + return len; +} static ssize_t split_svc_num_of_positions(struct bt_conn *conn, const struct bt_gatt_attr *attrs, void *buf, uint16_t len, uint16_t offset) { @@ -75,109 +105,6 @@ static void split_svc_pos_state_ccc(const struct bt_gatt_attr *attr, uint16_t va LOG_DBG("value %d", value); } -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -static zmk_hid_indicators_t hid_indicators = 0; - -static void split_svc_update_indicators_callback(struct k_work *work) { - LOG_DBG("Raising HID indicators changed event: %x", hid_indicators); - raise_zmk_hid_indicators_changed( - (struct zmk_hid_indicators_changed){.indicators = hid_indicators}); -} - -static K_WORK_DEFINE(split_svc_update_indicators_work, split_svc_update_indicators_callback); - -static ssize_t split_svc_update_indicators(struct bt_conn *conn, const struct bt_gatt_attr *attr, - const void *buf, uint16_t len, uint16_t offset, - uint8_t flags) { - if (offset + len > sizeof(zmk_hid_indicators_t)) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); - } - - memcpy((uint8_t *)&hid_indicators + offset, buf, len); - - k_work_submit(&split_svc_update_indicators_work); - - return len; -} - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -static uint8_t selected_phys_layout = 0; - -static void split_svc_select_phys_layout_callback(struct k_work *work) { - LOG_DBG("Selecting physical layout after GATT write of %d", selected_phys_layout); - zmk_physical_layouts_select(selected_phys_layout); -} - -static K_WORK_DEFINE(split_svc_select_phys_layout_work, split_svc_select_phys_layout_callback); - -static ssize_t split_svc_select_phys_layout(struct bt_conn *conn, const struct bt_gatt_attr *attr, - const void *buf, uint16_t len, uint16_t offset, - uint8_t flags) { - if (offset + len > sizeof(uint8_t) || len == 0) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); - } - - selected_phys_layout = *(uint8_t *)buf; - - k_work_submit(&split_svc_select_phys_layout_work); - - return len; -} - -static ssize_t split_svc_get_selected_phys_layout(struct bt_conn *conn, - const struct bt_gatt_attr *attrs, void *buf, - uint16_t len, uint16_t offset) { - int selected_ret = zmk_physical_layouts_get_selected(); - if (selected_ret < 0) { - return BT_GATT_ERR(BT_ATT_ERR_VALUE_NOT_ALLOWED); - } - - uint8_t selected = (uint8_t)selected_ret; - - return bt_gatt_attr_read(conn, attrs, buf, len, offset, &selected, sizeof(selected)); -} - -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - -static void split_input_events_ccc(const struct bt_gatt_attr *attr, uint16_t value) { - LOG_DBG("value %d", value); -} - -// Duplicated from Zephyr, since it is internal there -struct gatt_cpf { - uint8_t format; - int8_t exponent; - uint16_t unit; - uint8_t name_space; - uint16_t description; -} __packed; - -ssize_t bt_gatt_attr_read_input_split_cpf(struct bt_conn *conn, const struct bt_gatt_attr *attr, - void *buf, uint16_t len, uint16_t offset) { - uint16_t reg = (uint16_t)(uint32_t)attr->user_data; - struct gatt_cpf value; - - value.format = 0x1B; // Struct - value.exponent = 0; - value.unit = sys_cpu_to_le16(0x2700); // Unitless - value.name_space = 0x01; // Bluetooth SIG - value.description = sys_cpu_to_le16(reg); - - return bt_gatt_attr_read(conn, attr, buf, len, offset, &value, sizeof(value)); -} - -#define INPUT_SPLIT_CHARS(node_id) \ - BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_INPUT_EVENT_UUID), \ - BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ_ENCRYPT, NULL, NULL, NULL), \ - BT_GATT_CCC(split_input_events_ccc, \ - BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), \ - BT_GATT_DESCRIPTOR(BT_UUID_GATT_CPF, BT_GATT_PERM_READ, bt_gatt_attr_read_input_split_cpf, \ - NULL, (void *)DT_REG_ADDR(node_id)), - -#endif - BT_GATT_SERVICE_DEFINE( split_svc, BT_GATT_PRIMARY_SERVICE(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID)), BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID), @@ -195,17 +122,7 @@ BT_GATT_SERVICE_DEFINE( split_svc_sensor_state, NULL, &last_sensor_event), BT_GATT_CCC(split_svc_sensor_state_ccc, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), #endif /* ZMK_KEYMAP_HAS_SENSORS */ - DT_FOREACH_STATUS_OKAY(zmk_input_split, INPUT_SPLIT_CHARS) -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_UPDATE_HID_INDICATORS_UUID), - BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE_ENCRYPT, NULL, - split_svc_update_indicators, NULL), -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SELECT_PHYS_LAYOUT_UUID), - BT_GATT_CHRC_WRITE | BT_GATT_CHRC_READ, - BT_GATT_PERM_WRITE_ENCRYPT | BT_GATT_PERM_READ_ENCRYPT, - split_svc_get_selected_phys_layout, split_svc_select_phys_layout, - NULL), ); +); K_THREAD_STACK_DEFINE(service_q_stack, CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE); @@ -248,12 +165,12 @@ int send_position_state() { return 0; } -static int zmk_split_bt_position_pressed(uint8_t position) { +int zmk_split_bt_position_pressed(uint8_t position) { WRITE_BIT(position_state[position / 8], position % 8, true); return send_position_state(); } -static int zmk_split_bt_position_released(uint8_t position) { +int zmk_split_bt_position_released(uint8_t position) { WRITE_BIT(position_state[position / 8], position % 8, false); return send_position_state(); } @@ -295,9 +212,9 @@ int send_sensor_state(struct sensor_event ev) { return 0; } -static int zmk_split_bt_sensor_triggered(uint8_t sensor_index, - const struct zmk_sensor_channel_data channel_data[], - size_t channel_data_size) { +int zmk_split_bt_sensor_triggered(uint8_t sensor_index, + const struct zmk_sensor_channel_data channel_data[], + size_t channel_data_size) { if (channel_data_size > ZMK_SENSOR_EVENT_MAX_CHANNELS) { return -EINVAL; } @@ -310,31 +227,7 @@ static int zmk_split_bt_sensor_triggered(uint8_t sensor_index, } #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - -static int zmk_split_bt_report_input(uint8_t reg, uint8_t type, uint16_t code, int32_t value, - bool sync) { - - for (size_t i = 0; i < split_svc.attr_count; i++) { - if (bt_uuid_cmp(split_svc.attrs[i].uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_INPUT_EVENT_UUID)) == 0 && - (uint8_t)(uint32_t)split_svc.attrs[i + 2].user_data == reg) { - struct zmk_split_input_event_payload payload = { - .type = type, - .code = code, - .value = value, - .sync = sync ? 1 : 0, - }; - - return bt_gatt_notify(NULL, &split_svc.attrs[i], &payload, sizeof(payload)); - } - } - return -ENODEV; -} - -#endif /* IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) */ - -static int service_init(void) { +int service_init(const struct device *_arg) { static const struct k_work_queue_config queue_config = { .name = "Split Peripheral Notification Queue"}; k_work_queue_start(&service_work_q, service_q_stack, K_THREAD_STACK_SIZEOF(service_q_stack), @@ -344,94 +237,3 @@ static int service_init(void) { } SYS_INIT(service_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); - -int zmk_split_transport_peripheral_bt_report_event( - const struct zmk_split_transport_peripheral_event *ev) { - switch (ev->type) { - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT: - if (ev->data.key_position_event.pressed) { - zmk_split_bt_position_pressed(ev->data.key_position_event.position); - } else { - zmk_split_bt_position_released(ev->data.key_position_event.position); - } - break; -#if ZMK_KEYMAP_HAS_SENSORS - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_SENSOR_EVENT: - zmk_split_bt_sensor_triggered(ev->data.sensor_event.sensor_index, - &ev->data.sensor_event.channel_data, 1); - - break; -#endif - -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_INPUT_EVENT: - return zmk_split_bt_report_input(ev->data.input_event.reg, ev->data.input_event.type, - ev->data.input_event.code, ev->data.input_event.value, - ev->data.input_event.sync); -#endif - -#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT: - // The BLE transport uses standard BAS service for propagation, so just return success here. - return 0; -#endif - default: - LOG_WRN("Unhandled event type %d", ev->type); - return -ENOTSUP; - } - - return 0; -} - -static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt_attr *attrs, - const void *buf, uint16_t len, uint16_t offset, - uint8_t flags) { - struct zmk_split_run_behavior_payload *payload = attrs->user_data; - uint16_t end_addr = offset + len; - - LOG_DBG("offset %d len %d", offset, len); - - if (end_addr > sizeof(struct zmk_split_run_behavior_payload)) { - return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); - } - - memcpy(payload + offset, buf, len); - - // We run if: - // 1: We've gotten all the position/state/param data. - // 2: We have a null terminated string for the behavior device label. - const size_t behavior_dev_offset = - offsetof(struct zmk_split_run_behavior_payload, behavior_dev); - if ((end_addr > sizeof(struct zmk_split_run_behavior_data)) && - payload->behavior_dev[end_addr - behavior_dev_offset - 1] == '\0') { - - struct zmk_split_transport_central_command cmd = { - .type = ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR, - .data = {.invoke_behavior = { - .param1 = payload->data.param1, - .param2 = payload->data.param2, - .position = payload->data.position, - .state = payload->data.state, - }}}; - - const size_t payload_dev_size = sizeof(cmd.data.invoke_behavior.behavior_dev); - if (strlcpy(cmd.data.invoke_behavior.behavior_dev, payload->behavior_dev, - payload_dev_size) >= payload_dev_size) { - LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", - payload->behavior_dev, cmd.data.invoke_behavior.behavior_dev); - } - - LOG_DBG("%s with params %d %d: pressed? %d", cmd.data.invoke_behavior.behavior_dev, - cmd.data.invoke_behavior.param1, cmd.data.invoke_behavior.param2, - cmd.data.invoke_behavior.state); - - int err = zmk_split_transport_peripheral_command_handler( - zmk_split_transport_peripheral_bt(), cmd); - - if (err) { - LOG_ERR("Failed to invoke behavior %s: %d", payload->behavior_dev, err); - } - } - - return len; -} \ No newline at end of file diff --git a/app/src/split/bluetooth/service.h b/app/src/split/bluetooth/service.h deleted file mode 100644 index 20ff7513..00000000 --- a/app/src/split/bluetooth/service.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -int zmk_split_transport_peripheral_bt_report_event( - const struct zmk_split_transport_peripheral_event *ev); \ No newline at end of file diff --git a/app/src/split/bluetooth/split_listener.c b/app/src/split/bluetooth/split_listener.c new file mode 100644 index 00000000..9b680d2c --- /dev/null +++ b/app/src/split/bluetooth/split_listener.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include +#include +#include +#include +#include + +int split_listener(const zmk_event_t *eh) { + LOG_DBG(""); + const struct zmk_position_state_changed *pos_ev; + if ((pos_ev = as_zmk_position_state_changed(eh)) != NULL) { + if (pos_ev->state) { + return zmk_split_bt_position_pressed(pos_ev->position); + } else { + return zmk_split_bt_position_released(pos_ev->position); + } + } + +#if ZMK_KEYMAP_HAS_SENSORS + const struct zmk_sensor_event *sensor_ev; + if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { + return zmk_split_bt_sensor_triggered(sensor_ev->sensor_index, sensor_ev->channel_data, + sensor_ev->channel_data_size); + } +#endif /* ZMK_KEYMAP_HAS_SENSORS */ + return ZMK_EV_EVENT_BUBBLE; +} + +ZMK_LISTENER(split_listener, split_listener); +ZMK_SUBSCRIPTION(split_listener, zmk_position_state_changed); + +#if ZMK_KEYMAP_HAS_SENSORS +ZMK_SUBSCRIPTION(split_listener, zmk_sensor_event); +#endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/split/central.c b/app/src/split/central.c deleted file mode 100644 index e2b80643..00000000 --- a/app/src/split/central.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -const struct zmk_split_transport_central *active_transport; - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -static uint8_t peripheral_battery_levels[ZMK_SPLIT_CENTRAL_PERIPHERAL_COUNT] = {0}; - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -int zmk_split_transport_central_peripheral_event_handler( - const struct zmk_split_transport_central *transport, uint8_t source, - struct zmk_split_transport_peripheral_event ev) { - if (transport != active_transport) { - // Ignoring events from non-active transport - LOG_WRN("Ignoring peripheral event from non-active transport"); - return -EINVAL; - } - switch (ev.type) { - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT: { - struct zmk_position_state_changed state_ev = {.source = source, - .position = - ev.data.key_position_event.position, - .state = ev.data.key_position_event.pressed, - .timestamp = k_uptime_get()}; - return raise_zmk_position_state_changed(state_ev); - } -#if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_INPUT_EVENT: { - return zmk_input_split_report_peripheral_event( - ev.data.input_event.reg, ev.data.input_event.type, ev.data.input_event.code, - ev.data.input_event.value, ev.data.input_event.sync); - } -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT: { - struct zmk_peripheral_battery_state_changed battery_ev = { - .source = source, - .state_of_charge = ev.data.battery_event.level, - }; - peripheral_battery_levels[source] = ev.data.battery_event.level; - return raise_zmk_peripheral_battery_state_changed(battery_ev); - } -#endif - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_SENSOR_EVENT: { - struct zmk_sensor_event sensor_ev = {.sensor_index = ev.data.sensor_event.sensor_index, - .channel_data_size = 1, - .timestamp = k_uptime_get()}; - - sensor_ev.channel_data[0] = ev.data.sensor_event.channel_data; - - return raise_zmk_sensor_event(sensor_ev); - } - default: - LOG_WRN("GOT AN UNKNOWN EVENT TYPE %d", ev.type); - return -ENOTSUP; - } -} - -int zmk_split_central_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, bool state) { - if (!active_transport || !active_transport->api || !active_transport->api->send_command) { - return -ENODEV; - } - - struct zmk_split_transport_central_command command = - (struct zmk_split_transport_central_command){ - .type = ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR, - .data = - { - .invoke_behavior = - { - .param1 = binding->param1, - .param2 = binding->param2, - .position = event.position, - .event_source = event.source, - .state = state ? 1 : 0, - }, - }, - }; - - const size_t payload_dev_size = sizeof(command.data.invoke_behavior.behavior_dev); - if (strlcpy(command.data.invoke_behavior.behavior_dev, binding->behavior_dev, - payload_dev_size) >= payload_dev_size) { - LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", - binding->behavior_dev, command.data.invoke_behavior.behavior_dev); - } - - return active_transport->api->send_command(source, command); -}; - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -int zmk_split_central_update_hid_indicator(zmk_hid_indicators_t indicators) { - if (!active_transport || !active_transport->api || - !active_transport->api->get_available_source_ids || !active_transport->api->send_command) { - return -ENODEV; - } - - uint8_t source_ids[ZMK_SPLIT_CENTRAL_PERIPHERAL_COUNT]; - - int ret = active_transport->api->get_available_source_ids(source_ids); - - if (ret < 0) { - return ret; - } - - struct zmk_split_transport_central_command command = - (struct zmk_split_transport_central_command){ - .type = ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_HID_INDICATORS, - .data = - { - .set_hid_indicators = - { - .indicators = indicators, - }, - }, - }; - - for (size_t i = 0; i < ret; i++) { - ret = active_transport->api->send_command(source_ids[i], command); - if (ret < 0) { - return ret; - } - } - - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -int zmk_split_central_get_peripheral_battery_level(uint8_t source, uint8_t *level) { - if (source >= ARRAY_SIZE(peripheral_battery_levels)) { - return -EINVAL; - } - - *level = peripheral_battery_levels[source]; - return 0; -} - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) - -static int select_first_available_transport(void) { - // Transports are sorted by priority, so find the first - // One that's available, and enable it. Any transport that - // Doesn't support `get_status` is assumed to be always - // available and fully connected. - STRUCT_SECTION_FOREACH(zmk_split_transport_central, t) { - if (!t->api->get_status || t->api->get_status().available) { - - if (active_transport == t) { - LOG_DBG("First available is already selected, moving on"); - return 0; - } - - if (active_transport && active_transport->api->set_enabled) { - int err = active_transport->api->set_enabled(false); - if (err < 0) { - LOG_WRN("Error disabling previously selected split transport (%d)", err); - } - } - - active_transport = t; - int err = 0; - if (active_transport->api->set_enabled) { - err = active_transport->api->set_enabled(true); - } - - return err; - } - } - - return -ENODEV; -} - -static int transport_status_changed_cb(const struct zmk_split_transport_central *central, - struct zmk_split_transport_status status) { - if (central == active_transport) { - LOG_DBG("Central at %p changed status: enabled %d, available %d, connections %d", central, - status.enabled, status.available, status.connections); - if (status.connections == ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED) { - return select_first_available_transport(); - } - } else { - // Just to be sure, in case a higher priority transport becomes available - select_first_available_transport(); - } - - return 0; -} - -static int central_init(void) { - STRUCT_SECTION_FOREACH(zmk_split_transport_central, t) { - if (!t->api->set_status_callback) { - continue; - } - - t->api->set_status_callback(transport_status_changed_cb); - } - - return select_first_available_transport(); -} - -SYS_INIT(central_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/app/src/split/peripheral.c b/app/src/split/peripheral.c deleted file mode 100644 index b814df61..00000000 --- a/app/src/split/peripheral.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) -#include -#endif - -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -const struct zmk_split_transport_peripheral *active_transport; - -int zmk_split_transport_peripheral_command_handler( - const struct zmk_split_transport_peripheral *transport, - struct zmk_split_transport_central_command cmd) { - LOG_DBG(""); - - switch (cmd.type) { - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR: { - struct zmk_behavior_binding binding = { - .param1 = cmd.data.invoke_behavior.param1, - .param2 = cmd.data.invoke_behavior.param2, - .behavior_dev = cmd.data.invoke_behavior.behavior_dev, - }; - LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, - binding.param2, cmd.data.invoke_behavior.state); - struct zmk_behavior_binding_event event = {.position = cmd.data.invoke_behavior.position, - .timestamp = k_uptime_get()}; - int err; - if (cmd.data.invoke_behavior.state > 0) { - err = behavior_keymap_binding_pressed(&binding, event); - } else { - err = behavior_keymap_binding_released(&binding, event); - } - - if (err) { - LOG_ERR("Failed to invoke behavior %s: %d", binding.behavior_dev, err); - } - return err; - } - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_PHYSICAL_LAYOUT: { - return zmk_physical_layouts_select(cmd.data.set_physical_layout.layout_idx); - } -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_HID_INDICATORS: { - return raise_zmk_hid_indicators_changed((struct zmk_hid_indicators_changed){ - .indicators = cmd.data.set_hid_indicators.indicators}); - } -#endif - default: - LOG_WRN("Unhandled command type %d", cmd.type); - return -ENOTSUP; - } - return 0; -} - -int zmk_split_peripheral_report_event(const struct zmk_split_transport_peripheral_event *event) { - if (!active_transport || !active_transport->api || !active_transport->api->report_event) { - LOG_WRN("No active transport that supports reporting events!"); - return -ENODEV; - } - - return active_transport->api->report_event(event); -} - -static int select_first_available_transport(void) { - // Transports are sorted by priority, so find the first - // One that's available, and enable it. Any transport that - // Doesn't support `get_status` is assumed to be always - // available and fully connected. - STRUCT_SECTION_FOREACH(zmk_split_transport_peripheral, t) { - if (!t->api->get_status || t->api->get_status().available) { - if (active_transport == t) { - LOG_DBG("First available is already selected, moving on"); - return 0; - } - - if (active_transport && active_transport->api->set_enabled) { - int err = active_transport->api->set_enabled(false); - if (err < 0) { - LOG_WRN("Error disabling previously selected split transport (%d)", err); - } - } - - active_transport = t; - int err = 0; - if (active_transport->api->set_enabled) { - err = active_transport->api->set_enabled(true); - } - - return err; - } - } - - return -ENODEV; -} - -static int transport_status_changed_cb(const struct zmk_split_transport_peripheral *p, - struct zmk_split_transport_status status) { - if (p == active_transport) { - LOG_DBG("Peripheral at %p changed status: enabled %d, available %d, connections %d", p, - status.enabled, status.available, status.connections); - if (status.connections == ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED) { - LOG_DBG("Find us a new active transport!"); - - return select_first_available_transport(); - } - } else { - select_first_available_transport(); - } - - return 0; -} - -static int peripheral_init(void) { - STRUCT_SECTION_FOREACH(zmk_split_transport_peripheral, t) { - if (!t->api->set_status_callback) { - continue; - } - - t->api->set_status_callback(transport_status_changed_cb); - } - - return select_first_available_transport(); -} - -SYS_INIT(peripheral_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); - -int split_peripheral_listener(const zmk_event_t *eh) { - LOG_DBG(""); - const struct zmk_position_state_changed *pos_ev; - if ((pos_ev = as_zmk_position_state_changed(eh)) != NULL) { - struct zmk_split_transport_peripheral_event ev = { - .type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT, - .data = {.key_position_event = { - .position = pos_ev->position, - .pressed = pos_ev->state, - }}}; - - zmk_split_peripheral_report_event(&ev); - } - -#if ZMK_KEYMAP_HAS_SENSORS - const struct zmk_sensor_event *sensor_ev; - if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - if (sensor_ev->channel_data_size != 1) { - return -ENOTSUP; - } - - struct zmk_split_transport_peripheral_event ev = { - .type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_SENSOR_EVENT, - .data = {.sensor_event = { - .channel_data = sensor_ev->channel_data[0], - .sensor_index = sensor_ev->sensor_index, - }}}; - - zmk_split_peripheral_report_event(&ev); - } -#endif /* ZMK_KEYMAP_HAS_SENSORS */ - -#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) - const struct zmk_battery_state_changed *battery_ev; - if ((battery_ev = as_zmk_battery_state_changed(eh)) != NULL) { - struct zmk_split_transport_peripheral_event ev = { - .type = ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT, - .data = {.battery_event = { - .level = battery_ev->state_of_charge, - }}}; - - zmk_split_peripheral_report_event(&ev); - } -#endif // IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) - - return ZMK_EV_EVENT_BUBBLE; -} - -ZMK_LISTENER(split_peripheral, split_peripheral_listener); -ZMK_SUBSCRIPTION(split_peripheral, zmk_position_state_changed); - -#if ZMK_KEYMAP_HAS_SENSORS -ZMK_SUBSCRIPTION(split_peripheral, zmk_sensor_event); -#endif /* ZMK_KEYMAP_HAS_SENSORS */ - -#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) -ZMK_SUBSCRIPTION(split_peripheral, zmk_battery_state_changed); -#endif \ No newline at end of file diff --git a/app/src/split/wired/CMakeLists.txt b/app/src/split/wired/CMakeLists.txt deleted file mode 100644 index 599f7e35..00000000 --- a/app/src/split/wired/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -target_sources(app PRIVATE wired.c) -target_sources_ifdef(CONFIG_ZMK_SPLIT_ROLE_CENTRAL app PRIVATE central.c) -target_sources_ifndef(CONFIG_ZMK_SPLIT_ROLE_CENTRAL app PRIVATE peripheral.c) \ No newline at end of file diff --git a/app/src/split/wired/Kconfig b/app/src/split/wired/Kconfig deleted file mode 100644 index 465fac01..00000000 --- a/app/src/split/wired/Kconfig +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if ZMK_SPLIT_WIRED - -config ZMK_SPLIT_WIRED_PRIORITY - int "Wired transport priority" - help - Lower number priorities transports are favored over higher numbers. - -choice - prompt "UART Mode" - -config ZMK_SPLIT_WIRED_UART_MODE_ASYNC - bool "Async (DMA) Mode" - # For now, don't use async/DMA on nRF52 due to RX bug (fixed - # in newer Zephyr version?) - depends on SERIAL_SUPPORT_ASYNC - select UART_ASYNC_API - -config ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT - bool "Interrupt Mode" - depends on SERIAL_SUPPORT_INTERRUPT - select UART_INTERRUPT_DRIVEN - -config ZMK_SPLIT_WIRED_UART_MODE_POLLING - bool "Polling Mode" - -endchoice - -if ZMK_SPLIT_WIRED_UART_MODE_POLLING - -config ZMK_SPLIT_WIRED_POLLING_RX_PERIOD - int "Ticks between RX polls" - -endif - -if ZMK_SPLIT_WIRED_UART_MODE_ASYNC - -config ZMK_SPLIT_WIRED_ASYNC_RX_TIMEOUT - int "RX Timeout (in microseconds) before reporting received data" - -endif - -config ZMK_SPLIT_WIRED_CMD_BUFFER_ITEMS - int "Number of central commands to buffer for TX/RX" - -config ZMK_SPLIT_WIRED_EVENT_BUFFER_ITEMS - int "Number of peripheral events to buffer for TX/RX" - -config ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_TIMEOUT - int "RX timeout (in ms) when polling peripheral(s) and waiting for any response" - -config ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_COMPLETE_TIMEOUT - int "RX complete timeout (in ticks) when polling peripheral(s) after receiving some response data" - -endif diff --git a/app/src/split/wired/Kconfig.defaults b/app/src/split/wired/Kconfig.defaults deleted file mode 100644 index 8d810efe..00000000 --- a/app/src/split/wired/Kconfig.defaults +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2025 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if ZMK_SPLIT_WIRED - -config ZMK_SPLIT_WIRED_PRIORITY - default 0 - -config ZMK_SPLIT_WIRED_CMD_BUFFER_ITEMS - default 4 - -config ZMK_SPLIT_WIRED_EVENT_BUFFER_ITEMS - default 16 - - -if ZMK_SPLIT_WIRED_UART_MODE_POLLING - -config ZMK_SPLIT_WIRED_POLLING_RX_PERIOD - default 10 - -endif - - -if ZMK_SPLIT_WIRED_UART_MODE_ASYNC - -config ZMK_SPLIT_WIRED_ASYNC_RX_TIMEOUT - default 20 - -endif - -config ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_TIMEOUT - default 15 - -config ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_COMPLETE_TIMEOUT - default 20 - -endif \ No newline at end of file diff --git a/app/src/split/wired/central.c b/app/src/split/wired/central.c deleted file mode 100644 index 0354e52d..00000000 --- a/app/src/split/wired/central.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -#include -#include -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wired.h" - -#define DT_DRV_COMPAT zmk_wired_split - -#define IS_HALF_DUPLEX_MODE \ - (DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) && DT_INST_PROP_OR(0, half_duplex, false)) - -#define RX_BUFFER_SIZE \ - ((sizeof(struct event_envelope) + sizeof(struct msg_postfix)) * \ - CONFIG_ZMK_SPLIT_WIRED_EVENT_BUFFER_ITEMS) -#define TX_BUFFER_SIZE \ - ((sizeof(struct command_envelope) + sizeof(struct msg_postfix)) * \ - CONFIG_ZMK_SPLIT_WIRED_CMD_BUFFER_ITEMS) - -#if IS_HALF_DUPLEX_MODE - -static K_SEM_DEFINE(tx_sem, 0, 1); - -#endif - -RING_BUF_DECLARE(rx_buf, RX_BUFFER_SIZE); -RING_BUF_DECLARE(tx_buf, TX_BUFFER_SIZE); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -static const struct device *uart = DEVICE_DT_GET(DT_INST_PHANDLE(0, device)); - -#define HAS_DIR_GPIO (IS_HALF_DUPLEX_MODE && DT_INST_NODE_HAS_PROP(0, dir_gpios)) - -#if HAS_DIR_GPIO - -static const struct gpio_dt_spec dir_gpio = GPIO_DT_SPEC_INST_GET(0, dir_gpios); - -#endif - -#define HAS_DETECT_GPIO DT_INST_NODE_HAS_PROP(0, detect_gpios) - -#if HAS_DETECT_GPIO - -static const struct gpio_dt_spec detect_gpio = GPIO_DT_SPEC_INST_GET(0, detect_gpios); - -#endif - -#else - -#error \ - "Need to create a node with compatible of 'zmk,wired-split` with a `device` property set to an enabled UART. See http://zmk.dev/docs/hardware-integration/new-shield#wired-split" - -#endif - -static void publish_events_work(struct k_work *work); - -K_WORK_DEFINE(publish_events, publish_events_work); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - -uint8_t async_rx_buf[2][RX_BUFFER_SIZE / 2]; - -static struct zmk_split_wired_async_state async_state = { - .process_tx_work = &publish_events, - .rx_bufs = {async_rx_buf[0], async_rx_buf[1]}, - .rx_bufs_len = RX_BUFFER_SIZE / 2, - .rx_size_process_trigger = MSG_EXTRA_SIZE + 1, - .rx_buf = &rx_buf, - .tx_buf = &tx_buf, -#if HAS_DIR_GPIO - .dir_gpio = &dir_gpio, -#endif -}; - -#endif - -#if IS_HALF_DUPLEX_MODE - -static int can_tx(void) { return k_sem_take(&tx_sem, K_NO_WAIT); } - -#else - -static inline int can_tx(void) { return 0; } - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -static void send_pending_tx_work_cb(struct k_work *work); - -static K_WORK_DEFINE(wired_central_tx_work, send_pending_tx_work_cb); - -static void read_timer_cb(struct k_timer *_timer) { - zmk_split_wired_poll_in(&rx_buf, uart, &publish_events, NULL); - // Check if we found any bytes, read some, or read all the bytes in the RX -} - -static K_TIMER_DEFINE(wired_central_read_timer, read_timer_cb, NULL); - -#endif - -static void begin_tx(void) { -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - uart_irq_tx_enable(uart); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - zmk_split_wired_async_tx(&async_state); -#else - k_work_submit(&wired_central_tx_work); -#endif -} - -static void begin_rx(void) { -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_get(uart); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(uart, PM_DEVICE_ACTION_RESUME); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - uart_irq_rx_enable(uart); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - zmk_split_wired_async_rx(&async_state); -#else - k_timer_start(&wired_central_read_timer, K_TICKS(CONFIG_ZMK_SPLIT_WIRED_POLLING_RX_PERIOD), - K_TICKS(CONFIG_ZMK_SPLIT_WIRED_POLLING_RX_PERIOD)); -#endif -} - -#if HAS_DETECT_GPIO - -static void stop_rx(void) { -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - uart_irq_rx_disable(uart); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - zmk_split_wired_async_rx_cancel(&async_state); -#else - k_timer_stop(&wired_central_read_timer); -#endif - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_put(uart); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) -} - -#endif // HAS_DETECT_GPIO - -static ssize_t get_payload_data_size(const struct zmk_split_transport_central_command *cmd) { - switch (cmd->type) { - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_POLL_EVENTS: - return 0; - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_INVOKE_BEHAVIOR: - return sizeof(cmd->data.invoke_behavior); - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_PHYSICAL_LAYOUT: - return sizeof(cmd->data.set_physical_layout); - case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_HID_INDICATORS: - return sizeof(cmd->data.set_hid_indicators); - default: - return -ENOTSUP; - } -} - -static int split_central_wired_send_command(uint8_t source, - struct zmk_split_transport_central_command cmd) { - if (source != 0) { - return -EINVAL; - } - - ssize_t data_size = get_payload_data_size(&cmd); - if (data_size < 0) { - LOG_WRN("Failed to determine payload data size %d", data_size); - return data_size; - } - - // Data + type + source - size_t payload_size = - data_size + sizeof(source) + sizeof(enum zmk_split_transport_central_command_type); - - if (ring_buf_space_get(&tx_buf) < MSG_EXTRA_SIZE + payload_size) { - LOG_WRN("No room to send command to the peripheral %d", source); - return -ENOSPC; - } - - struct command_envelope env = {.prefix = - { - .magic_prefix = ZMK_SPLIT_WIRED_ENVELOPE_MAGIC_PREFIX, - .payload_size = payload_size, - }, - .payload = { - .source = source, - .cmd = cmd, - }}; - - struct msg_postfix postfix = {.crc = - crc32_ieee((void *)&env, sizeof(env.prefix) + payload_size)}; - - ring_buf_put(&tx_buf, (uint8_t *)&env, sizeof(env.prefix) + payload_size); - ring_buf_put(&tx_buf, (uint8_t *)&postfix, sizeof(postfix)); - - if (can_tx() >= 0) { - begin_tx(); - } - - return 0; -} - -#if IS_HALF_DUPLEX_MODE - -void rx_done_cb(struct k_work *work); - -static K_WORK_DELAYABLE_DEFINE(rx_done_work, rx_done_cb); - -void rx_done_cb(struct k_work *work) { - k_sem_give(&tx_sem); - - // Poll for the next event data! - split_central_wired_send_command(0, - (struct zmk_split_transport_central_command){ - .type = ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_POLL_EVENTS, - }); - - k_work_reschedule(&rx_done_work, K_MSEC(CONFIG_ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_TIMEOUT)); -} - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - -static void serial_cb(const struct device *dev, void *user_data) { - - while (uart_irq_update(dev) && uart_irq_is_pending(dev)) { - if (uart_irq_rx_ready(dev)) { - zmk_split_wired_fifo_read(dev, &rx_buf, &publish_events, NULL); -#if IS_HALF_DUPLEX_MODE - k_work_reschedule(&rx_done_work, - K_TICKS(CONFIG_ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_COMPLETE_TIMEOUT)); -#endif - } - - if (uart_irq_tx_complete(dev)) { - - if (ring_buf_size_get(&tx_buf) == 0) { - uart_irq_tx_disable(dev); -#if HAS_DIR_GPIO - gpio_pin_set_dt(&dir_gpio, 0); -#endif - } - } - - if (uart_irq_tx_ready(dev)) { -#if HAS_DIR_GPIO - gpio_pin_set_dt(&dir_gpio, 1); -#endif - zmk_split_wired_fifo_fill(dev, &tx_buf); - } - } -} - -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -static void send_pending_tx_work_cb(struct k_work *work) { - zmk_split_wired_poll_out(&tx_buf, uart); -} - -#endif - -#if HAS_DETECT_GPIO - -static void notify_transport_status(void); - -static struct gpio_callback detect_callback; - -static void notify_status_work_cb(struct k_work *_work) { notify_transport_status(); } - -static K_WORK_DEFINE(notify_status_work, notify_status_work_cb); - -static void detect_pin_irq_callback_handler(const struct device *port, struct gpio_callback *cb, - const gpio_port_pins_t pin) { - k_work_submit(¬ify_status_work); -} - -#endif - -static int zmk_split_wired_central_init(void) { - if (!device_is_ready(uart)) { - return -ENODEV; - } - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_put(uart); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - - int ret = uart_irq_callback_user_data_set(uart, serial_cb, NULL); - - if (ret < 0) { - if (ret == -ENOTSUP) { - LOG_ERR("Interrupt-driven UART API support not enabled"); - } else if (ret == -ENOSYS) { - LOG_ERR("UART device does not support interrupt-driven API"); - } else { - LOG_ERR("Error setting UART callback: %d\n", ret); - } - return ret; - } - - uart_irq_rx_enable(uart); - -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - - async_state.uart = uart; - int ret = zmk_split_wired_async_init(&async_state); - if (ret < 0) { - LOG_ERR("Failed to set up async wired split UART (%d)", ret); - return ret; - } - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_*) - -#if IS_HALF_DUPLEX_MODE - -#if HAS_DIR_GPIO - gpio_pin_configure_dt(&dir_gpio, GPIO_OUTPUT_INACTIVE); -#endif - -#endif // IS_HALF_DUPLEX_MODE - -#if HAS_DETECT_GPIO - - gpio_pin_configure_dt(&detect_gpio, GPIO_INPUT); - - gpio_init_callback(&detect_callback, detect_pin_irq_callback_handler, BIT(detect_gpio.pin)); - int err = gpio_add_callback(detect_gpio.port, &detect_callback); - if (err) { - LOG_ERR("Error adding the callback to the detect pin: %i", err); - return err; - } - - err = gpio_pin_interrupt_configure_dt(&detect_gpio, GPIO_INT_EDGE_BOTH); - if (err < 0) { - LOG_WRN("Failed to so configure interrupt for detection pin (%d)", err); - return err; - } - -#endif // HAS_DETECT_GPIO - - return 0; -} - -SYS_INIT(zmk_split_wired_central_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); - -static int split_central_wired_get_available_source_ids(uint8_t *sources) { - sources[0] = 0; - - return 1; -} - -static int split_central_wired_set_enabled(bool enabled) { - if (enabled) { - begin_rx(); -#if IS_HALF_DUPLEX_MODE - k_work_schedule(&rx_done_work, K_MSEC(CONFIG_ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_TIMEOUT)); -#endif - return 0; -#if HAS_DETECT_GPIO - } else { -#if IS_HALF_DUPLEX_MODE - k_work_cancel_delayable(&rx_done_work); -#endif - stop_rx(); - return 0; -#endif - } - - return -ENOTSUP; -} - -#if HAS_DETECT_GPIO - -static zmk_split_transport_central_status_changed_cb_t transport_status_cb; - -static int -split_central_wired_set_status_callback(zmk_split_transport_central_status_changed_cb_t cb) { - transport_status_cb = cb; - return 0; -} - -static struct zmk_split_transport_status split_central_wired_get_status() { - int detected = gpio_pin_get_dt(&detect_gpio); - if (detected > 0) { - return (struct zmk_split_transport_status){ - .available = true, - .enabled = true, // Track this - .connections = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_ALL_CONNECTED, - - }; - } else { - return (struct zmk_split_transport_status){ - .available = false, - .enabled = true, // Track this - .connections = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED, - - }; - } -} - -#endif // HAS_DETECT_GPIO - -static const struct zmk_split_transport_central_api central_api = { - .send_command = split_central_wired_send_command, - .get_available_source_ids = split_central_wired_get_available_source_ids, - .set_enabled = split_central_wired_set_enabled, -#if HAS_DETECT_GPIO - .set_status_callback = split_central_wired_set_status_callback, - .get_status = split_central_wired_get_status, -#endif // HAS_DETECT_GPIO -}; - -ZMK_SPLIT_TRANSPORT_CENTRAL_REGISTER(wired_central, ¢ral_api, CONFIG_ZMK_SPLIT_WIRED_PRIORITY); - -#if HAS_DETECT_GPIO - -static void notify_transport_status(void) { - if (transport_status_cb) { - transport_status_cb(&wired_central, split_central_wired_get_status()); - } -} - -#endif - -static void publish_events_work(struct k_work *work) { - -#if IS_HALF_DUPLEX_MODE - k_work_reschedule(&rx_done_work, - K_MSEC(CONFIG_ZMK_SPLIT_WIRED_HALF_DUPLEX_RX_COMPLETE_TIMEOUT)); -#endif // IS_HALF_DUPLEX_MODE - - while (ring_buf_size_get(&rx_buf) > MSG_EXTRA_SIZE) { - struct event_envelope env; - int item_err = - zmk_split_wired_get_item(&rx_buf, (uint8_t *)&env, sizeof(struct event_envelope)); - switch (item_err) { - case 0: - zmk_split_transport_central_peripheral_event_handler(&wired_central, env.payload.source, - env.payload.event); - break; - case -EAGAIN: - return; - default: - LOG_WRN("Issue fetching an item from the RX buffer: %d", item_err); - return; - } - } -} diff --git a/app/src/split/wired/peripheral.c b/app/src/split/wired/peripheral.c deleted file mode 100644 index 71d3da83..00000000 --- a/app/src/split/wired/peripheral.c +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -#include -#include -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wired.h" - -#define DT_DRV_COMPAT zmk_wired_split - -#define IS_HALF_DUPLEX_MODE \ - (DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) && DT_INST_PROP_OR(0, half_duplex, false)) - -#define TX_BUFFER_SIZE \ - ((sizeof(struct event_envelope) + sizeof(struct msg_postfix)) * \ - CONFIG_ZMK_SPLIT_WIRED_EVENT_BUFFER_ITEMS) -#define RX_BUFFER_SIZE \ - ((sizeof(struct command_envelope) + sizeof(struct msg_postfix)) * \ - CONFIG_ZMK_SPLIT_WIRED_CMD_BUFFER_ITEMS) - -RING_BUF_DECLARE(chosen_rx_buf, RX_BUFFER_SIZE); -RING_BUF_DECLARE(chosen_tx_buf, TX_BUFFER_SIZE); - -static const uint8_t peripheral_id = 0; - -K_SEM_DEFINE(tx_sem, 0, 1); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -static const struct device *uart = DEVICE_DT_GET(DT_INST_PHANDLE(0, device)); - -#define HAS_DIR_GPIO (DT_INST_NODE_HAS_PROP(0, dir_gpios)) - -#if HAS_DIR_GPIO - -static const struct gpio_dt_spec dir_gpio = GPIO_DT_SPEC_INST_GET(0, dir_gpios); - -#endif - -#define HAS_DETECT_GPIO DT_INST_NODE_HAS_PROP(0, detect_gpios) - -#if HAS_DETECT_GPIO - -static const struct gpio_dt_spec detect_gpio = GPIO_DT_SPEC_INST_GET(0, detect_gpios); - -#endif - -#else - -#error \ - "Need to create a node with compatible of 'zmk,wired-split` with a `device` property set to an enabled UART. See http://zmk.dev/docs/hardware-integration/new-shield#wired-split" - -#endif - -static void publish_commands_work(struct k_work *work); - -K_WORK_DEFINE(publish_commands, publish_commands_work); - -static void process_tx_cb(void); -K_MSGQ_DEFINE(cmd_msg_queue, sizeof(struct zmk_split_transport_central_command), 3, 4); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - -uint8_t async_rx_buf[2][RX_BUFFER_SIZE / 2]; - -static struct zmk_split_wired_async_state async_state = { - .rx_bufs = {async_rx_buf[0], async_rx_buf[1]}, - .rx_bufs_len = RX_BUFFER_SIZE / 2, - .rx_size_process_trigger = sizeof(struct command_envelope), - .process_tx_callback = process_tx_cb, - .rx_buf = &chosen_rx_buf, - .tx_buf = &chosen_tx_buf, -#if HAS_DIR_GPIO - .dir_gpio = &dir_gpio, -#endif -}; - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -static void wired_peripheral_read_tick_cb(struct k_timer *timer) { - zmk_split_wired_poll_in(&chosen_rx_buf, uart, NULL, process_tx_cb); -} - -static K_TIMER_DEFINE(wired_peripheral_read_timer, wired_peripheral_read_tick_cb, NULL); - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -static void begin_rx(void) { -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_get(uart); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(uart, PM_DEVICE_ACTION_RESUME); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - uart_irq_rx_enable(uart); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - zmk_split_wired_async_rx(&async_state); -#else - k_timer_start(&wired_peripheral_read_timer, K_TICKS(CONFIG_ZMK_SPLIT_WIRED_POLLING_RX_PERIOD), - K_TICKS(CONFIG_ZMK_SPLIT_WIRED_POLLING_RX_PERIOD)); -#endif -} - -#if HAS_DETECT_GPIO - -static void stop_rx(void) { -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - uart_irq_rx_disable(uart); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - zmk_split_wired_async_rx_cancel(&async_state); -#else - k_timer_stop(&wired_peripheral_read_timer); -#endif - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_put(uart); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) -} - -#endif // HAS_DETECT_GPIO - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - -static void serial_cb(const struct device *dev, void *user_data) { - while (uart_irq_update(dev) && uart_irq_is_pending(dev)) { - if (uart_irq_rx_ready(dev)) { - zmk_split_wired_fifo_read(dev, &chosen_rx_buf, NULL, process_tx_cb); - } - - if (uart_irq_tx_complete(dev)) { - if (ring_buf_size_get(&chosen_tx_buf) == 0) { - uart_irq_tx_disable(dev); - } - -#if HAS_DIR_GPIO - gpio_pin_set_dt(&dir_gpio, 0); -#endif - } - - if (uart_irq_tx_ready(dev)) { -#if HAS_DIR_GPIO - gpio_pin_set_dt(&dir_gpio, 1); -#endif - zmk_split_wired_fifo_fill(dev, &chosen_tx_buf); - } - } -} - -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -static void send_pending_tx_work_cb(struct k_work *work) { - zmk_split_wired_poll_out(&chosen_tx_buf, uart); -} - -static K_WORK_DEFINE(send_pending_tx, send_pending_tx_work_cb); - -#endif - -#if HAS_DETECT_GPIO - -static void notify_transport_status(void); - -static struct gpio_callback detect_callback; - -static void notify_status_work_cb(struct k_work *_work) { notify_transport_status(); } - -static K_WORK_DEFINE(notify_status_work, notify_status_work_cb); - -static void detect_pin_irq_callback_handler(const struct device *port, struct gpio_callback *cb, - const gpio_port_pins_t pin) { - k_work_submit(¬ify_status_work); -} - -#endif - -static int zmk_split_wired_peripheral_init(void) { - if (!device_is_ready(uart)) { - return -ENODEV; - } - -#if IS_ENABLED(CONFIG_PM_DEVICE_RUNTIME) - pm_device_runtime_put(uart); -#elif IS_ENABLED(CONFIG_PM_DEVICE) - pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND); -#endif // IS_ENABLED(CONFIG_PM_DEVICE) - -#if HAS_DIR_GPIO - gpio_pin_configure_dt(&dir_gpio, GPIO_OUTPUT_INACTIVE); -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - /* configure interrupt and callback to receive data */ - int ret = uart_irq_callback_user_data_set(uart, serial_cb, NULL); - - if (ret < 0) { - if (ret == -ENOTSUP) { - LOG_ERR("Interrupt-driven UART API support not enabled"); - } else if (ret == -ENOSYS) { - LOG_ERR("UART device does not support interrupt-driven API"); - } else { - LOG_ERR("Error setting UART callback: %d\n", ret); - } - return ret; - } - -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - async_state.uart = uart; - int ret = zmk_split_wired_async_init(&async_state); - if (ret < 0) { - LOG_ERR("Failed to set up async wired split UART (%d)", ret); - return ret; - } -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - -#if HAS_DETECT_GPIO - - gpio_pin_configure_dt(&detect_gpio, GPIO_INPUT); - - gpio_init_callback(&detect_callback, detect_pin_irq_callback_handler, BIT(detect_gpio.pin)); - int err = gpio_add_callback(detect_gpio.port, &detect_callback); - if (err) { - LOG_ERR("Error adding the callback to the detect pin: %i", err); - return err; - } - - err = gpio_pin_interrupt_configure_dt(&detect_gpio, GPIO_INT_EDGE_BOTH); - if (err < 0) { - LOG_WRN("Failed to so configure interrupt for detection pin (%d)", err); - return err; - } - -#endif // HAS_DETECT_GPIO - - return 0; -} - -SYS_INIT(zmk_split_wired_peripheral_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); - -static void begin_tx(void) { -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - uart_irq_tx_enable(uart); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - zmk_split_wired_async_tx(&async_state); -#elif IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - k_work_submit(&send_pending_tx); -#endif -} - -static ssize_t get_payload_data_size(const struct zmk_split_transport_peripheral_event *evt) { - switch (evt->type) { - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_INPUT_EVENT: - return sizeof(evt->data.input_event); - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_KEY_POSITION_EVENT: - return sizeof(evt->data.key_position_event); - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_SENSOR_EVENT: - return sizeof(evt->data.sensor_event); - case ZMK_SPLIT_TRANSPORT_PERIPHERAL_EVENT_TYPE_BATTERY_EVENT: - return sizeof(evt->data.battery_event); - default: - return -ENOTSUP; - } -} - -static int -split_peripheral_wired_report_event(const struct zmk_split_transport_peripheral_event *event) { - ssize_t data_size = get_payload_data_size(event); - if (data_size < 0) { - LOG_WRN("Failed to determine payload data size %d", data_size); - return data_size; - } - - // Data + type + source - size_t payload_size = - data_size + sizeof(peripheral_id) + sizeof(enum zmk_split_transport_peripheral_event_type); - - if (ring_buf_space_get(&chosen_tx_buf) < MSG_EXTRA_SIZE + payload_size) { - LOG_WRN("No room to send peripheral to the central (have %d but only space for %d)", - MSG_EXTRA_SIZE + payload_size, ring_buf_space_get(&chosen_tx_buf)); - return -ENOSPC; - } - - struct event_envelope env = {.prefix = - { - .magic_prefix = ZMK_SPLIT_WIRED_ENVELOPE_MAGIC_PREFIX, - .payload_size = payload_size, - }, - .payload = { - .source = peripheral_id, - .event = *event, - }}; - - struct msg_postfix postfix = {.crc = - crc32_ieee((void *)&env, sizeof(env.prefix) + payload_size)}; - - LOG_HEXDUMP_DBG(&env, sizeof(env.prefix) + payload_size, "Payload"); - - size_t put = ring_buf_put(&chosen_tx_buf, (uint8_t *)&env, sizeof(env.prefix) + payload_size); - if (put != sizeof(env.prefix) + payload_size) { - LOG_WRN("Failed to put the whole message (%d vs %d)", put, - sizeof(env.prefix) + payload_size); - } - put = ring_buf_put(&chosen_tx_buf, (uint8_t *)&postfix, sizeof(postfix)); - if (put != sizeof(postfix)) { - LOG_WRN("Failed to put the whole message (%d vs %d)", put, sizeof(postfix)); - } - -#if !IS_HALF_DUPLEX_MODE - begin_tx(); -#endif - - return 0; -} - -static bool is_enabled; - -static int split_peripheral_wired_set_enabled(bool enabled) { - if (is_enabled == enabled) { - return 0; - } - - is_enabled = enabled; - - if (enabled) { - begin_rx(); - return 0; -#if HAS_DETECT_GPIO - } else { - stop_rx(); - return 0; -#endif - } - - return -ENOTSUP; -} - -#if HAS_DETECT_GPIO - -static zmk_split_transport_peripheral_status_changed_cb_t transport_status_cb; - -static int -split_peripheral_wired_set_status_callback(zmk_split_transport_peripheral_status_changed_cb_t cb) { - transport_status_cb = cb; - return 0; -} - -static struct zmk_split_transport_status split_peripheral_wired_get_status() { - int detected = gpio_pin_get_dt(&detect_gpio); - if (detected > 0) { - return (struct zmk_split_transport_status){ - .available = true, - .enabled = true, // Track this - .connections = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_ALL_CONNECTED, - - }; - } else { - return (struct zmk_split_transport_status){ - .available = false, - .enabled = true, // Track this - .connections = ZMK_SPLIT_TRANSPORT_CONNECTIONS_STATUS_DISCONNECTED, - - }; - } -} - -#endif // HAS_DETECT_GPIO - -static const struct zmk_split_transport_peripheral_api peripheral_api = { - .report_event = split_peripheral_wired_report_event, - .set_enabled = split_peripheral_wired_set_enabled, -#if HAS_DETECT_GPIO - .set_status_callback = split_peripheral_wired_set_status_callback, - .get_status = split_peripheral_wired_get_status, -#endif // HAS_DETECT_GPIO -}; - -ZMK_SPLIT_TRANSPORT_PERIPHERAL_REGISTER(wired_peripheral, &peripheral_api, - CONFIG_ZMK_SPLIT_WIRED_PRIORITY); - -#if HAS_DETECT_GPIO - -static void notify_transport_status(void) { - if (transport_status_cb) { - LOG_DBG("Invoking the status CB"); - transport_status_cb(&wired_peripheral, split_peripheral_wired_get_status()); - } -} - -#endif // HAS_DETECT_GPIO - -static void process_tx_cb(void) { - while (ring_buf_size_get(&chosen_rx_buf) > MSG_EXTRA_SIZE) { - struct command_envelope env; - int item_err = zmk_split_wired_get_item(&chosen_rx_buf, (uint8_t *)&env, - sizeof(struct command_envelope)); - switch (item_err) { - case 0: - if (env.payload.cmd.type == ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_POLL_EVENTS) { - begin_tx(); - } else { - int ret = k_msgq_put(&cmd_msg_queue, &env.payload.cmd, K_NO_WAIT); - if (ret < 0) { - LOG_WRN("Failed to queue command for processing (%d)", ret); - return; - } - - k_work_submit(&publish_commands); - } - break; - case -EAGAIN: - return; - default: - LOG_WRN("Issue fetching an item from the RX buffer: %d", item_err); - return; - } - } -} -static void publish_commands_work(struct k_work *work) { - struct zmk_split_transport_central_command cmd; - - while (k_msgq_get(&cmd_msg_queue, &cmd, K_NO_WAIT) >= 0) { - zmk_split_transport_peripheral_command_handler(&wired_peripheral, cmd); - } -} diff --git a/app/src/split/wired/wired.c b/app/src/split/wired/wired.c deleted file mode 100644 index 0df4c709..00000000 --- a/app/src/split/wired/wired.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "wired.h" - -#include -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -void zmk_split_wired_poll_out(struct ring_buf *tx_buf, const struct device *uart) { - uint8_t *buf; - uint32_t claim_len; - while ((claim_len = ring_buf_get_claim(tx_buf, &buf, MIN(32, tx_buf->size))) > 0) { - LOG_HEXDUMP_DBG(buf, claim_len, "TX Bytes"); - for (int i = 0; i < claim_len; i++) { - uart_poll_out(uart, buf[i]); - } - - ring_buf_get_finish(tx_buf, claim_len); - } -} - -int zmk_split_wired_poll_in(struct ring_buf *rx_buf, const struct device *uart, - struct k_work *process_data_work, - zmk_split_wired_process_tx_callback_t process_data_cb) { - uint8_t *buf; - uint32_t read = 0; - uint32_t claim_len = ring_buf_put_claim(rx_buf, &buf, ring_buf_space_get(rx_buf)); - if (claim_len < 1) { - LOG_WRN("No room available for reading in from the serial port"); - return -ENOSPC; - } - - bool all_read = false; - while (read < claim_len) { - if (uart_poll_in(uart, buf + read) < 0) { - all_read = true; - break; - } - - read++; - } - - ring_buf_put_finish(rx_buf, read); - - if (ring_buf_size_get(rx_buf) > 0) { - if (process_data_work) { - k_work_submit(process_data_work); - } else if (process_data_cb) { - process_data_cb(); - } - } - - // TODO: Also indicate if no bytes read at all? - return (all_read ? 1 : 0); -} - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - -void zmk_split_wired_fifo_read(const struct device *dev, struct ring_buf *buf, - struct k_work *process_work, - zmk_split_wired_process_tx_callback_t process_cb) { - // TODO: Add error checking on platforms that support it - uint32_t last_read = 0, len = 0; - do { - uint8_t *buffer; - len = ring_buf_put_claim(buf, &buffer, buf->size); - if (len > 0) { - last_read = uart_fifo_read(dev, buffer, len); - - ring_buf_put_finish(buf, last_read); - } else { - LOG_ERR("Dropping incoming RPC byte, insufficient room in the RX buffer. Bump " - "CONFIG_ZMK_STUDIO_RPC_RX_BUF_SIZE."); - uint8_t dummy; - last_read = uart_fifo_read(dev, &dummy, 1); - } - } while (last_read && last_read == len); - - if (process_work) { - k_work_submit(process_work); - } else if (process_cb) { - process_cb(); - } -} - -void zmk_split_wired_fifo_fill(const struct device *dev, struct ring_buf *tx_buf) { - uint32_t len; - while ((len = ring_buf_size_get(tx_buf)) > 0) { - uint8_t *buf; - uint32_t claim_len = ring_buf_get_claim(tx_buf, &buf, tx_buf->size); - - if (claim_len <= 0) { - break; - } - - int sent = uart_fifo_fill(dev, buf, claim_len); - - ring_buf_get_finish(tx_buf, MAX(sent, 0)); - - if (sent <= 0) { - break; - } - } - - // if (ring_buf_size_get(tx_buf) == 0) { - // uart_irq_tx_disable(dev); - // } -} - -#endif // IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - -enum ASYNC_STATE_BITS { - ASYNC_STATE_BIT_RXBUF0_USED = 0, - ASYNC_STATE_BIT_RXBUF1_USED, -}; - -void zmk_split_wired_async_tx(struct zmk_split_wired_async_state *state) { - uint8_t *buf; - uint32_t claim_len = ring_buf_get_claim(state->tx_buf, &buf, ring_buf_size_get(state->tx_buf)); - - if (claim_len <= 0) { - return; - } - - if (state->dir_gpio) { - gpio_pin_set_dt(state->dir_gpio, 1); - } - -#if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - LOG_DBG("Sending %d", claim_len); -#endif - int err = uart_tx(state->uart, buf, claim_len, SYS_FOREVER_US); - if (err < 0) { - LOG_DBG("NO TX %d", err); - } -} - -int zmk_split_wired_async_rx(struct zmk_split_wired_async_state *state) { - - atomic_set_bit(&state->state, ASYNC_STATE_BIT_RXBUF0_USED); - atomic_clear_bit(&state->state, ASYNC_STATE_BIT_RXBUF1_USED); - - int ret = uart_rx_enable(state->uart, state->rx_bufs[0], state->rx_bufs_len, - CONFIG_ZMK_SPLIT_WIRED_ASYNC_RX_TIMEOUT); - if (ret < 0) { - LOG_ERR("Failed to enable RX (%d)", ret); - } - - return ret; -} - -int zmk_split_wired_async_rx_cancel(struct zmk_split_wired_async_state *state) { - return uart_rx_disable(state->uart); -} - -static void restart_rx_work_cb(struct k_work *work) { - struct k_work_delayable *dwork = k_work_delayable_from_work(work); - struct zmk_split_wired_async_state *state = - CONTAINER_OF(dwork, struct zmk_split_wired_async_state, restart_rx_work); - - zmk_split_wired_async_rx(state); -} - -static void async_uart_cb(const struct device *dev, struct uart_event *ev, void *user_data) { - struct zmk_split_wired_async_state *state = (struct zmk_split_wired_async_state *)user_data; - - switch (ev->type) { - case UART_TX_ABORTED: - // This can only really occur for a TX timeout for a HW flow control UART setup. What to do - // here in practice? - LOG_WRN("TX Aborted"); - break; - case UART_TX_DONE: - LOG_DBG("TX Done %d", ev->data.tx.len); - ring_buf_get_finish(state->tx_buf, ev->data.tx.len); - if (ring_buf_size_get(state->tx_buf) > 0) { - zmk_split_wired_async_tx(state); - } else { - if (state->dir_gpio) { - gpio_pin_set_dt(state->dir_gpio, 0); - } - } - break; - case UART_RX_RDY: { - size_t received = - ring_buf_put(state->rx_buf, &ev->data.rx.buf[ev->data.rx.offset], ev->data.rx.len); - if (received < ev->data.rx.len) { - LOG_ERR("RX overrun!"); - break; - } - - // LOG_DBG("RX %d and now buffer is %d", received, ring_buf_size_get(state->rx_buf)); - if (state->process_tx_callback) { - state->process_tx_callback(); - } else if (state->process_tx_work) { - k_work_submit(state->process_tx_work); - } - - break; - } - case UART_RX_BUF_RELEASED: - if (ev->data.rx_buf.buf == state->rx_bufs[0]) { - atomic_clear_bit(&state->state, ASYNC_STATE_BIT_RXBUF0_USED); - } else if (ev->data.rx_buf.buf == state->rx_bufs[1]) { - atomic_clear_bit(&state->state, ASYNC_STATE_BIT_RXBUF1_USED); - } - - break; - case UART_RX_BUF_REQUEST: - if (!atomic_test_and_set_bit(&state->state, ASYNC_STATE_BIT_RXBUF0_USED)) { - uart_rx_buf_rsp(state->uart, state->rx_bufs[0], state->rx_bufs_len); - break; - } - - if (!atomic_test_and_set_bit(&state->state, ASYNC_STATE_BIT_RXBUF1_USED)) { - uart_rx_buf_rsp(state->uart, state->rx_bufs[1], state->rx_bufs_len); - break; - } - - LOG_WRN("No RX buffers available!"); - break; - case UART_RX_STOPPED: - // LOG_WRN("UART RX Stopped %d with state %ld", ev->data.rx_stop.reason, state->state); - break; - case UART_RX_DISABLED: { - k_work_schedule(&state->restart_rx_work, K_MSEC(1)); - - break; - } - default: - break; - } -} - -int zmk_split_wired_async_init(struct zmk_split_wired_async_state *state) { - __ASSERT(state != NULL, "State is null"); - - k_work_init_delayable(&state->restart_rx_work, restart_rx_work_cb); - - int ret = uart_callback_set(state->uart, async_uart_cb, state); - if (ret < 0) { - LOG_ERR("Failed to set up async callback on UART (%d)", ret); - return ret; - } - - // atomic_set_bit(&state->state, ASYNC_STATE_BIT_RXBUF0_USED); - - // ret = uart_rx_enable(state->uart, state->rx_bufs[0], state->rx_bufs_len, - // CONFIG_ZMK_SPLIT_WIRED_ASYNC_RX_TIMEOUT); - // if (ret < 0) { - // LOG_ERR("Failed to enable RX (%d)", ret); - // return ret; - // } - - return 0; -} - -#endif - -int zmk_split_wired_get_item(struct ring_buf *rx_buf, uint8_t *env, size_t env_size) { - while (ring_buf_size_get(rx_buf) > sizeof(struct msg_prefix) + sizeof(struct msg_postfix)) { - struct msg_prefix prefix; - - __ASSERT_EVAL( - (void)ring_buf_peek(rx_buf, (uint8_t *)&prefix, sizeof(prefix)), - uint32_t peek_read = ring_buf_peek(rx_buf, (uint8_t *)&prefix, sizeof(prefix)), - peek_read == sizeof(prefix), "Somehow read less than we expect from the RX buffer"); - - if (memcmp(&prefix.magic_prefix, &ZMK_SPLIT_WIRED_ENVELOPE_MAGIC_PREFIX, - sizeof(prefix.magic_prefix)) != 0) { - uint8_t discarded_byte; - ring_buf_get(rx_buf, &discarded_byte, 1); - - LOG_WRN("Prefix mismatch, discarding byte %0x", discarded_byte); - - continue; - } - - size_t payload_to_read = sizeof(prefix) + prefix.payload_size; - - if (payload_to_read > env_size) { - LOG_WRN("Invalid message with payload %d bigger than expected max %d", payload_to_read, - env_size); - return -EINVAL; - } - - if (ring_buf_size_get(rx_buf) < payload_to_read + sizeof(struct msg_postfix)) { - return -EAGAIN; - } - - // Now that prefix matches, read it out so we can read the rest of the payload. - __ASSERT_EVAL((void)ring_buf_get(rx_buf, env, payload_to_read), - uint32_t read = ring_buf_get(rx_buf, env, payload_to_read), - read == payload_to_read, - "Somehow read less than we expect from the RX buffer"); - - struct msg_postfix postfix; - __ASSERT_EVAL((void)ring_buf_get(rx_buf, (uint8_t *)&postfix, sizeof(postfix)), - uint32_t read = ring_buf_get(rx_buf, (uint8_t *)&postfix, sizeof(postfix)), - read == sizeof(postfix), - "Somehow read less of the postfix than we expect from the RX buffer"); - - uint32_t crc = crc32_ieee(env, payload_to_read); - if (crc != postfix.crc) { - LOG_WRN("Data corruption in received peripheral event, ignoring %d vs %d", crc, - postfix.crc); - return -EINVAL; - } - - return 0; - } - - return -EAGAIN; -} \ No newline at end of file diff --git a/app/src/split/wired/wired.h b/app/src/split/wired/wired.h deleted file mode 100644 index d48f29b7..00000000 --- a/app/src/split/wired/wired.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2025 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -#include - -#define ZMK_SPLIT_WIRED_ENVELOPE_MAGIC_PREFIX "ZmKw" - -struct msg_prefix { - uint8_t magic_prefix[sizeof(ZMK_SPLIT_WIRED_ENVELOPE_MAGIC_PREFIX) - 1]; - uint8_t payload_size; -} __packed; - -struct command_payload { - uint8_t source; - struct zmk_split_transport_central_command cmd; -} __packed; - -struct command_envelope { - struct msg_prefix prefix; - struct command_payload payload; -} __packed; - -struct event_payload { - uint8_t source; - struct zmk_split_transport_peripheral_event event; -} __packed; - -struct event_envelope { - struct msg_prefix prefix; - struct event_payload payload; -} __packed; - -struct msg_postfix { - uint32_t crc; -} __packed; - -#define MSG_EXTRA_SIZE (sizeof(struct msg_prefix) + sizeof(struct msg_postfix)) - -typedef void (*zmk_split_wired_process_tx_callback_t)(void); - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING) - -void zmk_split_wired_poll_out(struct ring_buf *tx_buf, const struct device *uart); - -int zmk_split_wired_poll_in(struct ring_buf *rx_buf, const struct device *uart, - struct k_work *process_data_work, - zmk_split_wired_process_tx_callback_t process_data_cb); - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT) - -void zmk_split_wired_fifo_read(const struct device *dev, struct ring_buf *buf, - struct k_work *process_work, - zmk_split_wired_process_tx_callback_t process_cb); -void zmk_split_wired_fifo_fill(const struct device *dev, struct ring_buf *tx_buf); - -#endif - -#if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) - -struct zmk_split_wired_async_state { - atomic_t state; - - uint8_t *rx_bufs[2]; - size_t rx_bufs_len; - size_t rx_size_process_trigger; - - struct ring_buf *tx_buf; - struct ring_buf *rx_buf; - - zmk_split_wired_process_tx_callback_t process_tx_callback; - - const struct device *uart; - - struct k_work_delayable restart_rx_work; - struct k_work *process_tx_work; - const struct gpio_dt_spec *dir_gpio; -}; - -int zmk_split_wired_async_init(struct zmk_split_wired_async_state *state); -void zmk_split_wired_async_tx(struct zmk_split_wired_async_state *state); -int zmk_split_wired_async_rx(struct zmk_split_wired_async_state *state); -int zmk_split_wired_async_rx_cancel(struct zmk_split_wired_async_state *state); - -#endif - -int zmk_split_wired_get_item(struct ring_buf *rx_buf, uint8_t *env, size_t env_size); \ No newline at end of file diff --git a/app/src/studio/CMakeLists.txt b/app/src/studio/CMakeLists.txt deleted file mode 100644 index a8417dd7..00000000 --- a/app/src/studio/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -zephyr_linker_sources(DATA_SECTIONS ../../include/linker/zmk-rpc-subsystems.ld) -zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-subsystem-handlers.ld) -zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-subsystem-settings-reset.ld) -zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-event-mappers.ld) -zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-transport.ld) - -target_sources(app PRIVATE msg_framing.c) -target_sources(app PRIVATE rpc.c) -target_sources(app PRIVATE core.c) -target_sources(app PRIVATE behavior_subsystem.c) -target_sources(app PRIVATE core_subsystem.c) -target_sources(app PRIVATE keymap_subsystem.c) -target_sources_ifdef(CONFIG_ZMK_STUDIO_TRANSPORT_UART app PRIVATE uart_rpc_transport.c) -target_sources_ifdef(CONFIG_ZMK_STUDIO_TRANSPORT_BLE app PRIVATE gatt_rpc_transport.c) \ No newline at end of file diff --git a/app/src/studio/Kconfig b/app/src/studio/Kconfig deleted file mode 100644 index 1f4da6d3..00000000 --- a/app/src/studio/Kconfig +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (c) 2024 The ZMK Contributors -# SPDX-License-Identifier: MIT - -menuconfig ZMK_STUDIO - bool "Studio Support" - select ZMK_STUDIO_RPC if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select PM_DEVICE # Needed for physical layout switching - help - Add firmware support for realtime keymap updates (ZMK Studio) - -if ZMK_STUDIO - -module = ZMK_STUDIO -module-str = zmk_studio -source "subsys/logging/Kconfig.template.log_config" - -menuconfig ZMK_STUDIO_LOCKING - bool "Lock Support" - -if ZMK_STUDIO_LOCKING - -config ZMK_STUDIO_LOCK_IDLE_TIMEOUT_SEC - int "Idle Timeout" - default 600 - -config ZMK_STUDIO_LOCK_ON_DISCONNECT - bool "Lock On Disconnect" - default y - -endif - -menuconfig ZMK_STUDIO_RPC - bool "Remote Procedure Calls (RPC)" - select NANOPB - # These two save stack size - imply NANOPB_NO_ERRMSG - imply NANOPB_WITHOUT_64BIT - imply NANOPB_NO_ENCODE_SIZE_CHECK - imply ZMK_STUDIO_LOCKING if !ARCH_POSIX - select CBPRINTF_LIBC_SUBSTS if ARCH_POSIX - select SETTINGS - select ZMK_BEHAVIOR_METADATA - select ZMK_BEHAVIOR_LOCAL_IDS - select RING_BUFFER - select ZMK_KEYMAP_SETTINGS_STORAGE - select ZMK_KEYMAP_LAYER_REORDERING - help - Add firmware support for studio RPC protocol - -if ZMK_STUDIO_RPC - -menu "Transports" - -DT_CHOSEN_ZMK_STUDIO_RPC_UART := zmk,studio-rpc-uart - -config ZMK_STUDIO_TRANSPORT_UART - bool "Serial" - select SERIAL - select RING_BUFFER - default y if $(dt_chosen_enabled,$(DT_CHOSEN_ZMK_STUDIO_RPC_UART)) - -if ZMK_STUDIO_TRANSPORT_UART - -config ZMK_STUDIO_TRANSPORT_UART_RX_STACK_SIZE - int "RX Stack Size" - depends on !UART_INTERRUPT_DRIVEN - default 512 - -config ZMK_STUDIO_TRANSPORT_UART_RX_PRIORITY - int "RX Thread Priority" - depends on !UART_INTERRUPT_DRIVEN - default 9 - -endif - -config ZMK_STUDIO_TRANSPORT_BLE - bool "BLE (GATT)" - select RING_BUFFER - select BT_USER_DATA_LEN_UPDATE - depends on ZMK_BLE - default y - - -config BT_CONN_TX_MAX - default 64 if ZMK_STUDIO_TRANSPORT_BLE - -if ZMK_STUDIO_TRANSPORT_BLE - -config ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY - int "BLE Transport preferred latency" - default 10 - help - When the studio UI is connected, a lower latency can be requested in order - to make the interactions between keyboard and studio faster. - -endif - -endmenu - -config ZMK_STUDIO_RPC_THREAD_STACK_SIZE - int "RPC Thread Stack Size" - default 4096 - -config ZMK_STUDIO_RPC_RX_BUF_SIZE - int "RX Buffer Size" - default 30 - -config ZMK_STUDIO_RPC_TX_BUF_SIZE - int "TX Buffer Size" - default 64 - -endif - -endif diff --git a/app/src/studio/behavior_subsystem.c b/app/src/studio/behavior_subsystem.c deleted file mode 100644 index 24591315..00000000 --- a/app/src/studio/behavior_subsystem.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include -#include -#include - -ZMK_RPC_SUBSYSTEM(behaviors) - -#define BEHAVIOR_RESPONSE(type, ...) ZMK_RPC_RESPONSE(behaviors, type, __VA_ARGS__) - -static bool encode_behavior_summaries(pb_ostream_t *stream, const pb_field_t *field, - void *const *arg) { - STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, beh) { - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - if (!pb_encode_varint(stream, beh->local_id)) { - LOG_ERR("Failed to encode behavior ID"); - return false; - } - } - - return true; -} - -zmk_studio_Response list_all_behaviors(const zmk_studio_Request *req) { - LOG_DBG(""); - zmk_behaviors_ListAllBehaviorsResponse beh_resp = - zmk_behaviors_ListAllBehaviorsResponse_init_zero; - beh_resp.behaviors.funcs.encode = encode_behavior_summaries; - - return BEHAVIOR_RESPONSE(list_all_behaviors, beh_resp); -} - -struct encode_metadata_sets_state { - const struct behavior_parameter_metadata_set *sets; - size_t sets_len; - size_t i; -}; - -static bool encode_value_description_name(pb_ostream_t *stream, const pb_field_t *field, - void *const *arg) { - struct behavior_parameter_value_metadata *state = - (struct behavior_parameter_value_metadata *)*arg; - - if (!state->display_name) { - return true; - } - - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - return pb_encode_string(stream, state->display_name, strlen(state->display_name)); -} - -static bool encode_value_description(pb_ostream_t *stream, const pb_field_t *field, - void *const *arg) { - struct encode_metadata_sets_state *state = (struct encode_metadata_sets_state *)*arg; - - const struct behavior_parameter_metadata_set *set = &state->sets[state->i]; - - bool is_param1 = field->tag == zmk_behaviors_BehaviorBindingParametersSet_param1_tag; - size_t values_len = is_param1 ? set->param1_values_len : set->param2_values_len; - const struct behavior_parameter_value_metadata *values = - is_param1 ? set->param1_values : set->param2_values; - - for (int val_i = 0; val_i < values_len; val_i++) { - const struct behavior_parameter_value_metadata *val = &values[val_i]; - - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - zmk_behaviors_BehaviorParameterValueDescription desc = - zmk_behaviors_BehaviorParameterValueDescription_init_zero; - desc.name.funcs.encode = encode_value_description_name; - desc.name.arg = (void *)val; - - switch (val->type) { - case BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE: - desc.which_value_type = zmk_behaviors_BehaviorParameterValueDescription_constant_tag; - desc.value_type.constant = val->value; - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_RANGE: - desc.which_value_type = zmk_behaviors_BehaviorParameterValueDescription_range_tag; - desc.value_type.range.min = val->range.min; - desc.value_type.range.max = val->range.max; - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_NIL: - desc.which_value_type = zmk_behaviors_BehaviorParameterValueDescription_nil_tag; - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_HID_USAGE: - desc.which_value_type = zmk_behaviors_BehaviorParameterValueDescription_hid_usage_tag; - desc.value_type.hid_usage.consumer_max = ZMK_HID_CONSUMER_MAX_USAGE; - desc.value_type.hid_usage.keyboard_max = ZMK_HID_KEYBOARD_MAX_USAGE; - break; - case BEHAVIOR_PARAMETER_VALUE_TYPE_LAYER_ID: - desc.which_value_type = zmk_behaviors_BehaviorParameterValueDescription_layer_id_tag; - break; - default: - LOG_ERR("Unknown value description type %d", val->type); - return false; - } - - if (!pb_encode_submessage(stream, &zmk_behaviors_BehaviorParameterValueDescription_msg, - &desc)) { - LOG_WRN("Failed to encode submessage for set %d, value %d!", state->i, val_i); - return false; - } - } - - return true; -} - -static bool encode_metadata_sets(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - struct encode_metadata_sets_state *state = (struct encode_metadata_sets_state *)*arg; - bool ret = true; - - LOG_DBG("Encoding the %d metadata sets with %p", state->sets_len, state->sets); - - for (int i = 0; i < state->sets_len; i++) { - LOG_DBG("Encoding set %d", i); - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - state->i = i; - zmk_behaviors_BehaviorBindingParametersSet msg = - zmk_behaviors_BehaviorBindingParametersSet_init_zero; - msg.param1.funcs.encode = encode_value_description; - msg.param1.arg = state; - msg.param2.funcs.encode = encode_value_description; - msg.param2.arg = state; - ret = pb_encode_submessage(stream, &zmk_behaviors_BehaviorBindingParametersSet_msg, &msg); - if (!ret) { - LOG_WRN("Failed to encode submessage for set %d", i); - break; - } - } - - return ret; -} - -static bool encode_behavior_name(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - struct zmk_behavior_ref *zbm = (struct zmk_behavior_ref *)*arg; - - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - return pb_encode_string(stream, zbm->metadata.display_name, strlen(zbm->metadata.display_name)); -} - -static struct encode_metadata_sets_state state = {}; - -zmk_studio_Response get_behavior_details(const zmk_studio_Request *req) { - uint32_t behavior_id = req->subsystem.behaviors.request_type.get_behavior_details.behavior_id; - const char *behavior_name = zmk_behavior_find_behavior_name_from_local_id(behavior_id); - - LOG_DBG("behavior_id %d, name %s", behavior_id, behavior_name); - - if (!behavior_name) { - LOG_WRN("No behavior found for ID %d", behavior_id); - return ZMK_RPC_SIMPLE_ERR(GENERIC); - } - - const struct device *device = behavior_get_binding(behavior_name); - - struct zmk_behavior_ref *zbm = NULL; - STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { - if (item->device == device) { - zbm = item; - break; - } - } - - __ASSERT(zbm != NULL, "Can't find a device without also having metadata"); - - struct behavior_parameter_metadata desc = {0}; - int ret = behavior_get_parameter_metadata(device, &desc); - if (ret < 0) { - LOG_DBG("Failed to fetch the metadata for %s! %d", zbm->metadata.display_name, ret); - } else { - LOG_DBG("Got metadata with %d sets", desc.sets_len); - } - - zmk_behaviors_GetBehaviorDetailsResponse resp = - zmk_behaviors_GetBehaviorDetailsResponse_init_zero; - resp.id = behavior_id; - resp.display_name.funcs.encode = encode_behavior_name; - resp.display_name.arg = zbm; - - state.sets = desc.sets; - state.sets_len = desc.sets_len; - - resp.metadata.funcs.encode = encode_metadata_sets; - resp.metadata.arg = &state; - - return BEHAVIOR_RESPONSE(get_behavior_details, resp); -} - -ZMK_RPC_SUBSYSTEM_HANDLER(behaviors, list_all_behaviors, ZMK_STUDIO_RPC_HANDLER_UNSECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(behaviors, get_behavior_details, ZMK_STUDIO_RPC_HANDLER_SECURED); diff --git a/app/src/studio/core.c b/app/src/studio/core.c deleted file mode 100644 index fafe0248..00000000 --- a/app/src/studio/core.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -ZMK_EVENT_IMPL(zmk_studio_core_lock_state_changed); - -static enum zmk_studio_core_lock_state state = IS_ENABLED(CONFIG_ZMK_STUDIO_LOCKING) - ? ZMK_STUDIO_CORE_LOCK_STATE_LOCKED - : ZMK_STUDIO_CORE_LOCK_STATE_UNLOCKED; - -enum zmk_studio_core_lock_state zmk_studio_core_get_lock_state(void) { return state; } - -static void set_state(enum zmk_studio_core_lock_state new_state) { - if (state == new_state) { - return; - } - - state = new_state; - - raise_zmk_studio_core_lock_state_changed( - (struct zmk_studio_core_lock_state_changed){.state = state}); -} - -#if CONFIG_ZMK_STUDIO_LOCK_IDLE_TIMEOUT_SEC > 0 - -static void core_idle_lock_timeout_cb(struct k_work *work) { zmk_studio_core_lock(); } - -K_WORK_DELAYABLE_DEFINE(core_idle_lock_timeout, core_idle_lock_timeout_cb); - -void zmk_studio_core_reschedule_lock_timeout() { - k_work_reschedule(&core_idle_lock_timeout, K_SECONDS(CONFIG_ZMK_STUDIO_LOCK_IDLE_TIMEOUT_SEC)); -} - -#else - -void zmk_studio_core_reschedule_lock_timeout() {} - -#endif - -void zmk_studio_core_unlock() { - set_state(ZMK_STUDIO_CORE_LOCK_STATE_UNLOCKED); - - zmk_studio_core_reschedule_lock_timeout(); -} - -void zmk_studio_core_lock() { set_state(ZMK_STUDIO_CORE_LOCK_STATE_LOCKED); } \ No newline at end of file diff --git a/app/src/studio/core_subsystem.c b/app/src/studio/core_subsystem.c deleted file mode 100644 index 1739919a..00000000 --- a/app/src/studio/core_subsystem.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include -#include - -ZMK_RPC_SUBSYSTEM(core) - -#define CORE_RESPONSE(type, ...) ZMK_RPC_RESPONSE(core, type, __VA_ARGS__) - -static bool encode_device_info_name(pb_ostream_t *stream, const pb_field_t *field, - void *const *arg) { - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - return pb_encode_string(stream, CONFIG_ZMK_KEYBOARD_NAME, strlen(CONFIG_ZMK_KEYBOARD_NAME)); -} - -#if IS_ENABLED(CONFIG_HWINFO) -static bool encode_device_info_serial_number(pb_ostream_t *stream, const pb_field_t *field, - void *const *arg) { - uint8_t id_buffer[32]; - const ssize_t id_size = hwinfo_get_device_id(id_buffer, ARRAY_SIZE(id_buffer)); - - if (id_size <= 0) { - return true; - } - - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - return pb_encode_string(stream, id_buffer, id_size); -} - -#endif // IS_ENABLED(CONFIG_HWINFO) - -zmk_studio_Response get_device_info(const zmk_studio_Request *req) { - LOG_DBG(""); - zmk_core_GetDeviceInfoResponse resp = zmk_core_GetDeviceInfoResponse_init_zero; - - resp.name.funcs.encode = encode_device_info_name; -#if IS_ENABLED(CONFIG_HWINFO) - resp.serial_number.funcs.encode = encode_device_info_serial_number; -#endif // IS_ENABLED(CONFIG_HWINFO) - - return CORE_RESPONSE(get_device_info, resp); -} - -zmk_studio_Response get_lock_state(const zmk_studio_Request *req) { - LOG_DBG(""); - zmk_core_LockState resp = zmk_studio_core_get_lock_state(); - - return CORE_RESPONSE(get_lock_state, resp); -} - -zmk_studio_Response reset_settings(const zmk_studio_Request *req) { - LOG_DBG(""); - ZMK_RPC_SUBSYSTEM_SETTINGS_RESET_FOREACH(sub) { - int ret = sub->callback(); - if (ret < 0) { - LOG_ERR("Failed to reset settings: %d", ret); - return CORE_RESPONSE(reset_settings, false); - } - } - - return CORE_RESPONSE(reset_settings, true); -} - -ZMK_RPC_SUBSYSTEM_HANDLER(core, get_device_info, ZMK_STUDIO_RPC_HANDLER_UNSECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(core, get_lock_state, ZMK_STUDIO_RPC_HANDLER_UNSECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(core, reset_settings, ZMK_STUDIO_RPC_HANDLER_SECURED); - -static int core_event_mapper(const zmk_event_t *eh, zmk_studio_Notification *n) { - struct zmk_studio_core_lock_state_changed *lock_ev = as_zmk_studio_core_lock_state_changed(eh); - - if (!lock_ev) { - return -ENOTSUP; - } - - LOG_DBG("Mapped a lock state event properly"); - - *n = ZMK_RPC_NOTIFICATION(core, lock_state_changed, lock_ev->state); - return 0; -} - -ZMK_RPC_EVENT_MAPPER(core, core_event_mapper, zmk_studio_core_lock_state_changed); diff --git a/app/src/studio/gatt_rpc_transport.c b/app/src/studio/gatt_rpc_transport.c deleted file mode 100644 index dff18259..00000000 --- a/app/src/studio/gatt_rpc_transport.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "uuid.h" - -#include - -LOG_MODULE_DECLARE(zmk_studio, CONFIG_ZMK_STUDIO_LOG_LEVEL); - -static bool handling_rx = false; - -static K_SEM_DEFINE(indicate_sem, 1, 1); -static atomic_t notify_size; - -static void rpc_ccc_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value) { - ARG_UNUSED(attr); - - bool notif_enabled = (value == BT_GATT_CCC_INDICATE); - - LOG_INF("RPC Notifications %s", notif_enabled ? "enabled" : "disabled"); - -#if CONFIG_ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY < CONFIG_BT_PERIPHERAL_PREF_LATENCY - struct bt_conn *conn = zmk_ble_active_profile_conn(); - if (conn) { - uint8_t latency = notif_enabled ? CONFIG_ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY - : CONFIG_BT_PERIPHERAL_PREF_LATENCY; - - int ret = bt_conn_le_param_update( - conn, - BT_LE_CONN_PARAM(CONFIG_BT_PERIPHERAL_PREF_MIN_INT, CONFIG_BT_PERIPHERAL_PREF_MAX_INT, - latency, CONFIG_BT_PERIPHERAL_PREF_TIMEOUT)); - if (ret < 0) { - LOG_WRN("Failed to request lower latency while studio is active (%d)", ret); - } - - bt_conn_unref(conn); - } -#endif -} - -static ssize_t read_rpc_resp(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, - uint16_t len, uint16_t offset) { - - LOG_DBG("Read response for length %d at offset %d", len, offset); - return 0; -} - -static ssize_t write_rpc_req(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *buf, - uint16_t len, uint16_t offset, uint8_t flags) { - if (!handling_rx) { - return len; - } - - uint32_t copied = 0; - struct ring_buf *rpc_buf = zmk_rpc_get_rx_buf(); - while (copied < len) { - uint8_t *buffer; - uint32_t claim_len = ring_buf_put_claim(rpc_buf, &buffer, len - copied); - - if (claim_len > 0) { - memcpy(buffer, ((uint8_t *)buf) + copied, claim_len); - copied += claim_len; - } - - ring_buf_put_finish(rpc_buf, claim_len); - } - - zmk_rpc_rx_notify(); - - return len; -} - -BT_GATT_SERVICE_DEFINE( - rpc_interface, BT_GATT_PRIMARY_SERVICE(BT_UUID_DECLARE_128(ZMK_STUDIO_BT_SERVICE_UUID)), - BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_STUDIO_BT_RPC_CHRC_UUID), - BT_GATT_CHRC_WRITE | BT_GATT_CHRC_READ | BT_GATT_CHRC_INDICATE, - BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT, read_rpc_resp, - write_rpc_req, NULL), - BT_GATT_CCC(rpc_ccc_cfg_changed, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT)); - -static uint16_t get_notify_size_for_conn(struct bt_conn *conn) { - uint16_t notify_size = 23; // Default MTU size unless negotiated higher - struct bt_conn_info conn_info; - if (conn && bt_conn_get_info(conn, &conn_info) >= 0) { - notify_size = conn_info.le.data_len->tx_max_len; - } - - return notify_size; -} - -static void refresh_notify_size(void) { - struct bt_conn *conn = zmk_ble_active_profile_conn(); - - uint16_t ns = get_notify_size_for_conn(conn); - if (conn) { - bt_conn_unref(conn); - } - - atomic_set(¬ify_size, ns); -} - -static int gatt_start_rx() { - refresh_notify_size(); - handling_rx = true; - return 0; -} - -static int gatt_stop_rx(void) { - handling_rx = false; - return 0; -} - -static uint8_t indicate_buffer[27]; - -static void indicate_cb(struct bt_conn *conn, struct bt_gatt_indicate_params *params, uint8_t err); - -static struct bt_gatt_indicate_params rpc_indicate_params = { - .attr = &rpc_interface.attrs[1], - .data = indicate_buffer, - .func = indicate_cb, -}; - -static void notif_rpc_tx_cb(struct k_work *work) { - struct bt_conn *conn = zmk_ble_active_profile_conn(); - struct ring_buf *tx_buf = zmk_rpc_get_tx_buf(); - - if (!conn) { - LOG_WRN("No active connection for queued data, dropping"); - ring_buf_reset(tx_buf); - return; - } - - uint16_t notify_size = MIN(get_notify_size_for_conn(conn), sizeof(indicate_buffer)); - - if (ring_buf_size_get(tx_buf) > 0) { - int ret = k_sem_take(&indicate_sem, K_NO_WAIT); - if (ret < 0) { - return; - } - - uint16_t added = 0; - while (added < notify_size && ring_buf_size_get(tx_buf) > 0) { - uint8_t *buf; - int len = ring_buf_get_claim(tx_buf, &buf, notify_size - added); - - memcpy(indicate_buffer + added, buf, len); - - added += len; - ring_buf_get_finish(tx_buf, len); - } - - rpc_indicate_params.len = added; - - int err = bt_gatt_indicate(conn, &rpc_indicate_params); - if (err < 0) { - LOG_WRN("Failed to notify the response %d", err); - k_sem_give(&indicate_sem); - } - } - - bt_conn_unref(conn); -} - -static K_WORK_DEFINE(notify_tx_work, notif_rpc_tx_cb); - -struct gatt_write_state { - size_t pending_notify; -}; - -static void indicate_cb(struct bt_conn *conn, struct bt_gatt_indicate_params *params, uint8_t err) { - k_sem_give(&indicate_sem); - k_work_submit(¬ify_tx_work); -} - -static void gatt_tx_notify(struct ring_buf *tx_buf, size_t added, bool msg_done, void *user_data) { - struct gatt_write_state *state = (struct gatt_write_state *)user_data; - - state->pending_notify += added; - - atomic_t ns = atomic_get(¬ify_size); - - if (msg_done || state->pending_notify > ns) { - k_work_submit(¬ify_tx_work); - state->pending_notify = 0; - } -} - -static struct gatt_write_state tx_state = {}; - -static void *gatt_tx_user_data(void) { - memset(&tx_state, 0, sizeof(tx_state)); - - return &tx_state; -} - -ZMK_RPC_TRANSPORT(gatt, ZMK_TRANSPORT_BLE, gatt_start_rx, gatt_stop_rx, gatt_tx_user_data, - gatt_tx_notify); - -static int gatt_rpc_listener(const zmk_event_t *eh) { - refresh_notify_size(); - -#if IS_ENABLED(CONFIG_ZMK_STUDIO_LOCK_ON_DISCONNECT) - struct bt_conn *conn = zmk_ble_active_profile_conn(); - - if (!conn) { - zmk_studio_core_lock(); - } else { - bt_conn_unref(conn); - } -#endif - - return 0; -} - -ZMK_LISTENER(gatt_rpc_listener, gatt_rpc_listener); -ZMK_SUBSCRIPTION(gatt_rpc_listener, zmk_ble_active_profile_changed); diff --git a/app/src/studio/keymap_subsystem.c b/app/src/studio/keymap_subsystem.c deleted file mode 100644 index 1d51975c..00000000 --- a/app/src/studio/keymap_subsystem.c +++ /dev/null @@ -1,542 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include - -LOG_MODULE_DECLARE(zmk_studio, CONFIG_ZMK_STUDIO_LOG_LEVEL); - -#include - -#include -#include -#include -#include -#include - -#include - -ZMK_RPC_SUBSYSTEM(keymap) - -#define KEYMAP_RESPONSE(type, ...) ZMK_RPC_RESPONSE(keymap, type, __VA_ARGS__) -#define KEYMAP_NOTIFICATION(type, ...) ZMK_RPC_NOTIFICATION(keymap, type, __VA_ARGS__) - -static bool encode_layer_bindings(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - const zmk_keymap_layer_id_t layer_id = *(uint8_t *)*arg; - - for (int b = 0; b < ZMK_KEYMAP_LEN; b++) { - const struct zmk_behavior_binding *binding = - zmk_keymap_get_layer_binding_at_idx(layer_id, b); - - zmk_keymap_BehaviorBinding bb = zmk_keymap_BehaviorBinding_init_zero; - - if (binding && binding->behavior_dev) { - bb.behavior_id = zmk_behavior_get_local_id(binding->behavior_dev); - bb.param1 = binding->param1; - bb.param2 = binding->param2; - } - - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - if (!pb_encode_submessage(stream, &zmk_keymap_BehaviorBinding_msg, &bb)) { - return false; - } - } - - return true; -} - -static bool encode_layer_name(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - const zmk_keymap_layer_index_t layer_idx = *(uint8_t *)*arg; - - const char *name = zmk_keymap_layer_name(layer_idx); - - if (!name) { - return true; - } - - if (!pb_encode_tag_for_field(stream, field)) { - return false; - } - - return pb_encode_string(stream, name, strlen(name)); -} - -static bool encode_keymap_layers(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - for (zmk_keymap_layer_index_t l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) { - zmk_keymap_layer_id_t layer_id = zmk_keymap_layer_index_to_id(l); - - if (layer_id == UINT8_MAX) { - break; - } - - if (!pb_encode_tag_for_field(stream, field)) { - LOG_WRN("Failed to encode tag"); - return false; - } - - zmk_keymap_Layer layer = zmk_keymap_Layer_init_zero; - layer.id = layer_id; - - layer.name.funcs.encode = encode_layer_name; - layer.name.arg = &layer_id; - - layer.bindings.funcs.encode = encode_layer_bindings; - layer.bindings.arg = &layer_id; - - if (!pb_encode_submessage(stream, &zmk_keymap_Layer_msg, &layer)) { - LOG_WRN("Failed to encode layer submessage"); - return false; - } - } - - return true; -} - -static void populate_keymap_extra_props(zmk_keymap_Keymap *keymap) { - keymap->max_layer_name_length = CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN; - - keymap->available_layers = 0; - - for (zmk_keymap_layer_index_t index = 0; index < ZMK_KEYMAP_LAYERS_LEN; index++) { - zmk_keymap_layer_id_t id = zmk_keymap_layer_index_to_id(index); - - if (id == UINT8_MAX) { - keymap->available_layers = ZMK_KEYMAP_LAYERS_LEN - index; - break; - } - } -} - -zmk_studio_Response get_keymap(const zmk_studio_Request *req) { - LOG_DBG(""); - zmk_keymap_Keymap resp = zmk_keymap_Keymap_init_zero; - - resp.layers.funcs.encode = encode_keymap_layers; - - populate_keymap_extra_props(&resp); - - return KEYMAP_RESPONSE(get_keymap, resp); -} - -zmk_studio_Response set_layer_binding(const zmk_studio_Request *req) { - LOG_DBG(""); - const zmk_keymap_SetLayerBindingRequest *set_req = - &req->subsystem.keymap.request_type.set_layer_binding; - - zmk_behavior_local_id_t bid = set_req->binding.behavior_id; - - const char *behavior_name = zmk_behavior_find_behavior_name_from_local_id(bid); - - if (!behavior_name) { - return KEYMAP_RESPONSE( - set_layer_binding, - zmk_keymap_SetLayerBindingResponse_SET_LAYER_BINDING_RESP_INVALID_BEHAVIOR); - } - - struct zmk_behavior_binding binding = (struct zmk_behavior_binding){ - .behavior_dev = behavior_name, - .param1 = set_req->binding.param1, - .param2 = set_req->binding.param2, - }; - - int ret = zmk_behavior_validate_binding(&binding); - if (ret < 0) { - return KEYMAP_RESPONSE( - set_layer_binding, - zmk_keymap_SetLayerBindingResponse_SET_LAYER_BINDING_RESP_INVALID_PARAMETERS); - } - - ret = zmk_keymap_set_layer_binding_at_idx(set_req->layer_id, set_req->key_position, binding); - - if (ret < 0) { - LOG_WRN("Setting the binding failed with %d", ret); - switch (ret) { - case -EINVAL: - return KEYMAP_RESPONSE( - set_layer_binding, - zmk_keymap_SetLayerBindingResponse_SET_LAYER_BINDING_RESP_INVALID_LOCATION); - default: - return ZMK_RPC_SIMPLE_ERR(GENERIC); - } - } - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - - return KEYMAP_RESPONSE(set_layer_binding, - zmk_keymap_SetLayerBindingResponse_SET_LAYER_BINDING_RESP_OK); -} - -zmk_studio_Response check_unsaved_changes(const zmk_studio_Request *req) { - LOG_DBG(""); - int layout_changes = zmk_physical_layouts_check_unsaved_selection(); - int keymap_changes = zmk_keymap_check_unsaved_changes(); - - return KEYMAP_RESPONSE(check_unsaved_changes, layout_changes > 0 || keymap_changes > 0); -} - -static void map_errno_to_save_resp(int err, zmk_keymap_SaveChangesResponse *resp) { - resp->which_result = zmk_keymap_SaveChangesResponse_err_tag; - - switch (err) { - case -ENOTSUP: - resp->result.err = zmk_keymap_SaveChangesErrorCode_SAVE_CHANGES_ERR_NOT_SUPPORTED; - break; - case -ENOSPC: - resp->result.err = zmk_keymap_SaveChangesErrorCode_SAVE_CHANGES_ERR_NO_SPACE; - break; - default: - resp->result.err = zmk_keymap_SaveChangesErrorCode_SAVE_CHANGES_ERR_GENERIC; - break; - } -} - -zmk_studio_Response save_changes(const zmk_studio_Request *req) { - zmk_keymap_SaveChangesResponse resp = zmk_keymap_SaveChangesResponse_init_zero; - resp.which_result = zmk_keymap_SaveChangesResponse_ok_tag; - resp.result.ok = true; - - LOG_DBG(""); - int ret = zmk_physical_layouts_save_selected(); - - if (ret < 0) { - LOG_WRN("Failed to save selected physical layout (%d)", ret); - map_errno_to_save_resp(ret, &resp); - return KEYMAP_RESPONSE(save_changes, resp); - } - - ret = zmk_keymap_save_changes(); - if (ret < 0) { - LOG_WRN("Failed to save keymap changes (%d)", ret); - map_errno_to_save_resp(ret, &resp); - return KEYMAP_RESPONSE(save_changes, resp); - } - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, false)}); - - return KEYMAP_RESPONSE(save_changes, resp); -} - -zmk_studio_Response discard_changes(const zmk_studio_Request *req) { - LOG_DBG(""); - int ret = zmk_physical_layouts_revert_selected(); - if (ret < 0) { - return ZMK_RPC_SIMPLE_ERR(GENERIC); - } - - ret = zmk_keymap_discard_changes(); - if (ret < 0) { - return ZMK_RPC_SIMPLE_ERR(GENERIC); - } - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, false)}); - - return KEYMAP_RESPONSE(discard_changes, true); -} - -static int keymap_settings_reset(void) { return zmk_keymap_reset_settings(); } - -ZMK_RPC_SUBSYSTEM_SETTINGS_RESET(keymap, keymap_settings_reset); - -static bool encode_layout_name(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - struct zmk_physical_layout *layout = (struct zmk_physical_layout *)*arg; - - if (!layout->display_name) { - return true; - } - - if (!pb_encode_tag_for_field(stream, field)) { - LOG_WRN("Failed to encode tag"); - return false; - } - - pb_encode_string(stream, layout->display_name, strlen(layout->display_name)); - - return true; -} - -static bool encode_layout_keys(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - struct zmk_physical_layout *layout = (struct zmk_physical_layout *)*arg; - - for (int kp = 0; kp < layout->keys_len; kp++) { - const struct zmk_key_physical_attrs *layout_kp = &layout->keys[kp]; - - if (!pb_encode_tag_for_field(stream, field)) { - LOG_WRN("Failed to encode tag"); - return false; - } - - zmk_keymap_KeyPhysicalAttrs layout_kp_msg = { - .width = layout_kp->width, - .height = layout_kp->height, - .x = layout_kp->x, - .y = layout_kp->y, -#if IS_ENABLED(CONFIG_ZMK_PHYSICAL_LAYOUT_KEY_ROTATION) - .r = layout_kp->r, - .rx = layout_kp->rx, - .ry = layout_kp->ry, -#endif - }; - - if (!pb_encode_submessage(stream, &zmk_keymap_KeyPhysicalAttrs_msg, &layout_kp_msg)) { - LOG_WRN("Failed to encode layout key position submessage"); - return false; - } - } - return true; -} - -static bool encode_layouts(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) { - struct zmk_physical_layout const *const *layouts; - const size_t layout_count = zmk_physical_layouts_get_list(&layouts); - - for (int i = 0; i < layout_count; i++) { - const struct zmk_physical_layout *l = layouts[i]; - - if (!pb_encode_tag_for_field(stream, field)) { - LOG_WRN("Failed to encode tag"); - return false; - } - - zmk_keymap_PhysicalLayout layout = zmk_keymap_PhysicalLayout_init_zero; - - layout.name.funcs.encode = encode_layout_name; - layout.name.arg = (void *)l; - - layout.keys.funcs.encode = encode_layout_keys; - layout.keys.arg = (void *)l; - - if (!pb_encode_submessage(stream, &zmk_keymap_PhysicalLayout_msg, &layout)) { - LOG_WRN("Failed to encode layout submessage"); - return false; - } - } - - return true; -} - -zmk_studio_Response get_physical_layouts(const zmk_studio_Request *req) { - LOG_DBG(""); - zmk_keymap_PhysicalLayouts resp = zmk_keymap_PhysicalLayouts_init_zero; - resp.active_layout_index = zmk_physical_layouts_get_selected(); - resp.layouts.funcs.encode = encode_layouts; - return KEYMAP_RESPONSE(get_physical_layouts, resp); -} - -zmk_studio_Response set_active_physical_layout(const zmk_studio_Request *req) { - LOG_DBG(""); - uint8_t index = (uint8_t)req->subsystem.keymap.request_type.set_active_physical_layout; - int old = zmk_physical_layouts_get_selected(); - - zmk_keymap_SetActivePhysicalLayoutResponse resp = - zmk_keymap_SetActivePhysicalLayoutResponse_init_zero; - resp.which_result = zmk_keymap_SetActivePhysicalLayoutResponse_ok_tag; - resp.result.ok.layers.funcs.encode = encode_keymap_layers; - populate_keymap_extra_props(&resp.result.ok); - - if (old == index) { - return KEYMAP_RESPONSE(set_active_physical_layout, resp); - } - - int ret = zmk_physical_layouts_select(index); - if (ret < 0) { - resp.which_result = zmk_keymap_SetActivePhysicalLayoutResponse_err_tag; - resp.result.err = - zmk_keymap_SetActivePhysicalLayoutErrorCode_SET_ACTIVE_PHYSICAL_LAYOUT_ERR_GENERIC; - } - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - - return KEYMAP_RESPONSE(set_active_physical_layout, resp); -} - -zmk_studio_Response move_layer(const zmk_studio_Request *req) { - LOG_DBG(""); - const zmk_keymap_MoveLayerRequest *move_req = &req->subsystem.keymap.request_type.move_layer; - - zmk_keymap_MoveLayerResponse resp = zmk_keymap_MoveLayerResponse_init_zero; - - int ret = zmk_keymap_move_layer(move_req->start_index, move_req->dest_index); - - if (ret >= 0) { - resp.which_result = zmk_keymap_SetActivePhysicalLayoutResponse_ok_tag; - resp.result.ok.layers.funcs.encode = encode_keymap_layers; - populate_keymap_extra_props(&resp.result.ok); - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - } else { - LOG_WRN("Failed to move layer: %d", ret); - resp.which_result = zmk_keymap_MoveLayerResponse_err_tag; - resp.result.err = zmk_keymap_MoveLayerErrorCode_MOVE_LAYER_ERR_GENERIC; - } - - return KEYMAP_RESPONSE(move_layer, resp); -} - -zmk_studio_Response add_layer(const zmk_studio_Request *req) { - LOG_DBG(""); - // Use a static here to keep the value valid during serialization - static zmk_keymap_layer_id_t layer_id = 0; - - zmk_keymap_AddLayerResponse resp = zmk_keymap_AddLayerResponse_init_zero; - - int ret = zmk_keymap_add_layer(); - - if (ret >= 0) { - layer_id = zmk_keymap_layer_index_to_id(ret); - - resp.which_result = zmk_keymap_AddLayerResponse_ok_tag; - - resp.result.ok.index = ret; - - resp.result.ok.has_layer = true; - resp.result.ok.layer.id = layer_id; - - resp.result.ok.layer.name.funcs.encode = encode_layer_name; - resp.result.ok.layer.name.arg = &layer_id; - - resp.result.ok.layer.bindings.funcs.encode = encode_layer_bindings; - resp.result.ok.layer.bindings.arg = &layer_id; - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - } else { - LOG_WRN("Failed to add layer: %d", ret); - resp.which_result = zmk_keymap_AddLayerResponse_err_tag; - switch (ret) { - case -ENOSPC: - resp.result.err = zmk_keymap_AddLayerErrorCode_ADD_LAYER_ERR_NO_SPACE; - break; - default: - resp.result.err = zmk_keymap_AddLayerErrorCode_ADD_LAYER_ERR_GENERIC; - break; - } - } - - return KEYMAP_RESPONSE(add_layer, resp); -} - -zmk_studio_Response remove_layer(const zmk_studio_Request *req) { - LOG_DBG(""); - const zmk_keymap_RemoveLayerRequest *rm_req = &req->subsystem.keymap.request_type.remove_layer; - - zmk_keymap_RemoveLayerResponse resp = zmk_keymap_RemoveLayerResponse_init_zero; - - int ret = zmk_keymap_remove_layer(rm_req->layer_index); - - if (ret >= 0) { - resp.which_result = zmk_keymap_RemoveLayerResponse_ok_tag; - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - } else { - LOG_WRN("Failed to rm layer: %d", ret); - resp.which_result = zmk_keymap_RemoveLayerResponse_err_tag; - switch (ret) { - case -EINVAL: - resp.result.err = zmk_keymap_RemoveLayerErrorCode_REMOVE_LAYER_ERR_INVALID_INDEX; - break; - default: - resp.result.err = zmk_keymap_RemoveLayerErrorCode_REMOVE_LAYER_ERR_GENERIC; - break; - } - } - - return KEYMAP_RESPONSE(remove_layer, resp); -} - -zmk_studio_Response restore_layer(const zmk_studio_Request *req) { - LOG_DBG(""); - const zmk_keymap_RestoreLayerRequest *restore_req = - &req->subsystem.keymap.request_type.restore_layer; - - zmk_keymap_RestoreLayerResponse resp = zmk_keymap_RestoreLayerResponse_init_zero; - - int ret = zmk_keymap_restore_layer(restore_req->layer_id, restore_req->at_index); - - if (ret >= 0) { - resp.which_result = zmk_keymap_RemoveLayerResponse_ok_tag; - resp.result.ok.id = restore_req->layer_id; - - resp.result.ok.name.funcs.encode = encode_layer_name; - resp.result.ok.name.arg = (void *)&restore_req->layer_id; - - resp.result.ok.bindings.funcs.encode = encode_layer_bindings; - resp.result.ok.bindings.arg = (void *)&restore_req->layer_id; - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - } else { - LOG_WRN("Failed to restore layer: %d", ret); - resp.which_result = zmk_keymap_RestoreLayerResponse_err_tag; - switch (ret) { - case -EINVAL: - resp.result.err = zmk_keymap_RestoreLayerErrorCode_RESTORE_LAYER_ERR_INVALID_INDEX; - break; - default: - resp.result.err = zmk_keymap_RestoreLayerErrorCode_RESTORE_LAYER_ERR_GENERIC; - break; - } - } - - return KEYMAP_RESPONSE(restore_layer, resp); -} - -zmk_studio_Response set_layer_props(const zmk_studio_Request *req) { - LOG_DBG(""); - const zmk_keymap_SetLayerPropsRequest *set_req = - &req->subsystem.keymap.request_type.set_layer_props; - - zmk_keymap_SetLayerPropsResponse resp = - zmk_keymap_SetLayerPropsResponse_SET_LAYER_PROPS_RESP_OK; - - if (strlen(set_req->name) <= 0) { - return KEYMAP_RESPONSE(set_layer_props, resp); - } - - int ret = zmk_keymap_set_layer_name(set_req->layer_id, set_req->name, strlen(set_req->name)); - - if (ret >= 0) { - - raise_zmk_studio_rpc_notification((struct zmk_studio_rpc_notification){ - .notification = KEYMAP_NOTIFICATION(unsaved_changes_status_changed, true)}); - } else { - LOG_WRN("Failed to set layer props: %d", ret); - switch (ret) { - case -EINVAL: - resp = zmk_keymap_SetLayerPropsResponse_SET_LAYER_PROPS_RESP_ERR_INVALID_ID; - break; - default: - resp = zmk_keymap_SetLayerPropsResponse_SET_LAYER_PROPS_RESP_ERR_GENERIC; - break; - } - } - - return KEYMAP_RESPONSE(set_layer_props, resp); -} - -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, get_keymap, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, set_layer_binding, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, check_unsaved_changes, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, save_changes, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, discard_changes, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, get_physical_layouts, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, set_active_physical_layout, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, move_layer, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, add_layer, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, remove_layer, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, restore_layer, ZMK_STUDIO_RPC_HANDLER_SECURED); -ZMK_RPC_SUBSYSTEM_HANDLER(keymap, set_layer_props, ZMK_STUDIO_RPC_HANDLER_SECURED); - -static int event_mapper(const zmk_event_t *eh, zmk_studio_Notification *n) { return 0; } - -ZMK_RPC_EVENT_MAPPER(keymap, event_mapper); diff --git a/app/src/studio/msg_framing.c b/app/src/studio/msg_framing.c deleted file mode 100644 index a14289ee..00000000 --- a/app/src/studio/msg_framing.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include "msg_framing.h" - -static bool process_byte_err_state(enum studio_framing_state *rpc_framing_state, uint8_t c) { - switch (c) { - case FRAMING_EOF: - *rpc_framing_state = FRAMING_STATE_IDLE; - return false; - case FRAMING_SOF: - *rpc_framing_state = FRAMING_STATE_AWAITING_DATA; - return false; - default: - LOG_WRN("Discarding unexpected data 0x%02x", c); - return false; - } - - return false; -} - -static bool process_byte_idle_state(enum studio_framing_state *rpc_framing_state, uint8_t c) { - switch (c) { - case FRAMING_SOF: - *rpc_framing_state = FRAMING_STATE_AWAITING_DATA; - return false; - default: - LOG_WRN("Expected SOF, got 0x%02x", c); - return false; - } - return false; -} - -static bool process_byte_awaiting_data_state(enum studio_framing_state *rpc_framing_state, - uint8_t c) { - switch (c) { - case FRAMING_SOF: - LOG_WRN("Unescaped SOF mid-data"); - *rpc_framing_state = FRAMING_STATE_ERR; - return false; - case FRAMING_ESC: - *rpc_framing_state = FRAMING_STATE_ESCAPED; - return false; - case FRAMING_EOF: - *rpc_framing_state = FRAMING_STATE_EOF; - return false; - default: - return true; - } - - return false; -} - -static bool process_byte_escaped_state(enum studio_framing_state *rpc_framing_state, uint8_t c) { - *rpc_framing_state = FRAMING_STATE_AWAITING_DATA; - return true; -} - -bool studio_framing_process_byte(enum studio_framing_state *rpc_framing_state, uint8_t c) { - switch (*rpc_framing_state) { - case FRAMING_STATE_ERR: - return process_byte_err_state(rpc_framing_state, c); - case FRAMING_STATE_IDLE: - case FRAMING_STATE_EOF: - return process_byte_idle_state(rpc_framing_state, c); - case FRAMING_STATE_AWAITING_DATA: - return process_byte_awaiting_data_state(rpc_framing_state, c); - case FRAMING_STATE_ESCAPED: - return process_byte_escaped_state(rpc_framing_state, c); - default: - LOG_ERR("Unsupported framing state: %d", *rpc_framing_state); - return false; - } -} \ No newline at end of file diff --git a/app/src/studio/msg_framing.h b/app/src/studio/msg_framing.h deleted file mode 100644 index cbe4abdf..00000000 --- a/app/src/studio/msg_framing.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -enum studio_framing_state { - FRAMING_STATE_IDLE, - FRAMING_STATE_AWAITING_DATA, - FRAMING_STATE_ESCAPED, - FRAMING_STATE_ERR, - FRAMING_STATE_EOF, -}; - -#define FRAMING_SOF 0xAB -#define FRAMING_ESC 0xAC -#define FRAMING_EOF 0xAD - -/** - * @brief Process an incoming byte from a frame. Will possibly update the framing state depending on - * what data is received. - * @retval true if data is a non-framing byte, and is real data to be handled by the upper level - * logic. - * @retval false if data is a framing byte, and should be ignored. Also indicates the framing state - * has been updated. - */ -bool studio_framing_process_byte(enum studio_framing_state *frame_state, uint8_t data); diff --git a/app/src/studio/rpc.c b/app/src/studio/rpc.c deleted file mode 100644 index e79b5568..00000000 --- a/app/src/studio/rpc.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include "msg_framing.h" - -#include -#include - -#include -#include -#include -#include - -LOG_MODULE_REGISTER(zmk_studio, CONFIG_ZMK_STUDIO_LOG_LEVEL); - -#include -#include -#include -#include -#include - -ZMK_EVENT_IMPL(zmk_studio_rpc_notification); - -static struct zmk_rpc_subsystem *find_subsystem_for_choice(uint8_t choice) { - STRUCT_SECTION_FOREACH(zmk_rpc_subsystem, sub) { - if (sub->subsystem_choice == choice) { - return sub; - } - } - - return NULL; -} - -zmk_studio_Response zmk_rpc_subsystem_delegate_to_subs(const struct zmk_rpc_subsystem *subsys, - const zmk_studio_Request *req, - uint8_t which_req) { - LOG_DBG("Got subsystem func for %d", subsys->subsystem_choice); - - for (int i = subsys->handlers_start_index; i <= subsys->handlers_end_index; i++) { - struct zmk_rpc_subsystem_handler *sub_handler; - STRUCT_SECTION_GET(zmk_rpc_subsystem_handler, i, &sub_handler); - if (sub_handler->request_choice == which_req) { - if (sub_handler->security == ZMK_STUDIO_RPC_HANDLER_SECURED && - zmk_studio_core_get_lock_state() != ZMK_STUDIO_CORE_LOCK_STATE_UNLOCKED) { - return ZMK_RPC_RESPONSE(meta, simple_error, - zmk_meta_ErrorConditions_UNLOCK_REQUIRED); - } - return sub_handler->func(req); - } - } - LOG_ERR("No handler func found for %d", which_req); - return ZMK_RPC_RESPONSE(meta, simple_error, zmk_meta_ErrorConditions_RPC_NOT_FOUND); -} - -static zmk_studio_Response handle_request(const zmk_studio_Request *req) { - zmk_studio_core_reschedule_lock_timeout(); - struct zmk_rpc_subsystem *sub = find_subsystem_for_choice(req->which_subsystem); - if (!sub) { - LOG_WRN("No subsystem found for choice %d", req->which_subsystem); - return ZMK_RPC_RESPONSE(meta, simple_error, zmk_meta_ErrorConditions_RPC_NOT_FOUND); - } - - zmk_studio_Response resp = sub->func(sub, req); - resp.type.request_response.request_id = req->request_id; - - return resp; -} - -RING_BUF_DECLARE(rpc_rx_buf, CONFIG_ZMK_STUDIO_RPC_RX_BUF_SIZE); - -static K_SEM_DEFINE(rpc_rx_sem, 0, 1); - -static enum studio_framing_state rpc_framing_state; - -static K_MUTEX_DEFINE(rpc_transport_mutex); -static struct zmk_rpc_transport *selected_transport; - -struct ring_buf *zmk_rpc_get_rx_buf(void) { return &rpc_rx_buf; } - -void zmk_rpc_rx_notify(void) { k_sem_give(&rpc_rx_sem); } - -static bool rpc_read_cb(pb_istream_t *stream, uint8_t *buf, size_t count) { - uint32_t write_offset = 0; - - do { - uint8_t *buffer; - uint32_t len = ring_buf_get_claim(&rpc_rx_buf, &buffer, count - write_offset); - - if (len > 0) { - for (int i = 0; i < len; i++) { - if (studio_framing_process_byte(&rpc_framing_state, buffer[i])) { - buf[write_offset++] = buffer[i]; - } - } - } else { - k_sem_take(&rpc_rx_sem, K_FOREVER); - } - - ring_buf_get_finish(&rpc_rx_buf, len); - } while (write_offset < count && rpc_framing_state != FRAMING_STATE_EOF); - - if (rpc_framing_state == FRAMING_STATE_EOF) { - stream->bytes_left = 0; - return false; - } else { - return true; - } -} - -static pb_istream_t pb_istream_for_rx_ring_buf() { - pb_istream_t stream = {&rpc_read_cb, NULL, SIZE_MAX}; - return stream; -} - -RING_BUF_DECLARE(rpc_tx_buf, CONFIG_ZMK_STUDIO_RPC_TX_BUF_SIZE); - -struct ring_buf *zmk_rpc_get_tx_buf(void) { return &rpc_tx_buf; } - -static bool rpc_tx_buffer_write(pb_ostream_t *stream, const uint8_t *buf, size_t count) { - void *user_data = stream->state; - size_t written = 0; - - bool escape_byte_already_written = false; - do { - uint32_t write_idx = 0; - - uint8_t *write_buf; - uint32_t claim_len = ring_buf_put_claim(&rpc_tx_buf, &write_buf, count - written); - - if (claim_len == 0) { - continue; - } - - int escapes_written = 0; - for (int i = 0; i < claim_len && write_idx < claim_len; i++) { - uint8_t b = buf[written + i]; - switch (b) { - case FRAMING_EOF: - case FRAMING_ESC: - case FRAMING_SOF: - // Care to be taken. We may need to write the escape byte, - // but that's the last available spot for this claim, so we track - // if the escape has already been written in the previous iteration - // of our loop. - if (!escape_byte_already_written) { - escapes_written++; - write_buf[write_idx++] = FRAMING_ESC; - escape_byte_already_written = true; - if (write_idx >= claim_len) { - LOG_WRN("Skipping on, no room to write escape and real byte"); - continue; - } - } - default: - write_buf[write_idx++] = b; - escape_byte_already_written = false; - break; - } - } - - ring_buf_put_finish(&rpc_tx_buf, write_idx); - - written += (write_idx - escapes_written); - - selected_transport->tx_notify(&rpc_tx_buf, write_idx, false, user_data); - } while (written < count); - - return true; -} - -static pb_ostream_t pb_ostream_for_tx_buf(void *user_data) { - pb_ostream_t stream = {&rpc_tx_buffer_write, (void *)user_data, SIZE_MAX, 0}; - return stream; -} - -static int send_response(const zmk_studio_Response *resp) { - k_mutex_lock(&rpc_transport_mutex, K_FOREVER); - - if (!selected_transport) { - goto exit; - } - - void *user_data = selected_transport->tx_user_data ? selected_transport->tx_user_data() : NULL; - - pb_ostream_t stream = pb_ostream_for_tx_buf(user_data); - - uint8_t framing_byte = FRAMING_SOF; - ring_buf_put(&rpc_tx_buf, &framing_byte, 1); - - selected_transport->tx_notify(&rpc_tx_buf, 1, false, user_data); - - /* Now we are ready to encode the message! */ - bool status = pb_encode(&stream, &zmk_studio_Response_msg, resp); - - if (!status) { -#if !IS_ENABLED(CONFIG_NANOPB_NO_ERRMSG) - LOG_ERR("Failed to encode the message %s", stream.errmsg); -#endif // !IS_ENABLED(CONFIG_NANOPB_NO_ERRMSG) - return -EINVAL; - } - - framing_byte = FRAMING_EOF; - ring_buf_put(&rpc_tx_buf, &framing_byte, 1); - - selected_transport->tx_notify(&rpc_tx_buf, 1, true, user_data); - -exit: - k_mutex_unlock(&rpc_transport_mutex); - return 0; -} - -static void rpc_main(void) { - for (;;) { - pb_istream_t stream = pb_istream_for_rx_ring_buf(); - zmk_studio_Request req = zmk_studio_Request_init_zero; -#if IS_ENABLED(CONFIG_THREAD_ANALYZER) - thread_analyzer_print(0); -#endif // IS_ENABLED(CONFIG_THREAD_ANALYZER) - bool status = pb_decode(&stream, &zmk_studio_Request_msg, &req); - - rpc_framing_state = FRAMING_STATE_IDLE; - - if (status) { - zmk_studio_Response resp = handle_request(&req); - - int err = send_response(&resp); -#if IS_ENABLED(CONFIG_THREAD_ANALYZER) - thread_analyzer_print(0); -#endif // IS_ENABLED(CONFIG_THREAD_ANALYZER) - if (err < 0) { - LOG_ERR("Failed to send the RPC response %d", err); - } - } else { - LOG_DBG("Decode failed"); - } - } -} - -K_THREAD_DEFINE(studio_rpc_thread, CONFIG_ZMK_STUDIO_RPC_THREAD_STACK_SIZE, rpc_main, NULL, NULL, - NULL, K_LOWEST_APPLICATION_THREAD_PRIO, 0, 0); - -static void refresh_selected_transport(void) { - enum zmk_transport transport = zmk_endpoint_get_selected().transport; - - k_mutex_lock(&rpc_transport_mutex, K_FOREVER); - - if (selected_transport && selected_transport->transport == transport) { - goto exit_refresh; - } - - if (selected_transport) { - if (selected_transport->rx_stop) { - selected_transport->rx_stop(); - } - selected_transport = NULL; -#if IS_ENABLED(CONFIG_ZMK_STUDIO_LOCK_ON_DISCONNECT) - zmk_studio_core_lock(); -#endif - } - - STRUCT_SECTION_FOREACH(zmk_rpc_transport, t) { - if (t->transport == transport) { - selected_transport = t; - if (selected_transport->rx_start) { - selected_transport->rx_start(); - } - break; - } - } - - if (!selected_transport) { - LOG_WRN("Failed to select a transport!"); - } - -exit_refresh: - k_mutex_unlock(&rpc_transport_mutex); -} - -static int zmk_rpc_init(void) { - int prev_choice = -1; - struct zmk_rpc_subsystem *prev_sub = NULL; - int i = 0; - - STRUCT_SECTION_FOREACH(zmk_rpc_subsystem_handler, handler) { - struct zmk_rpc_subsystem *sub = find_subsystem_for_choice(handler->subsystem_choice); - - __ASSERT(sub != NULL, "RPC Handler for unknown subsystem choice %d", - handler->subsystem_choice); - - if (prev_choice < 0) { - sub->handlers_start_index = i; - } else if ((prev_choice != handler->subsystem_choice) && prev_sub) { - prev_sub->handlers_end_index = i - 1; - sub->handlers_start_index = i; - } - - prev_choice = handler->subsystem_choice; - prev_sub = sub; - i++; - } - - if (prev_sub) { - prev_sub->handlers_end_index = i - 1; - } - - refresh_selected_transport(); - - return 0; -} - -SYS_INIT(zmk_rpc_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); - -static int studio_rpc_listener_cb(const zmk_event_t *eh) { - struct zmk_endpoint_changed *ep_changed = as_zmk_endpoint_changed(eh); - if (ep_changed) { - refresh_selected_transport(); - return ZMK_EV_EVENT_BUBBLE; - } - - struct zmk_studio_rpc_notification *rpc_notify = as_zmk_studio_rpc_notification(eh); - if (rpc_notify) { - zmk_studio_Response resp = zmk_studio_Response_init_zero; - resp.which_type = zmk_studio_Response_notification_tag; - resp.type.notification = rpc_notify->notification; - send_response(&resp); - return ZMK_EV_EVENT_BUBBLE; - } - - zmk_studio_Notification n = zmk_studio_Notification_init_zero; - STRUCT_SECTION_FOREACH(zmk_rpc_event_mapper, mapper) { - int ret = mapper->func(eh, &n); - if (ret >= 0) { - raise_zmk_studio_rpc_notification( - (struct zmk_studio_rpc_notification){.notification = n}); - break; - } - } - - return ZMK_EV_EVENT_BUBBLE; -} - -ZMK_LISTENER(studio_rpc, studio_rpc_listener_cb); -ZMK_SUBSCRIPTION(studio_rpc, zmk_endpoint_changed); -ZMK_SUBSCRIPTION(studio_rpc, zmk_studio_rpc_notification); diff --git a/app/src/studio/uart_rpc_transport.c b/app/src/studio/uart_rpc_transport.c deleted file mode 100644 index 6dcac6d1..00000000 --- a/app/src/studio/uart_rpc_transport.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include - -#include -#include - -LOG_MODULE_DECLARE(zmk_studio, CONFIG_ZMK_STUDIO_LOG_LEVEL); - -/* change this to any other UART peripheral if desired */ -#define UART_DEVICE_NODE DT_CHOSEN(zmk_studio_rpc_uart) - -static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE); - -static void tx_notify(struct ring_buf *tx_ring_buf, size_t written, bool msg_done, - void *user_data) { - if (msg_done || (ring_buf_size_get(tx_ring_buf) > (ring_buf_capacity_get(tx_ring_buf) / 2))) { -#if IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - uart_irq_tx_enable(uart_dev); -#else - struct ring_buf *tx_buf = zmk_rpc_get_tx_buf(); - uint8_t *buf; - uint32_t claim_len; - while ((claim_len = ring_buf_get_claim(tx_buf, &buf, tx_buf->size)) > 0) { - for (int i = 0; i < claim_len; i++) { - uart_poll_out(uart_dev, buf[i]); - } - - ring_buf_get_finish(tx_buf, claim_len); - } -#endif - } -} - -#if !IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - -static void uart_rx_main(void) { - for (;;) { - uint8_t *buf; - struct ring_buf *ring_buf = zmk_rpc_get_rx_buf(); - uint32_t claim_len = ring_buf_put_claim(ring_buf, &buf, 1); - - if (claim_len < 1) { - LOG_WRN("NO CLAIM ABLE TO BE HAD"); - k_sleep(K_MSEC(1)); - continue; - } - - if (uart_poll_in(uart_dev, buf) < 0) { - ring_buf_put_finish(ring_buf, 0); - k_sleep(K_MSEC(1)); - } else { - ring_buf_put_finish(ring_buf, 1); - zmk_rpc_rx_notify(); - } - } -} - -K_THREAD_DEFINE(uart_transport_read_thread, CONFIG_ZMK_STUDIO_TRANSPORT_UART_RX_STACK_SIZE, - uart_rx_main, NULL, NULL, NULL, CONFIG_ZMK_STUDIO_TRANSPORT_UART_RX_PRIORITY, 0, 0); - -#endif - -static int start_rx() { -#if IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - uart_irq_rx_enable(uart_dev); -#else - k_thread_resume(uart_transport_read_thread); -#endif - return 0; -} - -static int stop_rx(void) { -#if IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - uart_irq_rx_disable(uart_dev); -#else - k_thread_suspend(uart_transport_read_thread); -#endif - return 0; -} - -ZMK_RPC_TRANSPORT(uart, ZMK_TRANSPORT_USB, start_rx, stop_rx, NULL, tx_notify); - -#if IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - -/* - * Read characters from UART until line end is detected. Afterwards push the - * data to the message queue. - */ -static void serial_cb(const struct device *dev, void *user_data) { - if (!uart_irq_update(uart_dev)) { - return; - } - - if (uart_irq_rx_ready(uart_dev)) { - /* read until FIFO empty */ - uint32_t last_read = 0, len = 0; - struct ring_buf *buf = zmk_rpc_get_rx_buf(); - do { - uint8_t *buffer; - len = ring_buf_put_claim(buf, &buffer, buf->size); - if (len > 0) { - last_read = uart_fifo_read(uart_dev, buffer, len); - - ring_buf_put_finish(buf, last_read); - } else { - LOG_ERR("Dropping incoming RPC byte, insufficient room in the RX buffer. Bump " - "CONFIG_ZMK_STUDIO_RPC_RX_BUF_SIZE."); - uint8_t dummy; - last_read = uart_fifo_read(uart_dev, &dummy, 1); - } - } while (last_read && last_read == len); - - zmk_rpc_rx_notify(); - } - - if (uart_irq_tx_ready(uart_dev)) { - struct ring_buf *tx_buf = zmk_rpc_get_tx_buf(); - uint32_t len; - while ((len = ring_buf_size_get(tx_buf)) > 0) { - uint8_t *buf; - uint32_t claim_len = ring_buf_get_claim(tx_buf, &buf, tx_buf->size); - - if (claim_len == 0) { - continue; - } - - int sent = uart_fifo_fill(uart_dev, buf, claim_len); - - ring_buf_get_finish(tx_buf, MAX(sent, 0)); - } - } -} - -#endif - -static int uart_rpc_interface_init(void) { - if (!device_is_ready(uart_dev)) { - LOG_ERR("UART device not found!"); - return -ENODEV; - } - -#if IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - /* configure interrupt and callback to receive data */ - int ret = uart_irq_callback_user_data_set(uart_dev, serial_cb, NULL); - - if (ret < 0) { - if (ret == -ENOTSUP) { - printk("Interrupt-driven UART API support not enabled\n"); - } else if (ret == -ENOSYS) { - printk("UART device does not support interrupt-driven API\n"); - } else { - printk("Error setting UART callback: %d\n", ret); - } - return ret; - } -#endif // IS_ENABLED(CONFIG_UART_INTERRUPT_DRIVEN) - - return 0; -} - -SYS_INIT(uart_rpc_interface_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/app/src/studio/uuid.h b/app/src/studio/uuid.h deleted file mode 100644 index 4b412ac8..00000000 --- a/app/src/studio/uuid.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2024 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -#define ZMK_BT_STUDIO_UUID(num) BT_UUID_128_ENCODE(num, 0x0196, 0x6107, 0xc967, 0xc5cfb1c2482a) -#define ZMK_STUDIO_BT_SERVICE_UUID ZMK_BT_STUDIO_UUID(0x00000000) -#define ZMK_STUDIO_BT_RPC_CHRC_UUID ZMK_BT_STUDIO_UUID(0x00000001) diff --git a/app/src/usb.c b/app/src/usb.c index cf76341e..9d27900c 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -20,18 +20,17 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static enum usb_dc_status_code usb_status = USB_DC_UNKNOWN; -static bool is_configured; static void raise_usb_status_changed_event(struct k_work *_work) { - raise_zmk_usb_conn_state_changed( - (struct zmk_usb_conn_state_changed){.conn_state = zmk_usb_get_conn_state()}); + ZMK_EVENT_RAISE(new_zmk_usb_conn_state_changed( + (struct zmk_usb_conn_state_changed){.conn_state = zmk_usb_get_conn_state()})); } K_WORK_DEFINE(usb_status_notifier_work, raise_usb_status_changed_event); -enum usb_dc_status_code zmk_usb_get_status(void) { return usb_status; } +enum usb_dc_status_code zmk_usb_get_status() { return usb_status; } -enum zmk_usb_conn_state zmk_usb_get_conn_state(void) { +enum zmk_usb_conn_state zmk_usb_get_conn_state() { LOG_DBG("state: %d", usb_status); switch (usb_status) { case USB_DC_SUSPEND: @@ -50,10 +49,6 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state(void) { } } -bool zmk_usb_is_hid_ready(void) { - return zmk_usb_get_conn_state() == ZMK_USB_CONN_HID && is_configured; -} - void usb_status_cb(enum usb_dc_status_code status, const uint8_t *params) { // Start-of-frame events are too frequent and noisy to notify, and they're // not used within ZMK @@ -67,15 +62,10 @@ void usb_status_cb(enum usb_dc_status_code status, const uint8_t *params) { } #endif usb_status = status; - if (zmk_usb_get_conn_state() == ZMK_USB_CONN_HID) { - is_configured |= usb_status == USB_DC_CONFIGURED; - } else { - is_configured = false; - } k_work_submit(&usb_status_notifier_work); }; -static int zmk_usb_init(void) { +static int zmk_usb_init(const struct device *_arg) { int usb_enable_ret; usb_enable_ret = usb_enable(usb_status_cb); diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 9adc7db8..c72bb36c 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -13,15 +13,6 @@ #include #include #include - -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) -#include -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) -#include -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -48,128 +39,45 @@ void zmk_usb_hid_set_protocol(uint8_t protocol) { hid_protocol = protocol; } #endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ static uint8_t *get_keyboard_report(size_t *len) { -#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) - if (hid_protocol != HID_PROTOCOL_REPORT) { - zmk_hid_boot_report_t *boot_report = zmk_hid_get_boot_report(); - *len = sizeof(*boot_report); - return (uint8_t *)boot_report; + if (hid_protocol == HID_PROTOCOL_REPORT) { + struct zmk_hid_keyboard_report *report = zmk_hid_get_keyboard_report(); + *len = sizeof(*report); + return (uint8_t *)report; } +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + zmk_hid_boot_report_t *boot_report = zmk_hid_get_boot_report(); + *len = sizeof(*boot_report); + return (uint8_t *)boot_report; #endif - struct zmk_hid_keyboard_report *report = zmk_hid_get_keyboard_report(); - *len = sizeof(*report); - return (uint8_t *)report; } static int get_report_cb(const struct device *dev, struct usb_setup_packet *setup, int32_t *len, uint8_t **data) { - switch (setup->wValue & HID_GET_REPORT_TYPE_MASK) { - case HID_REPORT_TYPE_FEATURE: - switch (setup->wValue & HID_GET_REPORT_ID_MASK) { -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - case ZMK_HID_REPORT_ID_MOUSE: - static struct zmk_hid_mouse_resolution_feature_report res_feature_report; - struct zmk_endpoint_instance endpoint = { - .transport = ZMK_TRANSPORT_USB, - }; - - *len = sizeof(struct zmk_hid_mouse_resolution_feature_report); - struct zmk_pointing_resolution_multipliers mult = - zmk_pointing_resolution_multipliers_get_profile(endpoint); - - res_feature_report.body.wheel_res = mult.wheel; - res_feature_report.body.hwheel_res = mult.hor_wheel; - *data = (uint8_t *)&res_feature_report; - break; -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - default: - return -ENOTSUP; - } - break; - case HID_REPORT_TYPE_INPUT: - switch (setup->wValue & HID_GET_REPORT_ID_MASK) { - case ZMK_HID_REPORT_ID_KEYBOARD: { - size_t size; - *data = get_keyboard_report(&size); - *len = (int32_t)size; - break; - } - case ZMK_HID_REPORT_ID_CONSUMER: { - struct zmk_hid_consumer_report *report = zmk_hid_get_consumer_report(); - *data = (uint8_t *)report; - *len = sizeof(*report); - break; - } - default: - LOG_ERR("Invalid report ID %d requested", setup->wValue & HID_GET_REPORT_ID_MASK); - return -EINVAL; - } - break; - default: - /* - * 7.2.1 of the HID v1.11 spec is unclear about handling requests for reports that do not - * exist For requested reports that aren't input reports, return -ENOTSUP like the Zephyr - * subsys does - */ + /* + * 7.2.1 of the HID v1.11 spec is unclear about handling requests for reports that do not exist + * For requested reports that aren't input reports, return -ENOTSUP like the Zephyr subsys does + */ + if ((setup->wValue & HID_GET_REPORT_TYPE_MASK) != HID_REPORT_TYPE_INPUT) { LOG_ERR("Unsupported report type %d requested", (setup->wValue & HID_GET_REPORT_TYPE_MASK) << 8); return -ENOTSUP; } - return 0; -} - -static int set_report_cb(const struct device *dev, struct usb_setup_packet *setup, int32_t *len, - uint8_t **data) { - switch (setup->wValue & HID_GET_REPORT_TYPE_MASK) { - case HID_REPORT_TYPE_FEATURE: - switch (setup->wValue & HID_GET_REPORT_ID_MASK) { -#if IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - case ZMK_HID_REPORT_ID_MOUSE: - if (*len != sizeof(struct zmk_hid_mouse_resolution_feature_report)) { - return -EINVAL; - } - - struct zmk_hid_mouse_resolution_feature_report *report = - (struct zmk_hid_mouse_resolution_feature_report *)*data; - struct zmk_endpoint_instance endpoint = { - .transport = ZMK_TRANSPORT_USB, - }; - - zmk_pointing_resolution_multipliers_process_report(&report->body, endpoint); - - break; -#endif // IS_ENABLED(CONFIG_ZMK_POINTING_SMOOTH_SCROLLING) - default: - return -ENOTSUP; - } + switch (setup->wValue & HID_GET_REPORT_ID_MASK) { + case ZMK_HID_REPORT_ID_KEYBOARD: { + *data = get_keyboard_report(len); break; - - case HID_REPORT_TYPE_OUTPUT: - switch (setup->wValue & HID_GET_REPORT_ID_MASK) { -#if IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - case ZMK_HID_REPORT_ID_LEDS: - if (*len != sizeof(struct zmk_hid_led_report)) { - LOG_ERR("LED set report is malformed: length=%d", *len); - return -EINVAL; - } else { - struct zmk_hid_led_report *report = (struct zmk_hid_led_report *)*data; - struct zmk_endpoint_instance endpoint = { - .transport = ZMK_TRANSPORT_USB, - }; - zmk_hid_indicators_process_report(&report->body, endpoint); - } - break; -#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS) - default: - LOG_ERR("Invalid report ID %d requested", setup->wValue & HID_GET_REPORT_ID_MASK); - return -EINVAL; - } + } + case ZMK_HID_REPORT_ID_CONSUMER: { + struct zmk_hid_consumer_report *report = zmk_hid_get_consumer_report(); + *data = (uint8_t *)report; + *len = sizeof(*report); break; + } default: - LOG_ERR("Unsupported report type %d requested", - (setup->wValue & HID_GET_REPORT_TYPE_MASK) >> 8); - return -ENOTSUP; + LOG_ERR("Invalid report ID %d requested", setup->wValue & HID_GET_REPORT_ID_MASK); + return -EINVAL; } return 0; @@ -181,7 +89,6 @@ static const struct hid_ops ops = { #endif .int_in_ready = in_ready_cb, .get_report = get_report_cb, - .set_report = set_report_cb, }; static int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { @@ -205,13 +112,13 @@ static int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { } } -int zmk_usb_hid_send_keyboard_report(void) { +int zmk_usb_hid_send_keyboard_report() { size_t len; uint8_t *report = get_keyboard_report(&len); return zmk_usb_hid_send_report(report, len); } -int zmk_usb_hid_send_consumer_report(void) { +int zmk_usb_hid_send_consumer_report() { #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) if (hid_protocol == HID_PROTOCOL_BOOT) { return -ENOTSUP; @@ -222,20 +129,7 @@ int zmk_usb_hid_send_consumer_report(void) { return zmk_usb_hid_send_report((uint8_t *)report, sizeof(*report)); } -#if IS_ENABLED(CONFIG_ZMK_POINTING) -int zmk_usb_hid_send_mouse_report() { -#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) - if (hid_protocol == HID_PROTOCOL_BOOT) { - return -ENOTSUP; - } -#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ - - struct zmk_hid_mouse_report *report = zmk_hid_get_mouse_report(); - return zmk_usb_hid_send_report((uint8_t *)report, sizeof(*report)); -} -#endif // IS_ENABLED(CONFIG_ZMK_POINTING) - -static int zmk_usb_hid_init(void) { +static int zmk_usb_hid_init(const struct device *_arg) { hid_dev = device_get_binding("HID_0"); if (hid_dev == NULL) { LOG_ERR("Unable to locate HID device"); @@ -253,4 +147,4 @@ static int zmk_usb_hid_init(void) { return 0; } -SYS_INIT(zmk_usb_hid_init, APPLICATION, CONFIG_ZMK_USB_HID_INIT_PRIORITY); +SYS_INIT(zmk_usb_hid_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/src/workqueue.c b/app/src/workqueue.c index 2decc5aa..a9a8bce5 100644 --- a/app/src/workqueue.c +++ b/app/src/workqueue.c @@ -13,9 +13,11 @@ K_THREAD_STACK_DEFINE(lowprio_q_stack, CONFIG_ZMK_LOW_PRIORITY_THREAD_STACK_SIZE static struct k_work_q lowprio_work_q; -struct k_work_q *zmk_workqueue_lowprio_work_q(void) { return &lowprio_work_q; } +struct k_work_q *zmk_workqueue_lowprio_work_q() { + return &lowprio_work_q; +} -static int workqueue_init(void) { +static int workqueue_init() { static const struct k_work_queue_config queue_config = {.name = "Low Priority Work Queue"}; k_work_queue_start(&lowprio_work_q, lowprio_q_stack, K_THREAD_STACK_SIZEOF(lowprio_q_stack), CONFIG_ZMK_LOW_PRIORITY_THREAD_PRIORITY, &queue_config); diff --git a/app/src/wpm.c b/app/src/wpm.c index 182abf95..00a5942e 100644 --- a/app/src/wpm.c +++ b/app/src/wpm.c @@ -32,7 +32,7 @@ static uint8_t last_wpm_state; static uint8_t wpm_update_counter; static uint32_t key_pressed_count; -int zmk_wpm_get_state(void) { return wpm_state; } +int zmk_wpm_get_state() { return wpm_state; } int wpm_event_listener(const zmk_event_t *eh) { const struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); @@ -54,7 +54,8 @@ void wpm_work_handler(struct k_work *work) { if (last_wpm_state != wpm_state) { LOG_DBG("Raised WPM state changed %d wpm_update_counter %d", wpm_state, wpm_update_counter); - raise_zmk_wpm_state_changed((struct zmk_wpm_state_changed){.state = wpm_state}); + ZMK_EVENT_RAISE( + new_zmk_wpm_state_changed((struct zmk_wpm_state_changed){.state = wpm_state})); last_wpm_state = wpm_state; } @@ -67,11 +68,11 @@ void wpm_work_handler(struct k_work *work) { K_WORK_DEFINE(wpm_work, wpm_work_handler); -void wpm_expiry_function(struct k_timer *_timer) { k_work_submit(&wpm_work); } +void wpm_expiry_function() { k_work_submit(&wpm_work); } K_TIMER_DEFINE(wpm_timer, wpm_expiry_function, NULL); -static int wpm_init(void) { +int wpm_init() { wpm_state = 0; wpm_update_counter = 0; k_timer_start(&wpm_timer, K_SECONDS(WPM_UPDATE_INTERVAL_SECONDS), diff --git a/app/tests/backlight/basic/native_sim.conf b/app/tests/backlight/basic/native_posix_64.conf similarity index 100% rename from app/tests/backlight/basic/native_sim.conf rename to app/tests/backlight/basic/native_posix_64.conf diff --git a/app/tests/backlight/basic/native_sim.keymap b/app/tests/backlight/basic/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/basic/native_sim.keymap rename to app/tests/backlight/basic/native_posix_64.keymap diff --git a/app/tests/backlight/behavior_keymap.dtsi b/app/tests/backlight/behavior_keymap.dtsi index 4433f28c..771072ac 100644 --- a/app/tests/backlight/behavior_keymap.dtsi +++ b/app/tests/backlight/behavior_keymap.dtsi @@ -12,14 +12,17 @@ compatible = "gpio-leds"; led_0 { gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; }; led_1 { gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; }; }; keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/backlight/config-brt/native_sim.conf b/app/tests/backlight/config-brt/native_posix_64.conf similarity index 100% rename from app/tests/backlight/config-brt/native_sim.conf rename to app/tests/backlight/config-brt/native_posix_64.conf diff --git a/app/tests/backlight/config-brt/native_sim.keymap b/app/tests/backlight/config-brt/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/config-brt/native_sim.keymap rename to app/tests/backlight/config-brt/native_posix_64.keymap diff --git a/app/tests/backlight/config-on/native_sim.conf b/app/tests/backlight/config-on/native_posix_64.conf similarity index 100% rename from app/tests/backlight/config-on/native_sim.conf rename to app/tests/backlight/config-on/native_posix_64.conf diff --git a/app/tests/backlight/config-on/native_sim.keymap b/app/tests/backlight/config-on/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/config-on/native_sim.keymap rename to app/tests/backlight/config-on/native_posix_64.keymap diff --git a/app/tests/backlight/config-step/native_sim.conf b/app/tests/backlight/config-step/native_posix_64.conf similarity index 100% rename from app/tests/backlight/config-step/native_sim.conf rename to app/tests/backlight/config-step/native_posix_64.conf diff --git a/app/tests/backlight/config-step/native_sim.keymap b/app/tests/backlight/config-step/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/config-step/native_sim.keymap rename to app/tests/backlight/config-step/native_posix_64.keymap diff --git a/app/tests/backlight/cycle/native_sim.conf b/app/tests/backlight/cycle/native_posix_64.conf similarity index 100% rename from app/tests/backlight/cycle/native_sim.conf rename to app/tests/backlight/cycle/native_posix_64.conf diff --git a/app/tests/backlight/cycle/native_sim.keymap b/app/tests/backlight/cycle/native_posix_64.keymap similarity index 94% rename from app/tests/backlight/cycle/native_sim.keymap rename to app/tests/backlight/cycle/native_posix_64.keymap index dcc23aa5..00615e35 100644 --- a/app/tests/backlight/cycle/native_sim.keymap +++ b/app/tests/backlight/cycle/native_posix_64.keymap @@ -12,14 +12,17 @@ compatible = "gpio-leds"; led_0 { gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; }; led_1 { gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; }; }; keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/backlight/low-brightness/native_sim.conf b/app/tests/backlight/low-brightness/native_posix_64.conf similarity index 100% rename from app/tests/backlight/low-brightness/native_sim.conf rename to app/tests/backlight/low-brightness/native_posix_64.conf diff --git a/app/tests/backlight/low-brightness/native_sim.keymap b/app/tests/backlight/low-brightness/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/low-brightness/native_sim.keymap rename to app/tests/backlight/low-brightness/native_posix_64.keymap diff --git a/app/tests/ble/central/CMakeLists.txt b/app/tests/ble/central/CMakeLists.txt deleted file mode 100644 index 020bef38..00000000 --- a/app/tests/ble/central/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.20.0) -find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) -project(ble_test_central) - -FILE(GLOB app_sources src/*.c) -target_sources(app PRIVATE ${app_sources}) - -# zephyr_library_include_directories(${ZEPHYR_BASE}/samples/bluetooth) diff --git a/app/tests/ble/central/prj.conf b/app/tests/ble/central/prj.conf deleted file mode 100644 index 735d4ac5..00000000 --- a/app/tests/ble/central/prj.conf +++ /dev/null @@ -1,9 +0,0 @@ -CONFIG_BT=y -CONFIG_LOG=y -CONFIG_BOOT_BANNER=n -CONFIG_BT_LOG_LEVEL_WRN=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_BT_CENTRAL=y -CONFIG_BT_SMP=y -CONFIG_BT_SCAN_WITH_IDENTITY=y -CONFIG_BT_GATT_CLIENT=y diff --git a/app/tests/ble/central/src/main.c b/app/tests/ble/central/src/main.c deleted file mode 100644 index f33d50e0..00000000 --- a/app/tests/ble/central/src/main.c +++ /dev/null @@ -1,504 +0,0 @@ -/* main.c - Application main entry point */ - -/* - * Copyright (c) 2015-2016 Intel Corporation - * Copyright (c) 2023 The ZMK Contributors - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include -#include -#include - -#include - -LOG_MODULE_REGISTER(ble_central, 4); - -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ARCH_POSIX - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cmdline.h" -#include "soc.h" - -static bool disconnect_and_reconnect = false; -static bool clear_bond_on_disconnect = false; -static bool halt_after_bonding = false; -static bool read_hid_report_on_connect = false; -static bool skip_set_security_on_connect = false; -static bool skip_discovery_on_connect = false; -static bool read_directly_on_discovery = false; -static bool write_hid_indicators_on_discovery = false; -static bool subscribe_to_pointer_report = false; -static int32_t wait_on_start = 0; - -static void ble_central_native_posix_options(void) { - static struct args_struct_t options[] = { - {.is_switch = true, - .option = "disconnect_and_reconnect", - .type = 'b', - .dest = (void *)&disconnect_and_reconnect, - .descript = "Disconnect and reconnect after the initial connection"}, - {.is_switch = true, - .option = "halt_after_bonding", - .type = 'b', - .dest = (void *)&halt_after_bonding, - .descript = "Halt any further logic after bonding the first time"}, - {.is_switch = true, - .option = "clear_bond_on_disconnect", - .type = 'b', - .dest = (void *)&clear_bond_on_disconnect, - .descript = "Clear bonds on disconnect and reconnect"}, - {.is_switch = true, - .option = "skip_set_security_on_connect", - .type = 'b', - .dest = (void *)&skip_set_security_on_connect, - .descript = "Skip set security level after connecting"}, - {.is_switch = true, - .option = "read_hid_report_on_connect", - .type = 'b', - .dest = (void *)&read_hid_report_on_connect, - .descript = "Read the peripheral HID report after connecting"}, - {.is_switch = true, - .option = "subscribe_to_pointer_report", - .type = 'b', - .dest = (void *)&subscribe_to_pointer_report, - .descript = "Subscribe to peripheral mouse HID report after connecting"}, - {.is_switch = true, - .option = "skip_discovery_on_connect", - .type = 'b', - .dest = (void *)&skip_discovery_on_connect, - .descript = "Skip GATT characteristic discovery after connecting"}, - {.is_switch = true, - .option = "read_directly_on_discovery", - .type = 'b', - .dest = (void *)&read_directly_on_discovery, - .descript = "Read HIDS report after GATT characteristic discovery"}, - {.is_switch = true, - .option = "write_hid_indicators_on_discovery", - .type = 'b', - .dest = (void *)&write_hid_indicators_on_discovery, - .descript = "Write HIDS indecator report after GATT characteristic discovery"}, - {.option = "wait_on_start", - .name = "milliseconds", - .type = 'u', - .dest = (void *)&wait_on_start, - .descript = "Time in milliseconds to wait before starting the test process"}, - ARG_TABLE_ENDMARKER}; - - native_add_command_line_opts(options); -} - -NATIVE_TASK(ble_central_native_posix_options, PRE_BOOT_1, 1); - -#endif - -static int start_scan(void); - -static struct bt_conn *default_conn; - -static struct bt_uuid_16 uuid = BT_UUID_INIT_16(0); -static struct bt_gatt_discover_params discover_params; -static struct bt_gatt_subscribe_params subscribe_params; -static struct bt_gatt_subscribe_params consumer_subscribe_params; -static struct bt_gatt_subscribe_params pointer_subscribe_params; - -static uint8_t notify_func(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, - const void *data, uint16_t length) { - if (!data) { - LOG_DBG("[UNSUBSCRIBED]"); - params->value_handle = 0U; - return BT_GATT_ITER_STOP; - } - - LOG_HEXDUMP_DBG(data, length, "payload"); - - return BT_GATT_ITER_CONTINUE; -} - -static struct bt_gatt_read_params read_params; -static const struct bt_uuid_16 hids_uuid = BT_UUID_INIT_16(BT_UUID_HIDS_REPORT_VAL); - -static uint8_t read_cb(struct bt_conn *conn, uint8_t err, struct bt_gatt_read_params *params, - const void *data, uint16_t length) { - LOG_DBG("Read err: %d, length %d", err, length); - - return BT_GATT_ITER_CONTINUE; -} - -static uint8_t discover_func(struct bt_conn *conn, const struct bt_gatt_attr *attr, - struct bt_gatt_discover_params *params) { - int err; - - if (!attr) { - LOG_DBG("[Discover complete]"); - (void)memset(params, 0, sizeof(*params)); - return BT_GATT_ITER_STOP; - } - - LOG_DBG("[ATTRIBUTE] handle %u", attr->handle); - - bool find_next_hids_report = false; - - if (!bt_uuid_cmp(discover_params.uuid, BT_UUID_HIDS)) { - find_next_hids_report = true; - } else if (!bt_uuid_cmp(discover_params.uuid, BT_UUID_HIDS_REPORT)) { - if (read_directly_on_discovery && !read_params.single.handle) { - read_params.single.handle = bt_gatt_attr_value_handle(attr); - read_params.single.offset = 0; - read_params.handle_count = 1; - read_params.func = read_cb; - - bt_gatt_read(conn, &read_params); - - find_next_hids_report = write_hid_indicators_on_discovery; - } else if (!subscribe_params.value_handle) { - memcpy(&uuid, BT_UUID_GATT_CCC, sizeof(uuid)); - discover_params.uuid = &uuid.uuid; - discover_params.start_handle = attr->handle + 2; - discover_params.type = BT_GATT_DISCOVER_DESCRIPTOR; - subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); - - err = bt_gatt_discover(conn, &discover_params); - if (err) { - LOG_DBG("[Discover failed] (err %d)", err); - } - } else if (!consumer_subscribe_params.value_handle) { - memcpy(&uuid, BT_UUID_GATT_CCC, sizeof(uuid)); - discover_params.uuid = &uuid.uuid; - discover_params.start_handle = attr->handle + 2; - discover_params.type = BT_GATT_DISCOVER_DESCRIPTOR; - consumer_subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); - - err = bt_gatt_discover(conn, &discover_params); - if (err) { - LOG_DBG("[Discover failed] (err %d)", err); - } - } else if (subscribe_to_pointer_report && !pointer_subscribe_params.value_handle) { - memcpy(&uuid, BT_UUID_GATT_CCC, sizeof(uuid)); - discover_params.uuid = &uuid.uuid; - discover_params.start_handle = attr->handle + 2; - discover_params.type = BT_GATT_DISCOVER_DESCRIPTOR; - pointer_subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); - - err = bt_gatt_discover(conn, &discover_params); - if (err) { - LOG_DBG("[Discover failed] (err %d)", err); - } - } else { - uint8_t indicators = 0b00000111; - int resp = bt_gatt_write_without_response(conn, bt_gatt_attr_value_handle(attr), - &indicators, 1, true); - if (resp < 0) { - LOG_ERR("Failed to write %d", resp); - } - - return BT_GATT_ITER_CONTINUE; - } - } else if (discover_params.type == BT_GATT_DISCOVER_DESCRIPTOR) { - if (!subscribe_params.ccc_handle) { - - subscribe_params.notify = notify_func; - subscribe_params.value = BT_GATT_CCC_NOTIFY; - subscribe_params.ccc_handle = attr->handle; - - err = bt_gatt_subscribe(conn, &subscribe_params); - if (err && err != -EALREADY) { - LOG_DBG("[Subscribe failed] (err %d)", err); - } else { - LOG_DBG("[SUBSCRIBED]"); - } - } else if (!consumer_subscribe_params.ccc_handle) { - - consumer_subscribe_params.notify = notify_func; - consumer_subscribe_params.value = BT_GATT_CCC_NOTIFY; - consumer_subscribe_params.ccc_handle = attr->handle; - - err = bt_gatt_subscribe(conn, &consumer_subscribe_params); - if (err && err != -EALREADY) { - LOG_DBG("[Subscribe failed] (err %d)", err); - } else { - LOG_DBG("[CONSUMER SUBSCRIBED]"); - } - } else { - pointer_subscribe_params.notify = notify_func; - pointer_subscribe_params.value = BT_GATT_CCC_NOTIFY; - pointer_subscribe_params.ccc_handle = attr->handle; - - err = bt_gatt_subscribe(conn, &pointer_subscribe_params); - if (err && err != -EALREADY) { - LOG_DBG("[Subscribe failed] (err %d)", err); - } else { - LOG_DBG("[MOUSE SUBSCRIBED]"); - } - } - - find_next_hids_report = !consumer_subscribe_params.ccc_handle || - write_hid_indicators_on_discovery || subscribe_to_pointer_report; - } - - if (find_next_hids_report) { - memcpy(&uuid, BT_UUID_HIDS_REPORT, sizeof(uuid)); - discover_params.uuid = &uuid.uuid; - discover_params.start_handle = attr->handle + 1; - discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; - - err = bt_gatt_discover(conn, &discover_params); - if (err) { - LOG_DBG("[Discover failed] (err %d)", err); - } - } - - return BT_GATT_ITER_STOP; -} - -static void reconnect(const bt_addr_le_t *addr) { - struct bt_le_conn_param *param; - int err = bt_le_scan_stop(); - if (err < 0) { - LOG_DBG("Stop LE scan failed (err %d)", err); - } - - param = BT_LE_CONN_PARAM_DEFAULT; - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &default_conn); - if (err < 0) { - LOG_DBG("Create conn failed (err %d)", err); - start_scan(); - } -} - -static bool eir_found(struct bt_data *data, void *user_data) { - bt_addr_le_t *addr = user_data; - int i; - - LOG_DBG("[AD]: %u data_len %u", data->type, data->data_len); - - switch (data->type) { - case BT_DATA_UUID16_SOME: - case BT_DATA_UUID16_ALL: - if (data->data_len % sizeof(uint16_t) != 0U) { - LOG_DBG("[AD malformed]"); - return true; - } - - for (i = 0; i < data->data_len; i += sizeof(uint16_t)) { - struct bt_le_conn_param *param; - struct bt_uuid *uuid; - uint16_t u16; - int err; - - memcpy(&u16, &data->data[i], sizeof(u16)); - uuid = BT_UUID_DECLARE_16(sys_le16_to_cpu(u16)); - if (bt_uuid_cmp(uuid, BT_UUID_HIDS)) { - continue; - } - - err = bt_le_scan_stop(); - if (err) { - LOG_DBG("[Stop LE scan failed] (err %d)", err); - continue; - } - - param = BT_LE_CONN_PARAM_DEFAULT; - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &default_conn); - if (err) { - LOG_DBG("[Create conn failed] (err %d)", err); - start_scan(); - } - - return false; - } - } - - return true; -} - -static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type, - struct net_buf_simple *ad) { - char dev[BT_ADDR_LE_STR_LEN]; - - bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); - - /* We're only interested in connectable events */ - if (type == BT_GAP_ADV_TYPE_ADV_IND) { - bt_data_parse(ad, eir_found, (void *)addr); - } else if (type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { - reconnect(addr); - } -} - -static int start_scan(void) { - int err; - - /* Use active scanning and disable duplicate filtering to handle any - * devices that might update their advertising data at runtime. */ - struct bt_le_scan_param scan_param = { - .type = BT_LE_SCAN_TYPE_ACTIVE, - .options = BT_LE_SCAN_OPT_NONE, - .interval = BT_GAP_SCAN_FAST_INTERVAL, - .window = BT_GAP_SCAN_FAST_WINDOW, - }; - - err = bt_le_scan_start(&scan_param, device_found); - if (err) { - LOG_DBG("[Scanning failed to start] (err %d)", err); - return err; - } - - LOG_DBG("[Scanning successfully started]"); - return 0; -} - -static void discover_conn(struct bt_conn *conn) { - int err; - - LOG_DBG("[Discovery started for conn]"); - memcpy(&uuid, BT_UUID_HIDS, sizeof(uuid)); - discover_params.uuid = &uuid.uuid; - discover_params.func = discover_func; - discover_params.start_handle = BT_ATT_FIRST_ATTRIBUTE_HANDLE; - discover_params.end_handle = BT_ATT_LAST_ATTRIBUTE_HANDLE; - discover_params.type = BT_GATT_DISCOVER_PRIMARY; - - err = bt_gatt_discover(default_conn, &discover_params); - if (err) { - LOG_DBG("[Discover failed] (err %d)", err); - return; - } -} - -static void connected(struct bt_conn *conn, uint8_t conn_err) { - char addr[BT_ADDR_LE_STR_LEN]; - - bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - - if (conn_err) { - LOG_DBG("[Failed to connect to %s] (%u)", addr, conn_err); - - bt_conn_unref(default_conn); - default_conn = NULL; - - start_scan(); - return; - } - - LOG_DBG("[Connected]: %s", addr); - - if (conn == default_conn) { - if (bt_conn_get_security(conn) >= BT_SECURITY_L2 && !skip_discovery_on_connect) { - LOG_DBG("[Discovering characteristics for the connection]"); - discover_conn(conn); - } else if (!skip_set_security_on_connect) { - LOG_DBG("[Setting the security for the connection]"); - bt_conn_set_security(conn, BT_SECURITY_L2); - } - - if (read_hid_report_on_connect) { - read_params.func = read_cb; - read_params.handle_count = 0; - read_params.by_uuid.start_handle = 0x0001; - read_params.by_uuid.end_handle = 0xFFFF; - read_params.by_uuid.uuid = &hids_uuid.uuid; - - bt_gatt_read(conn, &read_params); - } - } -} - -static bool first_connect = true; -static void pairing_complete(struct bt_conn *conn, bool bonded) { LOG_DBG("Pairing complete"); } - -static void do_disconnect_of_active(struct k_work *work) { - bt_conn_disconnect(default_conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); - if (clear_bond_on_disconnect) { - bt_unpair(BT_ID_DEFAULT, bt_conn_get_dst(default_conn)); - } -} - -static K_WORK_DELAYABLE_DEFINE(disconnect_work, do_disconnect_of_active); - -static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_security_err err) { - if (err > BT_SECURITY_ERR_SUCCESS) { - LOG_DBG("[Security Change Failed]"); - exit(1); - } - - if (halt_after_bonding) { - exit(1); - } - - bool do_disconnect = first_connect && disconnect_and_reconnect; - first_connect = false; - if (do_disconnect) { - k_work_reschedule(&disconnect_work, K_MSEC(500)); - } else if (!skip_discovery_on_connect) { - discover_conn(conn); - } -} - -static void disconnected(struct bt_conn *conn, uint8_t reason) { - char addr[BT_ADDR_LE_STR_LEN]; - - bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - - LOG_DBG("[Disconnected]: %s (reason 0x%02x)", addr, reason); - - if (default_conn != conn) { - return; - } - - bt_conn_unref(default_conn); - default_conn = NULL; - - if (!halt_after_bonding) { - start_scan(); - } -} - -BT_CONN_CB_DEFINE(conn_callbacks) = { - .connected = connected, - .disconnected = disconnected, - .security_changed = security_changed, -}; - -struct bt_conn_auth_info_cb auth_info_cb = { - .pairing_complete = pairing_complete, -}; - -int main(void) { - int err; - - if (wait_on_start > 0) { - k_sleep(K_MSEC(wait_on_start)); - } - - err = bt_conn_auth_info_cb_register(&auth_info_cb); - - err = bt_enable(NULL); - - if (err) { - LOG_DBG("[Bluetooth init failed] (err %d)", err); - return err; - } - - LOG_DBG("[Bluetooth initialized]"); - - return start_scan(); -} diff --git a/app/tests/ble/profiles/bond-clear-then-bond-second-client/events.patterns b/app/tests/ble/profiles/bond-clear-then-bond-second-client/events.patterns deleted file mode 100644 index dbfe5627..00000000 --- a/app/tests/ble/profiles/bond-clear-then-bond-second-client/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p -s/^d_03: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 1 /p diff --git a/app/tests/ble/profiles/bond-clear-then-bond-second-client/nrf52_bsim.keymap b/app/tests/ble/profiles/bond-clear-then-bond-second-client/nrf52_bsim.keymap deleted file mode 100644 index 36eba046..00000000 --- a/app/tests/ble/profiles/bond-clear-then-bond-second-client/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_CLR>; - }; - }; -}; diff --git a/app/tests/ble/profiles/bond-clear-then-bond-second-client/siblings.txt b/app/tests/ble/profiles/bond-clear-then-bond-second-client/siblings.txt deleted file mode 100644 index 80601bad..00000000 --- a/app/tests/ble/profiles/bond-clear-then-bond-second-client/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -halt_after_bonding -./ble_test_central.exe -d=3 -wait_on_start=1300 diff --git a/app/tests/ble/profiles/bond-clear-then-bond-second-client/snapshot.log b/app/tests/ble/profiles/bond-clear-then-bond-second-client/snapshot.log deleted file mode 100644 index ce5e9e33..00000000 --- a/app/tests/ble/profiles/bond-clear-then-bond-second-client/snapshot.log +++ /dev/null @@ -1,32 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 1 bt_id: No static addresses stored in controller -profile 1 ble_central: main: [Bluetooth initialized] -profile 1 ble_central: start_scan: [Scanning successfully started] -profile 1 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 1 ble_central: eir_found: [AD]: 25 data_len 2 -profile 1 ble_central: eir_found: [AD]: 1 data_len 1 -profile 1 ble_central: eir_found: [AD]: 2 data_len 4 -profile 1 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 1 ble_central: connected: [Setting the security for the connection] -profile 1 ble_central: pairing_complete: Pairing complete -profile 1 ble_central: discover_conn: [Discovery started for conn] -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 1 ble_central: discover_func: [SUBSCRIBED] -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 1 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 1 ble_central: notify_func: payload -profile 1 00 00 04 00 00 00 00 00 |........ -profile 1 ble_central: notify_func: payload -profile 1 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/profiles/bond-to-cleared-profile/events.patterns b/app/tests/ble/profiles/bond-to-cleared-profile/events.patterns deleted file mode 100644 index dbfe5627..00000000 --- a/app/tests/ble/profiles/bond-to-cleared-profile/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p -s/^d_03: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 1 /p diff --git a/app/tests/ble/profiles/bond-to-cleared-profile/nrf52_bsim.keymap b/app/tests/ble/profiles/bond-to-cleared-profile/nrf52_bsim.keymap deleted file mode 100644 index 45e2aea0..00000000 --- a/app/tests/ble/profiles/bond-to-cleared-profile/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_CLR>; - }; - }; -}; diff --git a/app/tests/ble/profiles/bond-to-cleared-profile/siblings.txt b/app/tests/ble/profiles/bond-to-cleared-profile/siblings.txt deleted file mode 100644 index 80601bad..00000000 --- a/app/tests/ble/profiles/bond-to-cleared-profile/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -halt_after_bonding -./ble_test_central.exe -d=3 -wait_on_start=1300 diff --git a/app/tests/ble/profiles/bond-to-cleared-profile/snapshot.log b/app/tests/ble/profiles/bond-to-cleared-profile/snapshot.log deleted file mode 100644 index ce5e9e33..00000000 --- a/app/tests/ble/profiles/bond-to-cleared-profile/snapshot.log +++ /dev/null @@ -1,32 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 1 bt_id: No static addresses stored in controller -profile 1 ble_central: main: [Bluetooth initialized] -profile 1 ble_central: start_scan: [Scanning successfully started] -profile 1 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 1 ble_central: eir_found: [AD]: 25 data_len 2 -profile 1 ble_central: eir_found: [AD]: 1 data_len 1 -profile 1 ble_central: eir_found: [AD]: 2 data_len 4 -profile 1 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 1 ble_central: connected: [Setting the security for the connection] -profile 1 ble_central: pairing_complete: Pairing complete -profile 1 ble_central: discover_conn: [Discovery started for conn] -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 1 ble_central: discover_func: [SUBSCRIBED] -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 1 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 1 ble_central: notify_func: payload -profile 1 00 00 04 00 00 00 00 00 |........ -profile 1 ble_central: notify_func: payload -profile 1 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/profiles/connnect-and-output-to-selection/events.patterns b/app/tests/ble/profiles/connnect-and-output-to-selection/events.patterns deleted file mode 100644 index cca5a2d4..00000000 --- a/app/tests/ble/profiles/connnect-and-output-to-selection/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}//p diff --git a/app/tests/ble/profiles/connnect-and-output-to-selection/nrf52_bsim.keymap b/app/tests/ble/profiles/connnect-and-output-to-selection/nrf52_bsim.keymap deleted file mode 100644 index 7c67425e..00000000 --- a/app/tests/ble/profiles/connnect-and-output-to-selection/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/profiles/connnect-and-output-to-selection/siblings.txt b/app/tests/ble/profiles/connnect-and-output-to-selection/siblings.txt deleted file mode 100644 index 110e617d..00000000 --- a/app/tests/ble/profiles/connnect-and-output-to-selection/siblings.txt +++ /dev/null @@ -1 +0,0 @@ -./ble_test_central.exe -d=2 diff --git a/app/tests/ble/profiles/connnect-and-output-to-selection/snapshot.log b/app/tests/ble/profiles/connnect-and-output-to-selection/snapshot.log deleted file mode 100644 index 2c83ae2e..00000000 --- a/app/tests/ble/profiles/connnect-and-output-to-selection/snapshot.log +++ /dev/null @@ -1,26 +0,0 @@ - bt_id: No static addresses stored in controller - ble_central: main: [Bluetooth initialized] - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: connected: [Setting the security for the connection] - ble_central: pairing_complete: Pairing complete - ble_central: discover_conn: [Discovery started for conn] - ble_central: discover_func: [ATTRIBUTE] handle 23 - ble_central: discover_func: [ATTRIBUTE] handle 28 - ble_central: discover_func: [ATTRIBUTE] handle 30 - ble_central: discover_func: [SUBSCRIBED] - ble_central: discover_func: [ATTRIBUTE] handle 32 - ble_central: discover_func: [ATTRIBUTE] handle 34 - ble_central: discover_func: [CONSUMER SUBSCRIBED] - ble_central: notify_func: payload - 00 00 04 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 00 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 05 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/profiles/dont-bond-to-taken-profile/events.patterns b/app/tests/ble/profiles/dont-bond-to-taken-profile/events.patterns deleted file mode 100644 index dbfe5627..00000000 --- a/app/tests/ble/profiles/dont-bond-to-taken-profile/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p -s/^d_03: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 1 /p diff --git a/app/tests/ble/profiles/dont-bond-to-taken-profile/nrf52_bsim.keymap b/app/tests/ble/profiles/dont-bond-to-taken-profile/nrf52_bsim.keymap deleted file mode 100644 index 7c67425e..00000000 --- a/app/tests/ble/profiles/dont-bond-to-taken-profile/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/profiles/dont-bond-to-taken-profile/siblings.txt b/app/tests/ble/profiles/dont-bond-to-taken-profile/siblings.txt deleted file mode 100644 index 80601bad..00000000 --- a/app/tests/ble/profiles/dont-bond-to-taken-profile/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -halt_after_bonding -./ble_test_central.exe -d=3 -wait_on_start=1300 diff --git a/app/tests/ble/profiles/dont-bond-to-taken-profile/snapshot.log b/app/tests/ble/profiles/dont-bond-to-taken-profile/snapshot.log deleted file mode 100644 index d754b9c4..00000000 --- a/app/tests/ble/profiles/dont-bond-to-taken-profile/snapshot.log +++ /dev/null @@ -1,21 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 1 bt_id: No static addresses stored in controller -profile 1 ble_central: main: [Bluetooth initialized] -profile 1 ble_central: start_scan: [Scanning successfully started] -profile 1 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 1 ble_central: eir_found: [AD]: 25 data_len 2 -profile 1 ble_central: eir_found: [AD]: 1 data_len 1 -profile 1 ble_central: eir_found: [AD]: 2 data_len 4 -profile 1 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 1 ble_central: connected: [Setting the security for the connection] -profile 1 bt_smp: pairing failed (peer reason 0x8) -profile 1 ble_central: security_changed: [Security Change Failed] diff --git a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/events.patterns b/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/events.patterns deleted file mode 100644 index dbfe5627..00000000 --- a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p -s/^d_03: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 1 /p diff --git a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/nrf52_bsim.keymap b/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/nrf52_bsim.keymap deleted file mode 100644 index de6884ae..00000000 --- a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/nrf52_bsim.keymap +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/siblings.txt b/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/siblings.txt deleted file mode 100644 index e60cdec0..00000000 --- a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -./ble_test_central.exe -d=3 -wait_on_start=1300 diff --git a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/snapshot.log b/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/snapshot.log deleted file mode 100644 index 4a58305a..00000000 --- a/app/tests/ble/profiles/first-and-second-profile-paired-then-send-data/snapshot.log +++ /dev/null @@ -1,44 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 0 ble_central: discover_conn: [Discovery started for conn] -profile 1 bt_id: No static addresses stored in controller -profile 1 ble_central: main: [Bluetooth initialized] -profile 1 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 0 ble_central: discover_func: [SUBSCRIBED] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 0 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 0 ble_central: notify_func: payload -profile 0 00 00 04 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 |........ -profile 1 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 -profile 1 ble_central: eir_found: [AD]: 25 data_len 2 -profile 1 ble_central: eir_found: [AD]: 1 data_len 1 -profile 1 ble_central: eir_found: [AD]: 2 data_len 4 -profile 1 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 1 ble_central: connected: [Setting the security for the connection] -profile 1 ble_central: pairing_complete: Pairing complete -profile 1 ble_central: discover_conn: [Discovery started for conn] -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 1 ble_central: discover_func: [SUBSCRIBED] -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 1 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 1 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 1 ble_central: notify_func: payload -profile 1 00 00 05 00 00 00 00 00 |........ -profile 1 ble_central: notify_func: payload -profile 1 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/events.patterns b/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/events.patterns deleted file mode 100644 index cca5a2d4..00000000 --- a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}//p diff --git a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/nrf52_bsim.conf b/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/nrf52_bsim.conf deleted file mode 100644 index e1bee6a7..00000000 --- a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/nrf52_bsim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BT_SMP_ALLOW_UNAUTH_OVERWRITE=y \ No newline at end of file diff --git a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/nrf52_bsim.keymap b/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/nrf52_bsim.keymap deleted file mode 100644 index 789cec44..00000000 --- a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/nrf52_bsim.keymap +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/siblings.txt b/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/siblings.txt deleted file mode 100644 index 53d70e32..00000000 --- a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/siblings.txt +++ /dev/null @@ -1 +0,0 @@ -./ble_test_central.exe -d=2 -disconnect_and_reconnect -clear_bond_on_disconnect diff --git a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/snapshot.log b/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/snapshot.log deleted file mode 100644 index afa4f676..00000000 --- a/app/tests/ble/profiles/overwrite-enabled-reconnect-without-bond-then-output-to-selection/snapshot.log +++ /dev/null @@ -1,35 +0,0 @@ - bt_id: No static addresses stored in controller - ble_central: main: [Bluetooth initialized] - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: connected: [Setting the security for the connection] - ble_central: pairing_complete: Pairing complete - ble_central: disconnected: [Disconnected]: FD:9E:B2:48:47:39 (random) (reason 0x16) - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: connected: [Setting the security for the connection] - ble_central: pairing_complete: Pairing complete - ble_central: discover_conn: [Discovery started for conn] - ble_central: discover_func: [ATTRIBUTE] handle 23 - ble_central: discover_func: [ATTRIBUTE] handle 28 - ble_central: discover_func: [ATTRIBUTE] handle 30 - ble_central: discover_func: [SUBSCRIBED] - ble_central: discover_func: [ATTRIBUTE] handle 32 - ble_central: discover_func: [ATTRIBUTE] handle 34 - ble_central: discover_func: [CONSUMER SUBSCRIBED] - ble_central: notify_func: payload - 00 00 04 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 00 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 05 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/profiles/reconnect-then-output-to-selection/events.patterns b/app/tests/ble/profiles/reconnect-then-output-to-selection/events.patterns deleted file mode 100644 index cca5a2d4..00000000 --- a/app/tests/ble/profiles/reconnect-then-output-to-selection/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}//p diff --git a/app/tests/ble/profiles/reconnect-then-output-to-selection/nrf52_bsim.keymap b/app/tests/ble/profiles/reconnect-then-output-to-selection/nrf52_bsim.keymap deleted file mode 100644 index 7c67425e..00000000 --- a/app/tests/ble/profiles/reconnect-then-output-to-selection/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/profiles/reconnect-then-output-to-selection/siblings.txt b/app/tests/ble/profiles/reconnect-then-output-to-selection/siblings.txt deleted file mode 100644 index 24781185..00000000 --- a/app/tests/ble/profiles/reconnect-then-output-to-selection/siblings.txt +++ /dev/null @@ -1 +0,0 @@ -./ble_test_central.exe -d=2 -disconnect_and_reconnect diff --git a/app/tests/ble/profiles/reconnect-then-output-to-selection/snapshot.log b/app/tests/ble/profiles/reconnect-then-output-to-selection/snapshot.log deleted file mode 100644 index b12db556..00000000 --- a/app/tests/ble/profiles/reconnect-then-output-to-selection/snapshot.log +++ /dev/null @@ -1,34 +0,0 @@ - bt_id: No static addresses stored in controller - ble_central: main: [Bluetooth initialized] - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: connected: [Setting the security for the connection] - ble_central: pairing_complete: Pairing complete - ble_central: disconnected: [Disconnected]: FD:9E:B2:48:47:39 (random) (reason 0x16) - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: connected: [Setting the security for the connection] - ble_central: discover_conn: [Discovery started for conn] - ble_central: discover_func: [ATTRIBUTE] handle 23 - ble_central: discover_func: [ATTRIBUTE] handle 28 - ble_central: discover_func: [ATTRIBUTE] handle 30 - ble_central: discover_func: [SUBSCRIBED] - ble_central: discover_func: [ATTRIBUTE] handle 32 - ble_central: discover_func: [ATTRIBUTE] handle 34 - ble_central: discover_func: [CONSUMER SUBSCRIBED] - ble_central: notify_func: payload - 00 00 04 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 00 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 05 00 00 00 00 00 |........ - ble_central: notify_func: payload - 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/events.patterns b/app/tests/ble/security/read-hid-after-connect-with-auto-sec/events.patterns deleted file mode 100644 index cca5a2d4..00000000 --- a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}//p diff --git a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/nrf52_bsim.keymap b/app/tests/ble/security/read-hid-after-connect-with-auto-sec/nrf52_bsim.keymap deleted file mode 100644 index 7c67425e..00000000 --- a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/siblings.txt b/app/tests/ble/security/read-hid-after-connect-with-auto-sec/siblings.txt deleted file mode 100644 index a660de60..00000000 --- a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/siblings.txt +++ /dev/null @@ -1 +0,0 @@ -./ble_test_central.exe -d=2 -skip_set_security_on_connect -read_hid_report_on_connect -skip_discovery_on_connect diff --git a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/snapshot.log b/app/tests/ble/security/read-hid-after-connect-with-auto-sec/snapshot.log deleted file mode 100644 index 4c8f2c27..00000000 --- a/app/tests/ble/security/read-hid-after-connect-with-auto-sec/snapshot.log +++ /dev/null @@ -1,12 +0,0 @@ - bt_id: No static addresses stored in controller - ble_central: main: [Bluetooth initialized] - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: pairing_complete: Pairing complete - ble_central: read_cb: Read err: 0, length 8 - ble_central: read_cb: Read err: 0, length 12 - ble_central: read_cb: Read err: 10, length 0 diff --git a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/events.patterns b/app/tests/ble/security/read-hid-after-connect-without-auto-sec/events.patterns deleted file mode 100644 index cca5a2d4..00000000 --- a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}//p diff --git a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/nrf52_bsim.conf b/app/tests/ble/security/read-hid-after-connect-without-auto-sec/nrf52_bsim.conf deleted file mode 100644 index e69de29b..00000000 diff --git a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/nrf52_bsim.keymap b/app/tests/ble/security/read-hid-after-connect-without-auto-sec/nrf52_bsim.keymap deleted file mode 100644 index 7c67425e..00000000 --- a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/nrf52_bsim.keymap +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -&kscan { - events = - ; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_SEL 1>; - }; - }; -}; diff --git a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/siblings.txt b/app/tests/ble/security/read-hid-after-connect-without-auto-sec/siblings.txt deleted file mode 100644 index 3b20ace1..00000000 --- a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/siblings.txt +++ /dev/null @@ -1 +0,0 @@ -./ble_test_no_auto_sec_central.exe -d=2 -skip_set_security_on_connect -read_hid_report_on_connect -skip_discovery_on_connect diff --git a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/snapshot.log b/app/tests/ble/security/read-hid-after-connect-without-auto-sec/snapshot.log deleted file mode 100644 index e32f76af..00000000 --- a/app/tests/ble/security/read-hid-after-connect-without-auto-sec/snapshot.log +++ /dev/null @@ -1,9 +0,0 @@ - bt_id: No static addresses stored in controller - ble_central: main: [Bluetooth initialized] - ble_central: start_scan: [Scanning successfully started] - ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -59 - ble_central: eir_found: [AD]: 25 data_len 2 - ble_central: eir_found: [AD]: 1 data_len 1 - ble_central: eir_found: [AD]: 2 data_len 4 - ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) - ble_central: read_cb: Read err: 5, length 0 diff --git a/app/tests/ble/split/basic/events.patterns b/app/tests/ble/split/basic/events.patterns deleted file mode 100644 index f8cf363c..00000000 --- a/app/tests/ble/split/basic/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p diff --git a/app/tests/ble/split/basic/nrf52_bsim.conf b/app/tests/ble/split/basic/nrf52_bsim.conf deleted file mode 100644 index ea5f08aa..00000000 --- a/app/tests/ble/split/basic/nrf52_bsim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_ZMK_SPLIT=y \ No newline at end of file diff --git a/app/tests/ble/split/basic/nrf52_bsim.keymap b/app/tests/ble/split/basic/nrf52_bsim.keymap deleted file mode 100644 index 0947d14d..00000000 --- a/app/tests/ble/split/basic/nrf52_bsim.keymap +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -&kscan { - /delete-property/ exit-after; - events = <>; -}; -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_CLR>; - }; - }; -}; diff --git a/app/tests/ble/split/basic/peripheral.overlay b/app/tests/ble/split/basic/peripheral.overlay deleted file mode 100644 index 03404758..00000000 --- a/app/tests/ble/split/basic/peripheral.overlay +++ /dev/null @@ -1,12 +0,0 @@ - -#include - - -&kscan { - events = - ; -}; \ No newline at end of file diff --git a/app/tests/ble/split/basic/siblings.txt b/app/tests/ble/split/basic/siblings.txt deleted file mode 100644 index 75959af4..00000000 --- a/app/tests/ble/split/basic/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -./tests_ble_split_basic_peripheral.exe -d=3 diff --git a/app/tests/ble/split/basic/snapshot.log b/app/tests/ble/split/basic/snapshot.log deleted file mode 100644 index 545a0f36..00000000 --- a/app/tests/ble/split/basic/snapshot.log +++ /dev/null @@ -1,26 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -56 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 0 ble_central: discover_conn: [Discovery started for conn] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 0 ble_central: discover_func: [SUBSCRIBED] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 0 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 0 ble_central: notify_func: payload -profile 0 00 00 04 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 05 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/split/multiple-peripherals/events.patterns b/app/tests/ble/split/multiple-peripherals/events.patterns deleted file mode 100644 index f8cf363c..00000000 --- a/app/tests/ble/split/multiple-peripherals/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p diff --git a/app/tests/ble/split/multiple-peripherals/nrf52_bsim.conf b/app/tests/ble/split/multiple-peripherals/nrf52_bsim.conf deleted file mode 100644 index 147866fd..00000000 --- a/app/tests/ble/split/multiple-peripherals/nrf52_bsim.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_ZMK_SPLIT=y -CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS=2 \ No newline at end of file diff --git a/app/tests/ble/split/multiple-peripherals/nrf52_bsim.keymap b/app/tests/ble/split/multiple-peripherals/nrf52_bsim.keymap deleted file mode 100644 index 0947d14d..00000000 --- a/app/tests/ble/split/multiple-peripherals/nrf52_bsim.keymap +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -&kscan { - /delete-property/ exit-after; - events = <>; -}; -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_CLR>; - }; - }; -}; diff --git a/app/tests/ble/split/multiple-peripherals/peripheral1.overlay b/app/tests/ble/split/multiple-peripherals/peripheral1.overlay deleted file mode 100644 index 9ebf63af..00000000 --- a/app/tests/ble/split/multiple-peripherals/peripheral1.overlay +++ /dev/null @@ -1,10 +0,0 @@ - -#include - - -&kscan { - events = - ; -}; \ No newline at end of file diff --git a/app/tests/ble/split/multiple-peripherals/peripheral2.overlay b/app/tests/ble/split/multiple-peripherals/peripheral2.overlay deleted file mode 100644 index 7c851151..00000000 --- a/app/tests/ble/split/multiple-peripherals/peripheral2.overlay +++ /dev/null @@ -1,10 +0,0 @@ - -#include - - -&kscan { - events = - ; -}; \ No newline at end of file diff --git a/app/tests/ble/split/multiple-peripherals/siblings.txt b/app/tests/ble/split/multiple-peripherals/siblings.txt deleted file mode 100644 index cb3c41b4..00000000 --- a/app/tests/ble/split/multiple-peripherals/siblings.txt +++ /dev/null @@ -1,3 +0,0 @@ -./ble_test_central.exe -d=2 -./tests_ble_split_multiple-peripherals_peripheral1.exe -d=3 -./tests_ble_split_multiple-peripherals_peripheral2.exe -d=4 diff --git a/app/tests/ble/split/multiple-peripherals/snapshot.log b/app/tests/ble/split/multiple-peripherals/snapshot.log deleted file mode 100644 index 7c19d59c..00000000 --- a/app/tests/ble/split/multiple-peripherals/snapshot.log +++ /dev/null @@ -1,26 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -55 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 0 ble_central: discover_conn: [Discovery started for conn] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 0 ble_central: discover_func: [SUBSCRIBED] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 0 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 0 ble_central: notify_func: payload -profile 0 00 00 05 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 05 04 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 04 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/split/peripheral-encoder/events.patterns b/app/tests/ble/split/peripheral-encoder/events.patterns deleted file mode 100644 index f8cf363c..00000000 --- a/app/tests/ble/split/peripheral-encoder/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p diff --git a/app/tests/ble/split/peripheral-encoder/nrf52_bsim.conf b/app/tests/ble/split/peripheral-encoder/nrf52_bsim.conf deleted file mode 100644 index ba7e6a1c..00000000 --- a/app/tests/ble/split/peripheral-encoder/nrf52_bsim.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_ZMK_SPLIT=y -CONFIG_SENSOR=y \ No newline at end of file diff --git a/app/tests/ble/split/peripheral-encoder/nrf52_bsim.keymap b/app/tests/ble/split/peripheral-encoder/nrf52_bsim.keymap deleted file mode 100644 index 635b2a25..00000000 --- a/app/tests/ble/split/peripheral-encoder/nrf52_bsim.keymap +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include - -#include "shared.dtsi" - -&kscan { - /delete-property/ exit-after; - events = <>; -}; -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_CLR>; - - sensor-bindings = <&inc_dec_kp A B>; - }; - }; -}; diff --git a/app/tests/ble/split/peripheral-encoder/peripheral.overlay b/app/tests/ble/split/peripheral-encoder/peripheral.overlay deleted file mode 100644 index 145c30e2..00000000 --- a/app/tests/ble/split/peripheral-encoder/peripheral.overlay +++ /dev/null @@ -1,18 +0,0 @@ - -#include - -#include "shared.dtsi" - -&kscan { - events = <>; - - /delete-property/ exit-after; -}; - -&mock_encoder { - status = "okay"; - - event-startup-delay = <2000>; - event-period = <2000>; - events = <18 (-18)>; -}; diff --git a/app/tests/ble/split/peripheral-encoder/shared.dtsi b/app/tests/ble/split/peripheral-encoder/shared.dtsi deleted file mode 100644 index 7ae4eded..00000000 --- a/app/tests/ble/split/peripheral-encoder/shared.dtsi +++ /dev/null @@ -1,12 +0,0 @@ -/ { - mock_encoder: mock_encoder { - compatible = "zmk,sensor-encoder-mock"; - status = "disabled"; - }; - - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&mock_encoder>; - triggers-per-rotation = <20>; - }; -}; \ No newline at end of file diff --git a/app/tests/ble/split/peripheral-encoder/siblings.txt b/app/tests/ble/split/peripheral-encoder/siblings.txt deleted file mode 100644 index 52dfbb78..00000000 --- a/app/tests/ble/split/peripheral-encoder/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -./tests_ble_split_peripheral-encoder_peripheral.exe -d=3 diff --git a/app/tests/ble/split/peripheral-encoder/snapshot.log b/app/tests/ble/split/peripheral-encoder/snapshot.log deleted file mode 100644 index 545a0f36..00000000 --- a/app/tests/ble/split/peripheral-encoder/snapshot.log +++ /dev/null @@ -1,26 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -56 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 0 ble_central: discover_conn: [Discovery started for conn] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 0 ble_central: discover_func: [SUBSCRIBED] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 0 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 0 ble_central: notify_func: payload -profile 0 00 00 04 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 05 00 00 00 00 00 |........ -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 |........ diff --git a/app/tests/ble/split/peripheral-input/events.patterns b/app/tests/ble/split/peripheral-input/events.patterns deleted file mode 100644 index c08c1766..00000000 --- a/app/tests/ble/split/peripheral-input/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p -s/^d_00: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}.*zmk_hid_mouse_button_/mouse button /p diff --git a/app/tests/ble/split/peripheral-input/nrf52_bsim.conf b/app/tests/ble/split/peripheral-input/nrf52_bsim.conf deleted file mode 100644 index 08e4ff08..00000000 --- a/app/tests/ble/split/peripheral-input/nrf52_bsim.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_ZMK_SPLIT=y -CONFIG_ZMK_POINTING=y \ No newline at end of file diff --git a/app/tests/ble/split/peripheral-input/nrf52_bsim.keymap b/app/tests/ble/split/peripheral-input/nrf52_bsim.keymap deleted file mode 100644 index d1a0f3ea..00000000 --- a/app/tests/ble/split/peripheral-input/nrf52_bsim.keymap +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include - -#include "shared.dtsi" - -&kscan { - /delete-property/ exit-after; - events = <>; -}; - -&split_listener { - status = "okay"; -}; -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &bt BT_SEL 0 &bt BT_CLR>; - - sensor-bindings = <&inc_dec_kp A B>; - }; - }; -}; diff --git a/app/tests/ble/split/peripheral-input/peripheral.overlay b/app/tests/ble/split/peripheral-input/peripheral.overlay deleted file mode 100644 index 8f403b5e..00000000 --- a/app/tests/ble/split/peripheral-input/peripheral.overlay +++ /dev/null @@ -1,32 +0,0 @@ - -#include -#include - -#include "shared.dtsi" - -&kscan { - events = <>; - - /delete-property/ exit-after; -}; - -/ { - mock_input: mock_input { - compatible = "zmk,input-mock"; - status = "okay"; - event-startup-delay = <4000>; - event-period = <2000>; - events - = - , - , - , - , - ; - exit-after; - }; -}; - -&split_input { - device = <&mock_input>; -}; diff --git a/app/tests/ble/split/peripheral-input/shared.dtsi b/app/tests/ble/split/peripheral-input/shared.dtsi deleted file mode 100644 index 3a31a28f..00000000 --- a/app/tests/ble/split/peripheral-input/shared.dtsi +++ /dev/null @@ -1,16 +0,0 @@ -/ { - splits { - #address-cells = <1>; - #size-cells = <0>; - split_input: split_input@0 { - compatible = "zmk,input-split"; - reg = <0>; - }; - }; - - split_listener: split_listener { - compatible = "zmk,input-listener"; - status = "disabled"; - device = <&split_input>; - }; -}; \ No newline at end of file diff --git a/app/tests/ble/split/peripheral-input/siblings.txt b/app/tests/ble/split/peripheral-input/siblings.txt deleted file mode 100644 index 16ee6097..00000000 --- a/app/tests/ble/split/peripheral-input/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -subscribe_to_pointer_report -./tests_ble_split_peripheral-input_peripheral.exe -d=3 diff --git a/app/tests/ble/split/peripheral-input/snapshot.log b/app/tests/ble/split/peripheral-input/snapshot.log deleted file mode 100644 index a31d449d..00000000 --- a/app/tests/ble/split/peripheral-input/snapshot.log +++ /dev/null @@ -1,35 +0,0 @@ -profile 0 bt_id: No static addresses stored in controller -profile 0 ble_central: main: [Bluetooth initialized] -profile 0 ble_central: start_scan: [Scanning successfully started] -profile 0 ble_central: device_found: [DEVICE]: FD:9E:B2:48:47:39 (random), AD evt type 0, AD data len 15, RSSI -56 -profile 0 ble_central: eir_found: [AD]: 25 data_len 2 -profile 0 ble_central: eir_found: [AD]: 1 data_len 1 -profile 0 ble_central: eir_found: [AD]: 2 data_len 4 -profile 0 ble_central: connected: [Connected]: FD:9E:B2:48:47:39 (random) -profile 0 ble_central: connected: [Setting the security for the connection] -profile 0 ble_central: pairing_complete: Pairing complete -profile 0 ble_central: discover_conn: [Discovery started for conn] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 23 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 28 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 30 -profile 0 ble_central: discover_func: [SUBSCRIBED] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 32 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 34 -profile 0 ble_central: discover_func: [CONSUMER SUBSCRIBED] -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 36 -profile 0 ble_central: discover_func: [ATTRIBUTE] handle 38 -profile 0 ble_central: discover_func: [MOUSE SUBSCRIBED] -profile 0 ble_central: discover_func: [Discover complete] -profile 0 ble_central: notify_func: payload -profile 0 00 64 00 64 00 00 00 00 00 |.d.d.... . -profile 0 ble_central: notify_func: payload -profile 0 00 28 00 32 00 00 00 00 00 |.(.2.... . -mouse button press: Button 1 count 1 -mouse button press: Mouse buttons set to 0x02 -profile 0 ble_central: notify_func: payload -profile 0 02 00 00 00 00 00 00 00 00 |........ . -mouse button release: Button 1 count: 0 -mouse button release: Button 1 released -mouse button release: Mouse buttons set to 0x00 -profile 0 ble_central: notify_func: payload -profile 0 00 00 00 00 00 00 00 00 00 |........ . diff --git a/app/tests/ble/split/run-peripheral-behavior/events.patterns b/app/tests/ble/split/run-peripheral-behavior/events.patterns deleted file mode 100644 index 01188623..00000000 --- a/app/tests/ble/split/run-peripheral-behavior/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_03: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/peripheral 0 /p diff --git a/app/tests/ble/split/run-peripheral-behavior/nrf52_bsim.conf b/app/tests/ble/split/run-peripheral-behavior/nrf52_bsim.conf deleted file mode 100644 index 0155316d..00000000 --- a/app/tests/ble/split/run-peripheral-behavior/nrf52_bsim.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_BOOT_BANNER=n -CONFIG_ZMK_SPLIT=y diff --git a/app/tests/ble/split/run-peripheral-behavior/nrf52_bsim.keymap b/app/tests/ble/split/run-peripheral-behavior/nrf52_bsim.keymap deleted file mode 100644 index fd6fa9d9..00000000 --- a/app/tests/ble/split/run-peripheral-behavior/nrf52_bsim.keymap +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -&kscan { - /delete-property/ exit-after; - events = <>; -}; -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &kp C &sys_reset>; - }; - }; -}; diff --git a/app/tests/ble/split/run-peripheral-behavior/peripheral.overlay b/app/tests/ble/split/run-peripheral-behavior/peripheral.overlay deleted file mode 100644 index 82a3f777..00000000 --- a/app/tests/ble/split/run-peripheral-behavior/peripheral.overlay +++ /dev/null @@ -1,10 +0,0 @@ - -#include - - -&kscan { - events = - ; -}; \ No newline at end of file diff --git a/app/tests/ble/split/run-peripheral-behavior/siblings.txt b/app/tests/ble/split/run-peripheral-behavior/siblings.txt deleted file mode 100644 index ed3f46f1..00000000 --- a/app/tests/ble/split/run-peripheral-behavior/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -./tests_ble_split_run-peripheral-behavior_peripheral.exe -d=3 diff --git a/app/tests/ble/split/run-peripheral-behavior/snapshot.log b/app/tests/ble/split/run-peripheral-behavior/snapshot.log deleted file mode 100644 index 2289d9c1..00000000 --- a/app/tests/ble/split/run-peripheral-behavior/snapshot.log +++ /dev/null @@ -1,24 +0,0 @@ -peripheral 0 bt_hci_core: HW Platform: Nordic Semiconductor (0x0002) -peripheral 0 bt_hci_core: HW Variant: nRF52x (0x0002) -peripheral 0 bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 4.1 Build 0 -peripheral 0 bt_id: No static addresses stored in controller -peripheral 0 bt_hci_core: Identity: D1:0B:03:A3:ED:6F (random) -peripheral 0 bt_hci_core: HCI: version 5.4 (0x0d) revision 0x0000, manufacturer 0x05f1 -peripheral 0 bt_hci_core: LMP: version 5.4 (0x0d) subver 0xffff -peripheral 0 zmk: kscan_mock_schedule_next_event_0: delaying next keypress: 5000 -peripheral 0 zmk: Welcome to ZMK! -peripheral 0 zmk: security_changed: Security changed: FD:9E:B2:48:47:39 (random) level 2 -peripheral 0 zmk: split_svc_pos_state_ccc: value 1 -peripheral 0 zmk: split_svc_select_phys_layout_callback: Selecting physical layout after GATT write of 0 -peripheral 0 zmk: kscan_mock_work_handler_0: ev 327680000 row 0 column 0 state 0 -peripheral 0 zmk: kscan_mock_schedule_next_event_0: delaying next keypress: 5000 -peripheral 0 zmk: zmk_physical_layouts_kscan_process_msgq: Row: 0, col: 0, position: 0, pressed: false -peripheral 0 zmk: split_peripheral_listener: -peripheral 0 zmk: kscan_mock_work_handler_0: ev 2475163905 row 1 column 1 state 1 -peripheral 0 zmk: kscan_mock_schedule_next_event_0: delaying next keypress: 5000 -peripheral 0 zmk: zmk_physical_layouts_kscan_process_msgq: Row: 1, col: 1, position: 3, pressed: true -peripheral 0 zmk: split_peripheral_listener: -peripheral 0 zmk: split_svc_run_behavior: offset 0 len 20 -peripheral 0 zmk: split_svc_run_behavior: sysreset with params 0 0: pressed? 1 -peripheral 0 zmk: zmk_split_transport_peripheral_command_handler: -peripheral 0 zmk: zmk_split_transport_peripheral_command_handler: sysreset with params 0 0: pressed? 1 diff --git a/app/tests/ble/split/set-hid-indicators/events.patterns b/app/tests/ble/split/set-hid-indicators/events.patterns deleted file mode 100644 index 01188623..00000000 --- a/app/tests/ble/split/set-hid-indicators/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/^d_03: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/peripheral 0 /p diff --git a/app/tests/ble/split/set-hid-indicators/nrf52_bsim.conf b/app/tests/ble/split/set-hid-indicators/nrf52_bsim.conf deleted file mode 100644 index 3b0069b4..00000000 --- a/app/tests/ble/split/set-hid-indicators/nrf52_bsim.conf +++ /dev/null @@ -1,4 +0,0 @@ -CONFIG_BOOT_BANNER=n -CONFIG_ZMK_SPLIT=y -CONFIG_ZMK_HID_INDICATORS=y -CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS=y diff --git a/app/tests/ble/split/set-hid-indicators/nrf52_bsim.keymap b/app/tests/ble/split/set-hid-indicators/nrf52_bsim.keymap deleted file mode 100644 index 5390dab8..00000000 --- a/app/tests/ble/split/set-hid-indicators/nrf52_bsim.keymap +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -&kscan { - /delete-property/ exit-after; - events = <>; -}; -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D>; - }; - }; -}; diff --git a/app/tests/ble/split/set-hid-indicators/peripheral.overlay b/app/tests/ble/split/set-hid-indicators/peripheral.overlay deleted file mode 100644 index f8617952..00000000 --- a/app/tests/ble/split/set-hid-indicators/peripheral.overlay +++ /dev/null @@ -1,8 +0,0 @@ - -#include - - -&kscan { - /delete-property/ exit-after; - events = <>; -}; \ No newline at end of file diff --git a/app/tests/ble/split/set-hid-indicators/siblings.txt b/app/tests/ble/split/set-hid-indicators/siblings.txt deleted file mode 100644 index 37f5f4d4..00000000 --- a/app/tests/ble/split/set-hid-indicators/siblings.txt +++ /dev/null @@ -1,2 +0,0 @@ -./ble_test_central.exe -d=2 -wait_on_start=1300 -write_hid_indicators_on_discovery -./tests_ble_split_set-hid-indicators_peripheral.exe -d=3 diff --git a/app/tests/ble/split/set-hid-indicators/snapshot.log b/app/tests/ble/split/set-hid-indicators/snapshot.log deleted file mode 100644 index 580c139e..00000000 --- a/app/tests/ble/split/set-hid-indicators/snapshot.log +++ /dev/null @@ -1,13 +0,0 @@ -peripheral 0 bt_hci_core: HW Platform: Nordic Semiconductor (0x0002) -peripheral 0 bt_hci_core: HW Variant: nRF52x (0x0002) -peripheral 0 bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 4.1 Build 0 -peripheral 0 bt_id: No static addresses stored in controller -peripheral 0 bt_hci_core: Identity: D1:0B:03:A3:ED:6F (random) -peripheral 0 bt_hci_core: HCI: version 5.4 (0x0d) revision 0x0000, manufacturer 0x05f1 -peripheral 0 bt_hci_core: LMP: version 5.4 (0x0d) subver 0xffff -peripheral 0 zmk: Welcome to ZMK! -peripheral 0 zmk: security_changed: Security changed: FD:9E:B2:48:47:39 (random) level 2 -peripheral 0 zmk: split_svc_pos_state_ccc: value 1 -peripheral 0 zmk: split_svc_select_phys_layout_callback: Selecting physical layout after GATT write of 0 -peripheral 0 zmk: split_svc_update_indicators_callback: Raising HID indicators changed event: 0 -peripheral 0 zmk: split_svc_update_indicators_callback: Raising HID indicators changed event: 7 diff --git a/app/tests/caps-word/behavior_keymap.dtsi b/app/tests/caps-word/behavior_keymap.dtsi index 2e404afb..855406fc 100644 --- a/app/tests/caps-word/behavior_keymap.dtsi +++ b/app/tests/caps-word/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/caps-word/continue-with-modifiers/native_sim.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap similarity index 95% rename from app/tests/caps-word/continue-with-modifiers/native_sim.keymap rename to app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap index fe5360e6..bbbdac10 100644 --- a/app/tests/caps-word/continue-with-modifiers/native_sim.keymap +++ b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap @@ -6,6 +6,7 @@ / { keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_sim.keymap b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_sim.keymap rename to app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap diff --git a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_sim.keymap b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_sim.keymap rename to app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_sim.keymap b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_sim.keymap rename to app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap diff --git a/app/tests/toggle-layer/normal/native_sim.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap similarity index 100% rename from app/tests/toggle-layer/normal/native_sim.keymap rename to app/tests/caps-word/deactivate-by-second-press/native_posix.keymap index 8f0124db..121a827c 100644 --- a/app/tests/toggle-layer/normal/native_sim.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap @@ -5,13 +5,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_sim.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/deactivate-by-second-press/native_sim.keymap rename to app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap diff --git a/app/tests/combo/combos-and-holdtaps-0/native_sim.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap similarity index 96% rename from app/tests/combo/combos-and-holdtaps-0/native_sim.keymap rename to app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index 6f9f9860..3438f9bc 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_sim.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -24,6 +24,7 @@ first so the decision to hold or tap can be made. keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/combos-and-holdtaps-1/native_sim.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap similarity index 96% rename from app/tests/combo/combos-and-holdtaps-1/native_sim.keymap rename to app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index 0982d34b..9120e8c3 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_sim.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -19,6 +19,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/combos-and-holdtaps-2/native_sim.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap similarity index 96% rename from app/tests/combo/combos-and-holdtaps-2/native_sim.keymap rename to app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap index 6feebf2f..a227fe4c 100644 --- a/app/tests/combo/combos-and-holdtaps-2/native_sim.keymap +++ b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap @@ -26,6 +26,7 @@ keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/combos-and-holdtaps-3/native_sim.keymap b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap similarity index 95% rename from app/tests/combo/combos-and-holdtaps-3/native_sim.keymap rename to app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap index fbbd7a9e..4fbf2407 100644 --- a/app/tests/combo/combos-and-holdtaps-3/native_sim.keymap +++ b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap @@ -18,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/combos-and-holdtaps-4/native_sim.keymap b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap similarity index 96% rename from app/tests/combo/combos-and-holdtaps-4/native_sim.keymap rename to app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap index b3e987cf..59f4391f 100644 --- a/app/tests/combo/combos-and-holdtaps-4/native_sim.keymap +++ b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap @@ -22,6 +22,7 @@ ZMK_COMBO(tilde, &kp TILDE, 3 4, 50) / { keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/layer-filter-0/native_sim.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap similarity index 98% rename from app/tests/combo/layer-filter-0/native_sim.keymap rename to app/tests/combo/layer-filter-0/native_posix_64.keymap index 12946183..68077849 100644 --- a/app/tests/combo/layer-filter-0/native_sim.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -31,6 +31,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/layer-filter-1/native_sim.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap similarity index 96% rename from app/tests/combo/layer-filter-1/native_sim.keymap rename to app/tests/combo/layer-filter-1/native_posix_64.keymap index 6d4a3021..a11b86ad 100644 --- a/app/tests/combo/layer-filter-1/native_sim.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -18,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/multiple-timeouts/native_sim.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap similarity index 95% rename from app/tests/combo/multiple-timeouts/native_sim.keymap rename to app/tests/combo/multiple-timeouts/native_posix_64.keymap index 0e3ae996..a2edc32f 100644 --- a/app/tests/combo/multiple-timeouts/native_sim.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -19,6 +19,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/overlapping-combos-0/native_sim.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap similarity index 98% rename from app/tests/combo/overlapping-combos-0/native_sim.keymap rename to app/tests/combo/overlapping-combos-0/native_posix_64.keymap index a9a229fb..e89a3f22 100644 --- a/app/tests/combo/overlapping-combos-0/native_sim.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -37,6 +37,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/overlapping-combos-1/native_sim.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap similarity index 97% rename from app/tests/combo/overlapping-combos-1/native_sim.keymap rename to app/tests/combo/overlapping-combos-1/native_posix_64.keymap index f3b0ab97..4b0166be 100644 --- a/app/tests/combo/overlapping-combos-1/native_sim.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -26,6 +26,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/overlapping-combos-2/native_sim.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap similarity index 97% rename from app/tests/combo/overlapping-combos-2/native_sim.keymap rename to app/tests/combo/overlapping-combos-2/native_posix_64.keymap index beed222e..5c38bcfc 100644 --- a/app/tests/combo/overlapping-combos-2/native_sim.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -27,6 +27,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/overlapping-combos-3/native_sim.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap similarity index 97% rename from app/tests/combo/overlapping-combos-3/native_sim.keymap rename to app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 2e7e4225..48e3397f 100644 --- a/app/tests/combo/overlapping-combos-3/native_sim.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -28,6 +28,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/native_sim.keymap b/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap similarity index 98% rename from app/tests/combo/overlapping-combos-4-different-timeouts/native_sim.keymap rename to app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap index 06a67b88..89672079 100644 --- a/app/tests/combo/overlapping-combos-4-different-timeouts/native_sim.keymap +++ b/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap @@ -32,6 +32,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/partially-overlapping-combos/native_sim.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap similarity index 98% rename from app/tests/combo/partially-overlapping-combos/native_sim.keymap rename to app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index d3151382..55e8f1e7 100644 --- a/app/tests/combo/partially-overlapping-combos/native_sim.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -26,6 +26,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press-release-long-combo-complete/native_sim.keymap b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap similarity index 95% rename from app/tests/combo/press-release-long-combo-complete/native_sim.keymap rename to app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap index 85cb6475..da2e9483 100644 --- a/app/tests/combo/press-release-long-combo-complete/native_sim.keymap +++ b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap @@ -14,6 +14,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_sim.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap similarity index 95% rename from app/tests/combo/press-release-long-combo-incomplete/native_sim.keymap rename to app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index 49b92968..b1494cec 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_sim.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -14,6 +14,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_sim.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap similarity index 95% rename from app/tests/combo/press-release-long-combo-wrong-last-key/native_sim.keymap rename to app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap index 61787322..87692864 100644 --- a/app/tests/combo/press-release-long-combo-wrong-last-key/native_sim.keymap +++ b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap @@ -14,6 +14,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press-release/native_sim.keymap b/app/tests/combo/press-release/native_posix_64.keymap similarity index 97% rename from app/tests/combo/press-release/native_sim.keymap rename to app/tests/combo/press-release/native_posix_64.keymap index 783dcf00..26cd241b 100644 --- a/app/tests/combo/press-release/native_sim.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -14,6 +14,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press-timeout/native_sim.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap similarity index 95% rename from app/tests/combo/press-timeout/native_sim.keymap rename to app/tests/combo/press-timeout/native_posix_64.keymap index c9cd2331..a71de45a 100644 --- a/app/tests/combo/press-timeout/native_sim.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -14,6 +14,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press1-press2-release1-release2/native_sim.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap similarity index 96% rename from app/tests/combo/press1-press2-release1-release2/native_sim.keymap rename to app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index 55d93823..2e0a67a3 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_sim.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -20,6 +20,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/press1-release1-press2-release2/native_sim.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap similarity index 96% rename from app/tests/combo/press1-release1-press2-release2/native_sim.keymap rename to app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 8b59792b..8d4838eb 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_sim.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -20,6 +20,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < @@ -34,12 +35,12 @@ events = < ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_sim.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap similarity index 96% rename from app/tests/combo/press1-press2-release2-release1/native_sim.keymap rename to app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index ace63a16..9c75e570 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_sim.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -20,6 +20,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < @@ -34,12 +35,12 @@ events = < ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) + + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/require-prior-idle/native_sim.keymap b/app/tests/combo/require-prior-idle/native_posix_64.keymap similarity index 97% rename from app/tests/combo/require-prior-idle/native_sim.keymap rename to app/tests/combo/require-prior-idle/native_posix_64.keymap index 72801f74..fcd94056 100644 --- a/app/tests/combo/require-prior-idle/native_sim.keymap +++ b/app/tests/combo/require-prior-idle/native_posix_64.keymap @@ -21,6 +21,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/slowrelease-disabled/native_sim.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap similarity index 95% rename from app/tests/combo/slowrelease-disabled/native_sim.keymap rename to app/tests/combo/slowrelease-disabled/native_posix_64.keymap index cfea0cd6..46b35be0 100644 --- a/app/tests/combo/slowrelease-disabled/native_sim.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -15,6 +15,7 @@ keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/combo/slowrelease-enabled/native_sim.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap similarity index 95% rename from app/tests/combo/slowrelease-enabled/native_sim.keymap rename to app/tests/combo/slowrelease-enabled/native_posix_64.keymap index e57bae60..d64876da 100644 --- a/app/tests/combo/slowrelease-enabled/native_sim.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -15,6 +15,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/conditional-layer/chained-activation/native_sim.keymap b/app/tests/conditional-layer/chained-activation/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/chained-activation/native_sim.keymap rename to app/tests/conditional-layer/chained-activation/native_posix_64.keymap diff --git a/app/tests/conditional-layer/locked-layers-2/events.patterns b/app/tests/conditional-layer/locked-layers-2/events.patterns deleted file mode 100644 index 30bd2338..00000000 --- a/app/tests/conditional-layer/locked-layers-2/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*tog_keymap_binding/tog/p -s/.*conditional_layer/cl/p diff --git a/app/tests/conditional-layer/locked-layers-2/keycode_events.snapshot b/app/tests/conditional-layer/locked-layers-2/keycode_events.snapshot deleted file mode 100644 index 1bd77bd9..00000000 --- a/app/tests/conditional-layer/locked-layers-2/keycode_events.snapshot +++ /dev/null @@ -1,17 +0,0 @@ -kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 2 layer 1 -tog_released: position 2 layer 1 -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -mo_pressed: position 3 layer 2 -cl_activate: layer 3 -kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 1 layer 3 -tog_released: position 1 layer 3 -kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -mo_released: position 3 layer 2 -kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/conditional-layer/locked-layers-2/native_posix_64.keymap b/app/tests/conditional-layer/locked-layers-2/native_posix_64.keymap deleted file mode 100644 index aa17e285..00000000 --- a/app/tests/conditional-layer/locked-layers-2/native_posix_64.keymap +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -&tog { - toggle-mode = "on"; -}; - -/ { - conditional_layers { - compatible = "zmk,conditional-layers"; - tri_layer { - if-layers = <1 2>; - then-layer = <3>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp A &tog 3 - &tog 1 &mo 2 - >; - }; - layer_1 { - bindings = < - &kp B &trans - &trans &trans - >; - }; - layer_2 { - bindings = < - &kp C &trans - &trans &trans - >; - }; - layer_3 { - bindings = < - &kp D &trans - &trans &trans - >; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/conditional-layer/locked-layers/events.patterns b/app/tests/conditional-layer/locked-layers/events.patterns deleted file mode 100644 index 30bd2338..00000000 --- a/app/tests/conditional-layer/locked-layers/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*tog_keymap_binding/tog/p -s/.*conditional_layer/cl/p diff --git a/app/tests/conditional-layer/locked-layers/keycode_events.snapshot b/app/tests/conditional-layer/locked-layers/keycode_events.snapshot deleted file mode 100644 index 4afa80c0..00000000 --- a/app/tests/conditional-layer/locked-layers/keycode_events.snapshot +++ /dev/null @@ -1,20 +0,0 @@ -kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 2 layer 1 -tog_released: position 2 layer 1 -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 3 layer 2 -cl_activate: layer 3 -tog_released: position 3 layer 2 -kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -mo_pressed: position 1 layer 3 -mo_released: position 1 layer 3 -kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 2 layer 1 -cl_deactivate: layer 3 -tog_released: position 2 layer 1 -kp_pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/conditional-layer/locked-layers/native_posix_64.keymap b/app/tests/conditional-layer/locked-layers/native_posix_64.keymap deleted file mode 100644 index 5c6c15db..00000000 --- a/app/tests/conditional-layer/locked-layers/native_posix_64.keymap +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include - -/ { - conditional_layers { - compatible = "zmk,conditional-layers"; - tri_layer { - if-layers = <1 2>; - then-layer = <3>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp A &mo 3 - &tog 1 &tog 2 - >; - }; - layer_1 { - bindings = < - &kp B &trans - &trans &trans - >; - }; - layer_2 { - bindings = < - &kp C &trans - &trans &trans - >; - }; - layer_3 { - bindings = < - &kp D &trans - &trans &trans - >; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/conditional-layer/mo-overlap/native_sim.keymap b/app/tests/conditional-layer/mo-overlap/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/mo-overlap/native_sim.keymap rename to app/tests/conditional-layer/mo-overlap/native_posix_64.keymap diff --git a/app/tests/conditional-layer/multiple-configs/native_sim.keymap b/app/tests/conditional-layer/multiple-configs/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/multiple-configs/native_sim.keymap rename to app/tests/conditional-layer/multiple-configs/native_posix_64.keymap diff --git a/app/tests/conditional-layer/quad-layer/native_sim.keymap b/app/tests/conditional-layer/quad-layer/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/quad-layer/native_sim.keymap rename to app/tests/conditional-layer/quad-layer/native_posix_64.keymap diff --git a/app/tests/conditional-layer/same-layer-reached-both-ways/native_sim.keymap b/app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/same-layer-reached-both-ways/native_sim.keymap rename to app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap diff --git a/app/tests/conditional-layer/same-layer-reached-differently/native_sim.keymap b/app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/same-layer-reached-differently/native_sim.keymap rename to app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap diff --git a/app/tests/conditional-layer/tri-layer-alt-order/native_sim.keymap b/app/tests/conditional-layer/tri-layer-alt-order/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer-alt-order/native_sim.keymap rename to app/tests/conditional-layer/tri-layer-alt-order/native_posix_64.keymap diff --git a/app/tests/conditional-layer/tri-layer-lt/native_sim.keymap b/app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer-lt/native_sim.keymap rename to app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap diff --git a/app/tests/conditional-layer/tri-layer/native_sim.keymap b/app/tests/conditional-layer/tri-layer/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer/native_sim.keymap rename to app/tests/conditional-layer/tri-layer/native_posix_64.keymap diff --git a/app/tests/encoders/behavior_keymap.dtsi b/app/tests/encoders/behavior_keymap.dtsi deleted file mode 100644 index 6ac37f01..00000000 --- a/app/tests/encoders/behavior_keymap.dtsi +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &tog 2 &kp X - &tog 1 &none - >; - sensor-bindings = <&inc_dec_kp A B>; - }; - skip_layer { - bindings = < - &trans &kp Y - &none &none - >; - sensor-bindings = <&inc_dec_kp N M>; - }; - alt_layer { - bindings = < - &trans &kp Z - &none &none - >; - sensor-bindings = <&inc_dec_kp C D>; - }; - }; - - mock_encoder: mock_encoder { - compatible = "zmk,sensor-encoder-mock"; - status = "okay"; - event-startup-delay = <200>; - event-period = <200>; - }; - - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&mock_encoder>; - triggers-per-rotation = <20>; - }; -}; \ No newline at end of file diff --git a/app/tests/encoders/layers-1/events.patterns b/app/tests/encoders/layers-1/events.patterns deleted file mode 100644 index 517ae5a2..00000000 --- a/app/tests/encoders/layers-1/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/.*hid_listener_keycode_//p -s/.*layer_changed/layer_changed/p \ No newline at end of file diff --git a/app/tests/encoders/layers-1/keycode_events.snapshot b/app/tests/encoders/layers-1/keycode_events.snapshot deleted file mode 100644 index 0adde28b..00000000 --- a/app/tests/encoders/layers-1/keycode_events.snapshot +++ /dev/null @@ -1,3 +0,0 @@ -layer_changed: layer 2 state 1 locked 1 -pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/encoders/layers-1/native_sim.keymap b/app/tests/encoders/layers-1/native_sim.keymap deleted file mode 100644 index 6996f551..00000000 --- a/app/tests/encoders/layers-1/native_sim.keymap +++ /dev/null @@ -1,11 +0,0 @@ -#include "../behavior_keymap.dtsi" - -&kscan { - events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,8000) - >; -}; - -&mock_encoder { - events = <18>; -}; diff --git a/app/tests/encoders/layers-2/events.patterns b/app/tests/encoders/layers-2/events.patterns deleted file mode 100644 index 517ae5a2..00000000 --- a/app/tests/encoders/layers-2/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/.*hid_listener_keycode_//p -s/.*layer_changed/layer_changed/p \ No newline at end of file diff --git a/app/tests/encoders/layers-2/keycode_events.snapshot b/app/tests/encoders/layers-2/keycode_events.snapshot deleted file mode 100644 index 38cbe27d..00000000 --- a/app/tests/encoders/layers-2/keycode_events.snapshot +++ /dev/null @@ -1,4 +0,0 @@ -layer_changed: layer 1 state 1 locked 1 -layer_changed: layer 2 state 1 locked 1 -pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/encoders/layers-2/native_sim.keymap b/app/tests/encoders/layers-2/native_sim.keymap deleted file mode 100644 index 7b7fbdb2..00000000 --- a/app/tests/encoders/layers-2/native_sim.keymap +++ /dev/null @@ -1,11 +0,0 @@ -#include "../behavior_keymap.dtsi" - -&kscan { - events = < ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,8000) - >; -}; - -&mock_encoder { - events = <18>; -}; diff --git a/app/tests/encoders/rotate/events.patterns b/app/tests/encoders/rotate/events.patterns deleted file mode 100644 index 833100f6..00000000 --- a/app/tests/encoders/rotate/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/encoders/rotate/keycode_events.snapshot b/app/tests/encoders/rotate/keycode_events.snapshot deleted file mode 100644 index b809163d..00000000 --- a/app/tests/encoders/rotate/keycode_events.snapshot +++ /dev/null @@ -1,4 +0,0 @@ -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/encoders/rotate/native_sim.keymap b/app/tests/encoders/rotate/native_sim.keymap deleted file mode 100644 index 883352e7..00000000 --- a/app/tests/encoders/rotate/native_sim.keymap +++ /dev/null @@ -1,10 +0,0 @@ -#include "../behavior_keymap.dtsi" - -&kscan { - events = < ZMK_MOCK_PRESS(1,1,1000) - >; -}; - -&mock_encoder { - events = <18 (-18)>; -}; diff --git a/app/tests/gresc/gresc-press-release/native_sim.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap similarity index 96% rename from app/tests/gresc/gresc-press-release/native_sim.keymap rename to app/tests/gresc/gresc-press-release/native_posix_64.keymap index 5280543d..c472dd6d 100644 --- a/app/tests/gresc/gresc-press-release/native_sim.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/gresc/gresc-two-instances/native_sim.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap similarity index 97% rename from app/tests/gresc/gresc-two-instances/native_sim.keymap rename to app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 5cb0695c..14adcf45 100644 --- a/app/tests/gresc/gresc-two-instances/native_sim.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -13,6 +13,7 @@ The first gresc that is released releases the key. / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_sim.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/1-dn-up/native_sim.keymap rename to app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_sim.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_sim.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_sim.keymap rename to app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_sim.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_sim.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_sim.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_sim.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_sim.keymap b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_sim.keymap rename to app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_sim.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/5-quick-tap/native_sim.keymap rename to app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_sim.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap similarity index 89% rename from app/tests/hold-tap/balanced/6-retro-tap/native_sim.keymap rename to app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index c820d191..51995f8d 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_sim.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -6,9 +6,10 @@ behaviors { ht_bal: behavior_balanced { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "balanced"; - tapping-term-ms = <300>; + tapping_term_ms = <300>; bindings = <&kp>, <&kp>; retro-tap; }; @@ -16,6 +17,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi index 9acf5a1b..c750f8e3 100644 --- a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { ht_bal: behavior_hold_tap_balanced { compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; #binding-cells = <2>; flavor = "balanced"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_sim.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_sim.keymap rename to app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_sim.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_sim.keymap rename to app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap rename to app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_sim.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_sim.keymap rename to app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_sim.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_sim.keymap rename to app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi index 0bcb27c5..670bdcc2 100644 --- a/app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { ht_bal: behavior_balanced { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "balanced"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/balanced/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/behavior_keymap.dtsi index 350dfaf3..9f338ebc 100644 --- a/app/tests/hold-tap/balanced/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { ht_bal: behavior_hold_tap_balanced { compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; #binding-cells = <2>; flavor = "balanced"; tapping-term-ms = <300>; @@ -16,6 +17,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/balanced/many-nested/native_sim.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap similarity index 92% rename from app/tests/hold-tap/balanced/many-nested/native_sim.keymap rename to app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index cfbb128f..4bac8b83 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_sim.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -6,6 +6,7 @@ behaviors { ht_bal: behavior_hold_tap_balanced { compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; #binding-cells = <2>; flavor = "balanced"; tapping-term-ms = <300>; @@ -15,6 +16,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/1-dn-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_sim.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/5-quick-tap/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_sim.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap similarity index 89% rename from app/tests/hold-tap/hold-preferred/6-retro-tap/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index 0b80ea95..8dbc7d82 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_sim.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -6,9 +6,10 @@ behaviors { hp: behavior_hold_preferred { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "hold-preferred"; - tapping-term-ms = <300>; + tapping_term_ms = <300>; bindings = <&kp>, <&kp>; retro-tap; }; @@ -16,6 +17,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi index 65e7f9aa..71f3aba5 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { ht_hold: behavior_hold_hold_tap { compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; #binding-cells = <2>; flavor = "hold-preferred"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_sim.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_sim.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_sim.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi index bdc6838a..a99eb3f5 100644 --- a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { hp: behavior_hold_preferred { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "hold-preferred"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi index 702a96b4..da6b8362 100644 --- a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi @@ -8,6 +8,7 @@ behaviors { ht_hold: behavior_hold_hold_tap { compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; #binding-cells = <2>; flavor = "hold-preferred"; tapping-term-ms = <300>; @@ -18,6 +19,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/hold-while-undecided/1-tap/events.patterns b/app/tests/hold-tap/hold-while-undecided/1-tap/events.patterns deleted file mode 100644 index fdf2b15c..00000000 --- a/app/tests/hold-tap/hold-while-undecided/1-tap/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*on_hold_tap_binding/ht_binding/p -s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-while-undecided/1-tap/keycode_events.snapshot b/app/tests/hold-tap/hold-while-undecided/1-tap/keycode_events.snapshot deleted file mode 100644 index 7cbc8268..00000000 --- a/app/tests/hold-tap/hold-while-undecided/1-tap/keycode_events.snapshot +++ /dev/null @@ -1,8 +0,0 @@ -ht_binding_pressed: 0 new undecided hold_tap -ht_decide: 0 hold behavior pressed while undecided -kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_decide: 0 decided tap (balanced decision moment key-up) -kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-while-undecided/1-tap/native_sim.keymap b/app/tests/hold-tap/hold-while-undecided/1-tap/native_sim.keymap deleted file mode 100644 index 5f42c30c..00000000 --- a/app/tests/hold-tap/hold-while-undecided/1-tap/native_sim.keymap +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-while-undecided; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &ht_bal LEFT_SHIFT A &ht_bal LEFT_CONTROL B - &kp D &kp RIGHT_CONTROL>; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/hold-tap/hold-while-undecided/2-hold/events.patterns b/app/tests/hold-tap/hold-while-undecided/2-hold/events.patterns deleted file mode 100644 index fdf2b15c..00000000 --- a/app/tests/hold-tap/hold-while-undecided/2-hold/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*on_hold_tap_binding/ht_binding/p -s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-while-undecided/2-hold/keycode_events.snapshot b/app/tests/hold-tap/hold-while-undecided/2-hold/keycode_events.snapshot deleted file mode 100644 index d9eed612..00000000 --- a/app/tests/hold-tap/hold-while-undecided/2-hold/keycode_events.snapshot +++ /dev/null @@ -1,6 +0,0 @@ -ht_binding_pressed: 0 new undecided hold_tap -ht_decide: 0 hold behavior pressed while undecided -kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-while-undecided/2-hold/native_sim.keymap b/app/tests/hold-tap/hold-while-undecided/2-hold/native_sim.keymap deleted file mode 100644 index 381a7414..00000000 --- a/app/tests/hold-tap/hold-while-undecided/2-hold/native_sim.keymap +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <100>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-while-undecided; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &ht_bal LEFT_SHIFT A &ht_bal LEFT_CONTROL B - &kp D &kp RIGHT_CONTROL>; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,150) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/hold-tap/hold-while-undecided/3-linger/events.patterns b/app/tests/hold-tap/hold-while-undecided/3-linger/events.patterns deleted file mode 100644 index fdf2b15c..00000000 --- a/app/tests/hold-tap/hold-while-undecided/3-linger/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*on_hold_tap_binding/ht_binding/p -s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-while-undecided/3-linger/keycode_events.snapshot b/app/tests/hold-tap/hold-while-undecided/3-linger/keycode_events.snapshot deleted file mode 100644 index 55c9bb32..00000000 --- a/app/tests/hold-tap/hold-while-undecided/3-linger/keycode_events.snapshot +++ /dev/null @@ -1,8 +0,0 @@ -ht_binding_pressed: 0 new undecided hold_tap -ht_decide: 0 hold behavior pressed while undecided -kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_decide: 0 decided tap (balanced decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-while-undecided/3-linger/native_sim.keymap b/app/tests/hold-tap/hold-while-undecided/3-linger/native_sim.keymap deleted file mode 100644 index 0a296b70..00000000 --- a/app/tests/hold-tap/hold-while-undecided/3-linger/native_sim.keymap +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <100>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - hold-while-undecided; - hold-while-undecided-linger; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &ht_bal LEFT_SHIFT A &ht_bal LEFT_CONTROL B - &kp D &kp RIGHT_CONTROL>; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/events.patterns b/app/tests/hold-tap/hold-while-undecided/4-linger-sk/events.patterns deleted file mode 100644 index fdf2b15c..00000000 --- a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*on_hold_tap_binding/ht_binding/p -s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/keycode_events.snapshot b/app/tests/hold-tap/hold-while-undecided/4-linger-sk/keycode_events.snapshot deleted file mode 100644 index 74f88195..00000000 --- a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/keycode_events.snapshot +++ /dev/null @@ -1,7 +0,0 @@ -ht_binding_pressed: 0 new undecided hold_tap -ht_decide: 0 hold behavior pressed while undecided -kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_decide: 0 decided tap (balanced decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_sim.keymap b/app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_sim.keymap deleted file mode 100644 index 557076bc..00000000 --- a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_sim.keymap +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <100>; - quick-tap-ms = <200>; - bindings = <&kp>, <&sk>; - hold-while-undecided; - hold-while-undecided-linger; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &ht_bal LEFT_SHIFT LEFT_SHIFT &ht_bal LEFT_SHIFT LEFT_CONTROL - &kp D &kp RIGHT_CONTROL>; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/1-dn-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_sim.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/5-quick-tap/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_sim.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap similarity index 92% rename from app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index 85c9a959..500d2670 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_sim.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -12,6 +12,7 @@ behaviors { tp_short: short_tap { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_SHORT"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <100>; @@ -20,6 +21,7 @@ }; tp_long: long_tap { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_LONG"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <200>; @@ -30,6 +32,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi index 3e891f2c..79a88eb2 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { tp: behavior_tap_preferred { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_sim.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_sim.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_sim.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi index 23ecd2df..c66dc934 100644 --- a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { tp: behavior_tap_preferred { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi index fbe6c95d..df307740 100644 --- a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { tp: behavior_tap_preferred { compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <300>; @@ -16,6 +17,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_sim.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_sim.keymap rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi index 6a78d588..7aa39408 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi @@ -6,6 +6,7 @@ behaviors { ht_tui: behavior_hold_tap_tap_unless_interrupted { compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; #binding-cells = <2>; flavor = "tap-unless-interrupted"; tapping-term-ms = <300>; @@ -17,6 +18,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi index 7616c462..b24de6dd 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi @@ -8,6 +8,7 @@ behaviors { ht_tui: behavior_hold_tap_tap_unless_interrupted { compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; #binding-cells = <2>; flavor = "tap-unless-interrupted"; tapping-term-ms = <300>; @@ -18,6 +19,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/key-repeat/behavior_keymap.dtsi b/app/tests/key-repeat/behavior_keymap.dtsi index a0e5c8f9..c8e2d9c4 100644 --- a/app/tests/key-repeat/behavior_keymap.dtsi +++ b/app/tests/key-repeat/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/native_sim.keymap b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/ignore-other-usage-page-events/native_sim.keymap rename to app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap diff --git a/app/tests/toggle-layer/early-key-release/native_sim.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap similarity index 83% rename from app/tests/toggle-layer/early-key-release/native_sim.keymap rename to app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap index dfdbe172..9078f304 100644 --- a/app/tests/toggle-layer/early-key-release/native_sim.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap @@ -5,9 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_sim.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/press-and-release-after-key-usage/native_sim.keymap rename to app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_sim.keymap b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_sim.keymap rename to app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap diff --git a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_sim.keymap b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_sim.keymap rename to app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap diff --git a/app/tests/toggle-layer/toggle-mode-on/native_sim.keymap b/app/tests/key-repeat/tap-when-rolling/native_posix.keymap similarity index 65% rename from app/tests/toggle-layer/toggle-mode-on/native_sim.keymap rename to app/tests/key-repeat/tap-when-rolling/native_posix.keymap index 690787eb..bb129d14 100644 --- a/app/tests/toggle-layer/toggle-mode-on/native_sim.keymap +++ b/app/tests/key-repeat/tap-when-rolling/native_posix.keymap @@ -3,19 +3,11 @@ #include #include "../behavior_keymap.dtsi" -&tog { - toggle-mode = "on"; -}; - &kscan { events = < ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; -}; \ No newline at end of file +}; diff --git a/app/tests/key-repeat/tap-when-rolling/native_sim.keymap b/app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/tap-when-rolling/native_sim.keymap rename to app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap diff --git a/app/tests/keypress/behavior_keymap.dtsi b/app/tests/keypress/behavior_keymap.dtsi index 5f7cfd2d..52f9421c 100644 --- a/app/tests/keypress/behavior_keymap.dtsi +++ b/app/tests/keypress/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/keypress/kp-press-release/native_sim.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap similarity index 100% rename from app/tests/keypress/kp-press-release/native_sim.keymap rename to app/tests/keypress/kp-press-release/native_posix_64.keymap diff --git a/app/tests/keytoggle/behavior_keymap.dtsi b/app/tests/keytoggle/behavior_keymap.dtsi index a8e75136..45d48164 100644 --- a/app/tests/keytoggle/behavior_keymap.dtsi +++ b/app/tests/keytoggle/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/keytoggle/kt-alt-tab/native_sim.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap similarity index 97% rename from app/tests/keytoggle/kt-alt-tab/native_sim.keymap rename to app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index 78b4e455..4f70b591 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_sim.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -36,6 +36,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/keytoggle/kt-modded-alpha/native_sim.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap similarity index 96% rename from app/tests/keytoggle/kt-modded-alpha/native_sim.keymap rename to app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 0621b33a..b07f297f 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_sim.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -26,6 +26,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/keytoggle/kt-off/events.patterns b/app/tests/keytoggle/kt-off/events.patterns deleted file mode 100644 index 833100f6..00000000 --- a/app/tests/keytoggle/kt-off/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/keytoggle/kt-off/keycode_events.snapshot b/app/tests/keytoggle/kt-off/keycode_events.snapshot deleted file mode 100644 index 24404605..00000000 --- a/app/tests/keytoggle/kt-off/keycode_events.snapshot +++ /dev/null @@ -1,4 +0,0 @@ -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/keytoggle/kt-off/native_sim.keymap b/app/tests/keytoggle/kt-off/native_sim.keymap deleted file mode 100644 index 4abf6ee9..00000000 --- a/app/tests/keytoggle/kt-off/native_sim.keymap +++ /dev/null @@ -1,29 +0,0 @@ -#include "../behavior_keymap.dtsi" - -&kt { - toggle-mode = "off"; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kt B &trans - &trans &kp B - >; - }; - }; -}; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-on/events.patterns b/app/tests/keytoggle/kt-on/events.patterns deleted file mode 100644 index 833100f6..00000000 --- a/app/tests/keytoggle/kt-on/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/keytoggle/kt-on/keycode_events.snapshot b/app/tests/keytoggle/kt-on/keycode_events.snapshot deleted file mode 100644 index 6954f3da..00000000 --- a/app/tests/keytoggle/kt-on/keycode_events.snapshot +++ /dev/null @@ -1,6 +0,0 @@ -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -pressed: unregistering usage_page 0x07 keycode 0x05 since it was already pressed -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -pressed: unregistering usage_page 0x07 keycode 0x05 since it was already pressed -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/keytoggle/kt-on/native_sim.keymap b/app/tests/keytoggle/kt-on/native_sim.keymap deleted file mode 100644 index 964aa93b..00000000 --- a/app/tests/keytoggle/kt-on/native_sim.keymap +++ /dev/null @@ -1,30 +0,0 @@ -#include "../behavior_keymap.dtsi" - -&kt { - toggle-mode = "on"; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kt B &trans - &trans &kp B - >; - }; - }; -}; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_sim.conf b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf similarity index 100% rename from app/tests/keytoggle/kt-press-release-nkro/native_sim.conf rename to app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_sim.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap similarity index 100% rename from app/tests/keytoggle/kt-press-release-nkro/native_sim.keymap rename to app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap diff --git a/app/tests/keytoggle/kt-press-release/native_sim.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap similarity index 100% rename from app/tests/keytoggle/kt-press-release/native_sim.keymap rename to app/tests/keytoggle/kt-press-release/native_posix_64.keymap diff --git a/app/tests/macros/basic/keycode_events.snapshot b/app/tests/macros/basic/keycode_events.snapshot index 5639f1d7..b238a2ff 100644 --- a/app/tests/macros/basic/keycode_events.snapshot +++ b/app/tests/macros/basic/keycode_events.snapshot @@ -1,18 +1,18 @@ -queue_process_next: Invoking key_press: 0x70004 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms -queue_process_next: Invoking key_press: 0x70004 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms -queue_process_next: Invoking key_press: 0x70005 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70005 0x00 kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms -queue_process_next: Invoking key_press: 0x70005 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70005 0x00 kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms -queue_process_next: Invoking key_press: 0x70006 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70006 0x00 kp_pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms -queue_process_next: Invoking key_press: 0x70006 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70006 0x00 kp_released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms diff --git a/app/tests/macros/basic/native_sim.keymap b/app/tests/macros/basic/native_posix_64.keymap similarity index 100% rename from app/tests/macros/basic/native_sim.keymap rename to app/tests/macros/basic/native_posix_64.keymap diff --git a/app/tests/macros/behavior_keymap.dtsi b/app/tests/macros/behavior_keymap.dtsi index 25414216..90322e42 100644 --- a/app/tests/macros/behavior_keymap.dtsi +++ b/app/tests/macros/behavior_keymap.dtsi @@ -49,6 +49,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_sim.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap similarity index 94% rename from app/tests/macros/mo-plus-modifier-from-hold-tap/native_sim.keymap rename to app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index d9d186ce..bdf89abf 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_sim.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -24,6 +24,7 @@ behaviors { mth: macro_tap_hold { compatible = "zmk,behavior-hold-tap"; + label = "MACRO_TAP_HOLD"; #binding-cells = <2>; flavor = "tap-unless-interrupted"; tapping-term-ms = <200>; @@ -33,6 +34,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/macros/mo-plus-modifier-macro/native_sim.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap similarity index 96% rename from app/tests/macros/mo-plus-modifier-macro/native_sim.keymap rename to app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index bb06d2c3..4cc60bf5 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_sim.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -23,6 +23,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/macros/param-then-no-param/events.patterns b/app/tests/macros/param-then-no-param/events.patterns deleted file mode 100644 index a23e0563..00000000 --- a/app/tests/macros/param-then-no-param/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p diff --git a/app/tests/macros/param-then-no-param/keycode_events.snapshot b/app/tests/macros/param-then-no-param/keycode_events.snapshot deleted file mode 100644 index aee0e1e6..00000000 --- a/app/tests/macros/param-then-no-param/keycode_events.snapshot +++ /dev/null @@ -1,8 +0,0 @@ -kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -mo_pressed: position 0 layer 1 -kp_pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 -mo_released: position 0 layer 1 -kp_pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/param-then-no-param/native_posix_64.keymap b/app/tests/macros/param-then-no-param/native_posix_64.keymap deleted file mode 100644 index e6c42901..00000000 --- a/app/tests/macros/param-then-no-param/native_posix_64.keymap +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include - -/ { - macros { - kp_l1: kp_l1 { - compatible = "zmk,behavior-macro-one-param"; - #binding-cells = <1>; - wait-ms = <5>; - tap-ms = <5>; - bindings - = <¯o_param_1to1> - , <¯o_tap &kp MACRO_PLACEHOLDER> - , <¯o_press &mo 1> - , <¯o_pause_for_release> - , <¯o_release &mo 1>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp_l1 A &kp B - &kp C &none>; - }; - - other_layer { - bindings = < - &kp X &kp Y - &kp Z &none>; - }; - }; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,20) // press macro (taps A) - ZMK_MOCK_PRESS(0,1,20) // press Y - ZMK_MOCK_RELEASE(0,1,20) // release Y - ZMK_MOCK_RELEASE(0,0,20) // release macro - ZMK_MOCK_PRESS(1,0,10) // press C - ZMK_MOCK_RELEASE(1,0,10) // release C - >; -}; diff --git a/app/tests/macros/place-holder-parameters/native_sim.keymap b/app/tests/macros/place-holder-parameters/native_posix_64.keymap similarity index 92% rename from app/tests/macros/place-holder-parameters/native_sim.keymap rename to app/tests/macros/place-holder-parameters/native_posix_64.keymap index c6fcd5c6..59d78b5e 100644 --- a/app/tests/macros/place-holder-parameters/native_sim.keymap +++ b/app/tests/macros/place-holder-parameters/native_posix_64.keymap @@ -12,6 +12,7 @@ macros { slash_macro: slash_macro { #binding-cells = <2>; + label = "ZM_SLASH"; compatible = "zmk,behavior-macro-two-param"; wait-ms = <40>; tap-ms = <40>; @@ -23,6 +24,7 @@ to_second_macro: to_second_macro { #binding-cells = <2>; + label = "ZMK_TO_SECOND"; compatible = "zmk,behavior-macro-two-param"; wait-ms = <40>; tap-ms = <40>; @@ -33,6 +35,7 @@ quote_letter_macro: quote_letter_macro { #binding-cells = <1>; + label = "ZMK_QLET"; compatible = "zmk,behavior-macro-one-param"; wait-ms = <40>; tap-ms = <40>; @@ -45,6 +48,7 @@ keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/macros/press-mid-macro/keycode_events.snapshot b/app/tests/macros/press-mid-macro/keycode_events.snapshot index 28551b1c..22393a3a 100644 --- a/app/tests/macros/press-mid-macro/keycode_events.snapshot +++ b/app/tests/macros/press-mid-macro/keycode_events.snapshot @@ -1,8 +1,8 @@ -pos_state: layer_id: 0 position: 0, binding name: abc_macro +pos_state: layer: 0 position: 0, binding name: ZM_abc_macro kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pos_state: layer_id: 0 position: 0, binding name: abc_macro -pos_state: layer_id: 0 position: 1, binding name: momentary_layer -pos_state: layer_id: 0 position: 1, binding name: momentary_layer +pos_state: layer: 0 position: 0, binding name: ZM_abc_macro +pos_state: layer: 0 position: 1, binding name: MO +pos_state: layer: 0 position: 1, binding name: MO kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/press-mid-macro/native_sim.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap similarity index 100% rename from app/tests/macros/press-mid-macro/native_sim.keymap rename to app/tests/macros/press-mid-macro/native_posix_64.keymap diff --git a/app/tests/macros/press-release/native_sim.keymap b/app/tests/macros/press-release/native_posix_64.keymap similarity index 100% rename from app/tests/macros/press-release/native_sim.keymap rename to app/tests/macros/press-release/native_posix_64.keymap diff --git a/app/tests/macros/timing-override/keycode_events.snapshot b/app/tests/macros/timing-override/keycode_events.snapshot index e275cf9b..0ff45904 100644 --- a/app/tests/macros/timing-override/keycode_events.snapshot +++ b/app/tests/macros/timing-override/keycode_events.snapshot @@ -1,18 +1,18 @@ -queue_process_next: Invoking key_press: 0x70004 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 30ms -queue_process_next: Invoking key_press: 0x70004 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms -queue_process_next: Invoking key_press: 0x70005 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70005 0x00 kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 20ms -queue_process_next: Invoking key_press: 0x70005 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70005 0x00 kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms -queue_process_next: Invoking key_press: 0x70006 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70006 0x00 kp_pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 20ms -queue_process_next: Invoking key_press: 0x70006 0x00 +queue_process_next: Invoking KEY_PRESS: 0x70006 0x00 kp_released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms diff --git a/app/tests/macros/timing-override/native_sim.keymap b/app/tests/macros/timing-override/native_posix_64.keymap similarity index 100% rename from app/tests/macros/timing-override/native_sim.keymap rename to app/tests/macros/timing-override/native_posix_64.keymap diff --git a/app/tests/macros/wait-macro-release/keycode_events.snapshot b/app/tests/macros/wait-macro-release/keycode_events.snapshot index abe9791f..21d47a29 100644 --- a/app/tests/macros/wait-macro-release/keycode_events.snapshot +++ b/app/tests/macros/wait-macro-release/keycode_events.snapshot @@ -1,16 +1,16 @@ qm: Iterating macro bindings - starting: 0, count: 4 -queue_process_next: Invoking key_press: 0x700e2 0x00 +queue_process_next: Invoking KEY_PRESS: 0x700e2 0x00 kp_pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms -queue_process_next: Invoking key_press: 0x7002b 0x00 +queue_process_next: Invoking KEY_PRESS: 0x7002b 0x00 kp_pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 40ms -queue_process_next: Invoking key_press: 0x7002b 0x00 +queue_process_next: Invoking KEY_PRESS: 0x7002b 0x00 kp_released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms kp_pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 qm: Iterating macro bindings - starting: 5, count: 2 -queue_process_next: Invoking key_press: 0x700e2 0x00 +queue_process_next: Invoking KEY_PRESS: 0x700e2 0x00 kp_released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 0ms diff --git a/app/tests/macros/wait-macro-release/native_sim.keymap b/app/tests/macros/wait-macro-release/native_posix_64.keymap similarity index 100% rename from app/tests/macros/wait-macro-release/native_sim.keymap rename to app/tests/macros/wait-macro-release/native_posix_64.keymap diff --git a/app/tests/matrix-input/kp-press-release/events.patterns b/app/tests/matrix-input/kp-press-release/events.patterns deleted file mode 100644 index 833100f6..00000000 --- a/app/tests/matrix-input/kp-press-release/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/matrix-input/kp-press-release/keycode_events.snapshot b/app/tests/matrix-input/kp-press-release/keycode_events.snapshot deleted file mode 100644 index 259501ba..00000000 --- a/app/tests/matrix-input/kp-press-release/keycode_events.snapshot +++ /dev/null @@ -1,2 +0,0 @@ -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/matrix-input/kp-press-release/native_sim.conf b/app/tests/matrix-input/kp-press-release/native_sim.conf deleted file mode 100644 index 9ce5b96b..00000000 --- a/app/tests/matrix-input/kp-press-release/native_sim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_INPUT=y \ No newline at end of file diff --git a/app/tests/matrix-input/kp-press-release/native_sim.keymap b/app/tests/matrix-input/kp-press-release/native_sim.keymap deleted file mode 100644 index 14e82d13..00000000 --- a/app/tests/matrix-input/kp-press-release/native_sim.keymap +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include -#include - -/delete-node/ &kscan; - -/ { - physical_layout: physical_layout { - display-name = "Layout"; - compatible = "zmk,physical-layout"; - input = <&mock_matrix_input>; - transform = <&matrix_transform0>; - }; - - chosen { - /delete-property/ zmk,kscan; - - // zmk,matrix-input = &mock_matrix_input; - }; - - matrix_transform0: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <20>; - rows = <5>; - - - map = < - RC(0,0) RC(0,1) - RC(1,0) RC(1,1) - >; - }; - - mock_matrix_input: mock_matrix_input { - compatible = "zmk,input-mock"; - - event-startup-delay = <100>; - event-period = <2000>; - events - = - , - , - , - , - , - ; - exit-after; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp B &kp C - &kp D &kp E - >; - }; - }; -}; diff --git a/app/tests/mod-morph/1-no-morph/native_sim.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap similarity index 100% rename from app/tests/mod-morph/1-no-morph/native_sim.keymap rename to app/tests/mod-morph/1-no-morph/native_posix_64.keymap diff --git a/app/tests/mod-morph/2a-masked-morph/native_sim.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap similarity index 100% rename from app/tests/mod-morph/2a-masked-morph/native_sim.keymap rename to app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_sim.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap similarity index 82% rename from app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_sim.keymap rename to app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap index 1a0642f1..66fb1ed0 100644 --- a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_sim.keymap +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap @@ -6,14 +6,16 @@ behaviors { mod_morph: mod_morph { compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; #binding-cells = <0>; - bindings = <&kp A>, <&kp LS(B)>; // implicit mod overwrite + bindings = <&kp A>, <&kp LS(B)>; // implict mod overwrite mods = <(MOD_LSFT|MOD_RSFT)>; }; }; keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_sim.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap similarity index 100% rename from app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_sim.keymap rename to app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_sim.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap similarity index 92% rename from app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_sim.keymap rename to app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap index 4f9f4910..9b7f4fe1 100644 --- a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_sim.keymap +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap @@ -16,6 +16,7 @@ behaviors { mod_morph: mod_morph { compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; #binding-cells = <0>; bindings = <&kp A>, << 1 B>; mods = <(MOD_LSFT|MOD_RSFT)>; @@ -25,6 +26,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_sim.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap similarity index 93% rename from app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_sim.keymap rename to app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap index 77067f34..e0c1d1e5 100644 --- a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_sim.keymap +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap @@ -18,6 +18,7 @@ behaviors { mod_morph: mod_morph { compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; #binding-cells = <0>; bindings = <&kp A>, << 1 B>; mods = <(MOD_LSFT|MOD_RSFT)>; @@ -27,6 +28,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/mod-morph/3-unmasked-morph/native_sim.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap similarity index 91% rename from app/tests/mod-morph/3-unmasked-morph/native_sim.keymap rename to app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap index d2ad5670..a20c04d5 100644 --- a/app/tests/mod-morph/3-unmasked-morph/native_sim.keymap +++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap @@ -6,6 +6,7 @@ behaviors { mod_morph: mod_morph { compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; #binding-cells = <0>; bindings = <&kp A>, <&kp B>; mods = <(MOD_LSFT|MOD_RSFT)>; @@ -15,6 +16,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi index 86150307..2f880540 100644 --- a/app/tests/mod-morph/behavior_keymap.dtsi +++ b/app/tests/mod-morph/behavior_keymap.dtsi @@ -2,6 +2,7 @@ behaviors { mod_morph: mod_morph { compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; #binding-cells = <0>; bindings = <&kp A>, <&kp B>; mods = <(MOD_LSFT|MOD_RSFT)>; @@ -10,6 +11,7 @@ keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_sim.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_sim.keymap rename to app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index 8060f18f..72b218f5 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_sim.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -16,6 +16,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_sim.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_sim.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index 503c3519..d68f8921 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_sim.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_sim.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap similarity index 92% rename from app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_sim.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 362754c8..c2d12eb2 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_sim.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -13,6 +13,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_sim.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_sim.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index f25996f6..7be62b94 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_sim.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_sim.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_sim.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 15cdc5c9..8d1d773e 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_sim.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -16,6 +16,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_sim.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_sim.keymap rename to app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index 17d949e7..87101d83 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_sim.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_sim.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_sim.keymap rename to app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index fa34be42..6b40fef1 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_sim.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_sim.keymap b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_sim.keymap rename to app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap index 214cff49..3926eb57 100644 --- a/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_sim.keymap +++ b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_sim.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_sim.keymap rename to app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index 01387e54..4b2ca139 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_sim.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_sim.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap similarity index 93% rename from app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_sim.keymap rename to app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index 113fc488..a2564762 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_sim.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -15,6 +15,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/momentary-layer/1-normal/native_sim.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap similarity index 94% rename from app/tests/momentary-layer/1-normal/native_sim.keymap rename to app/tests/momentary-layer/1-normal/native_posix_64.keymap index 88c70da9..387a1322 100644 --- a/app/tests/momentary-layer/1-normal/native_sim.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -6,6 +6,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/momentary-layer/2-early-key-release/native_sim.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap similarity index 94% rename from app/tests/momentary-layer/2-early-key-release/native_sim.keymap rename to app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 48da33e6..776fc761 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_sim.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -6,6 +6,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/momentary-layer/3-covered/native_sim.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap similarity index 94% rename from app/tests/momentary-layer/3-covered/native_sim.keymap rename to app/tests/momentary-layer/3-covered/native_posix_64.keymap index 42548533..a7939d9e 100644 --- a/app/tests/momentary-layer/3-covered/native_sim.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -9,6 +9,7 @@ and the original key is "covered". / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap b/app/tests/momentary-layer/4-nested/native_posix_64.keymap similarity index 95% rename from app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap rename to app/tests/momentary-layer/4-nested/native_posix_64.keymap index f1f0afcb..1f4f0aea 100644 --- a/app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap +++ b/app/tests/momentary-layer/4-nested/native_posix_64.keymap @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < @@ -31,8 +32,8 @@ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/4-nested/native_sim.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap similarity index 95% rename from app/tests/momentary-layer/4-nested/native_sim.keymap rename to app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap index 12fb6cdc..4c8f7890 100644 --- a/app/tests/momentary-layer/4-nested/native_sim.keymap +++ b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < @@ -31,8 +32,8 @@ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/behavior_keymap.dtsi b/app/tests/momentary-layer/behavior_keymap.dtsi index 8d63bc13..63127a39 100644 --- a/app/tests/momentary-layer/behavior_keymap.dtsi +++ b/app/tests/momentary-layer/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/none/behavior_keymap.dtsi b/app/tests/none/behavior_keymap.dtsi index 162ca992..7a4c099b 100644 --- a/app/tests/none/behavior_keymap.dtsi +++ b/app/tests/none/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/none/layered/native_sim.keymap b/app/tests/none/layered/native_posix_64.keymap similarity index 100% rename from app/tests/none/layered/native_sim.keymap rename to app/tests/none/layered/native_posix_64.keymap diff --git a/app/tests/none/normal/native_sim.keymap b/app/tests/none/normal/native_posix.keymap similarity index 100% rename from app/tests/none/normal/native_sim.keymap rename to app/tests/none/normal/native_posix.keymap diff --git a/app/tests/transparent/normal/native_sim.keymap b/app/tests/none/normal/native_posix_64.keymap similarity index 100% rename from app/tests/transparent/normal/native_sim.keymap rename to app/tests/none/normal/native_posix_64.keymap diff --git a/app/tests/pointing/mkp/events.patterns b/app/tests/pointing/mkp/events.patterns deleted file mode 100644 index 2599345c..00000000 --- a/app/tests/pointing/mkp/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*zmk_hid_mouse_button_//p diff --git a/app/tests/pointing/mkp/keycode_events.snapshot b/app/tests/pointing/mkp/keycode_events.snapshot deleted file mode 100644 index ab58cc95..00000000 --- a/app/tests/pointing/mkp/keycode_events.snapshot +++ /dev/null @@ -1,10 +0,0 @@ -press: Button 0 count 1 -press: Mouse buttons set to 0x01 -press: Button 1 count 1 -press: Mouse buttons set to 0x03 -release: Button 1 count: 0 -release: Button 1 released -release: Mouse buttons set to 0x01 -release: Button 0 count: 0 -release: Button 0 released -release: Mouse buttons set to 0x00 diff --git a/app/tests/pointing/mkp/native_sim.conf b/app/tests/pointing/mkp/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mkp/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mkp/native_sim.keymap b/app/tests/pointing/mkp/native_sim.keymap deleted file mode 100644 index cec0b6e1..00000000 --- a/app/tests/pointing/mkp/native_sim.keymap +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &mkp LCLK &none - &none &mkp RCLK - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS (0,0,100) - ZMK_MOCK_PRESS (1,1,100) - ZMK_MOCK_RELEASE(1,1, 10) - ZMK_MOCK_RELEASE(0,0, 10) - >; -}; diff --git a/app/tests/pointing/mouse-move/move_diagonal/events.patterns b/app/tests/pointing/mouse-move/move_diagonal/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-move/move_diagonal/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/move_diagonal/keycode_events.snapshot b/app/tests/pointing/mouse-move/move_diagonal/keycode_events.snapshot deleted file mode 100644 index 6b9fa770..00000000 --- a/app/tests/pointing/mouse-move/move_diagonal/keycode_events.snapshot +++ /dev/null @@ -1,18 +0,0 @@ -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/move_diagonal/native_sim.conf b/app/tests/pointing/mouse-move/move_diagonal/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/move_diagonal/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap b/app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap deleted file mode 100644 index 8fa0781d..00000000 --- a/app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/move_x/events.patterns b/app/tests/pointing/mouse-move/move_x/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-move/move_x/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/move_x/keycode_events.snapshot b/app/tests/pointing/mouse-move/move_x/keycode_events.snapshot deleted file mode 100644 index 678f71c9..00000000 --- a/app/tests/pointing/mouse-move/move_x/keycode_events.snapshot +++ /dev/null @@ -1,24 +0,0 @@ -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/move_x/native_sim.keymap b/app/tests/pointing/mouse-move/move_x/native_sim.keymap deleted file mode 100644 index ac367238..00000000 --- a/app/tests/pointing/mouse-move/move_x/native_sim.keymap +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_RIGHT - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/move_y/events.patterns b/app/tests/pointing/mouse-move/move_y/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-move/move_y/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/move_y/keycode_events.snapshot b/app/tests/pointing/mouse-move/move_y/keycode_events.snapshot deleted file mode 100644 index d20154d5..00000000 --- a/app/tests/pointing/mouse-move/move_y/keycode_events.snapshot +++ /dev/null @@ -1,24 +0,0 @@ -movement_set: Mouse movement set to 0/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/move_y/native_sim.conf b/app/tests/pointing/mouse-move/move_y/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/move_y/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/move_y/native_sim.keymap b/app/tests/pointing/mouse-move/move_y/native_sim.keymap deleted file mode 100644 index 12d5725c..00000000 --- a/app/tests/pointing/mouse-move/move_y/native_sim.keymap +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_UP &mmv MOVE_DOWN - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/events.patterns b/app/tests/pointing/mouse-move/processors/behaviors_basic/events.patterns deleted file mode 100644 index 7374badf..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_basic/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/.*hid_mouse_//p -s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/behaviors_basic/keycode_events.snapshot deleted file mode 100644 index 7ad856db..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_basic/keycode_events.snapshot +++ /dev/null @@ -1,6 +0,0 @@ -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf b/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap b/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap deleted file mode 100644 index e5079d33..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap +++ /dev/null @@ -1,44 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - - -&zip_button_behaviors { - bindings = <&kp A &kp B &kp C>; -}; - -&mkp_input_listener { - input-processors = <&zip_button_behaviors>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mkp LCLK &mkp RCLK - &mkp MCLK &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/events.patterns b/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/events.patterns deleted file mode 100644 index 7374badf..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/.*hid_mouse_//p -s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/keycode_events.snapshot deleted file mode 100644 index 0712fa12..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/keycode_events.snapshot +++ /dev/null @@ -1,16 +0,0 @@ -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.conf b/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.keymap b/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.keymap deleted file mode 100644 index 092a20a0..00000000 --- a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.keymap +++ /dev/null @@ -1,58 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - - -&zip_button_behaviors { - bindings = <&mt LCTL A &mt LSHFT B &mt LALT C>; -}; - -&mkp_input_listener { - input-processors = <&zip_button_behaviors>; -}; - -/ { - combos { - compatible = "zmk,combos"; - }; - - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mkp LCLK &mkp RCLK - &mkp MCLK &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,500) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,500) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/events.patterns b/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/keycode_events.snapshot deleted file mode 100644 index 77ffd6f8..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/keycode_events.snapshot +++ /dev/null @@ -1,18 +0,0 @@ -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -4/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -5/-4 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -5/-5 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/-5 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf b/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.keymap b/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.keymap deleted file mode 100644 index 7e4b71ae..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.keymap +++ /dev/null @@ -1,37 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&zip_xy_scaler 5 3>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/events.patterns b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/keycode_events.snapshot deleted file mode 100644 index 33bb267b..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/keycode_events.snapshot +++ /dev/null @@ -1,18 +0,0 @@ -movement_set: Mouse movement set to 1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 2/2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 2/2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 3/2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 3/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to 0/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.conf b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.keymap b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.keymap deleted file mode 100644 index bc74135c..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.keymap +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&zip_xy_transform (INPUT_TRANSFORM_X_INVERT | INPUT_TRANSFORM_Y_INVERT)>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/events.patterns b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/keycode_events.snapshot deleted file mode 100644 index 40daa64f..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/keycode_events.snapshot +++ /dev/null @@ -1,18 +0,0 @@ -movement_set: Mouse movement set to 0/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/-2 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/-3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.conf b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.keymap b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.keymap deleted file mode 100644 index e1d2d600..00000000 --- a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.keymap +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&zip_xy_swap_mapper>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; \ No newline at end of file diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/events.patterns b/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/events.patterns deleted file mode 100644 index e9f2583e..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/events.patterns +++ /dev/null @@ -1,5 +0,0 @@ -s/.*hid_mouse_//p -s/.*set_layer_state: //p -s/.*handle_state_changed_dispatcher: //p -s/.*handle_position_state_changed: //p -s/.*handle_keycode_state_changed: //p diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/keycode_events.snapshot deleted file mode 100644 index 220da205..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/keycode_events.snapshot +++ /dev/null @@ -1,16 +0,0 @@ -layer_changed: layer 1 state 1 locked 0 -Dispatching handle_layer_state_changed -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -layer_changed: layer 1 state 0 locked 0 -Dispatching handle_layer_state_changed diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.conf b/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.keymap deleted file mode 100644 index 2088e5ce..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.keymap +++ /dev/null @@ -1,41 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&zip_temp_layer 1 500>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - - mkp_layer { - bindings = <&mkp LCLK &mkp RCLK &trans &trans>; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,150) - ZMK_MOCK_PRESS(1,0,200) - ZMK_MOCK_RELEASE(1,0,250) - >; -}; diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/events.patterns b/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/events.patterns deleted file mode 100644 index 27695039..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/events.patterns +++ /dev/null @@ -1,7 +0,0 @@ -s/.*hid_mouse_//p -s/.*set_layer_state: //p -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*handle_state_changed_dispatcher: //p -s/.*handle_position_state_changed: //p -s/.*handle_keycode_state_changed: //p diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/keycode_events.snapshot deleted file mode 100644 index 97ed7672..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/keycode_events.snapshot +++ /dev/null @@ -1,23 +0,0 @@ -Dispatching handle_position_state_changed -Position excluded, continuing -layer_changed: layer 1 state 1 locked 0 -Dispatching handle_layer_state_changed -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -Dispatching handle_position_state_changed -Dispatching handle_position_state_changed -Position not excluded, deactivating layer -layer_changed: layer 1 state 0 locked 0 -Dispatching handle_layer_state_changed -Position excluded, continuing -Dispatching handle_position_state_changed diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.conf b/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.keymap deleted file mode 100644 index 814d889c..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.keymap +++ /dev/null @@ -1,46 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&auto_mouse_layer 1 0>; -}; - -/ { - auto_mouse_layer: auto_mouse_layer { - compatible = "zmk,input-processor-temp-layer"; - #input-processor-cells = <2>; - excluded-positions = <0>; - }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - - mkp_layer { - bindings = <&mkp LCLK &mkp RCLK &trans &trans>; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,150) - ZMK_MOCK_PRESS(1,0,200) - ZMK_MOCK_RELEASE(1,0,250) - >; -}; diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/events.patterns b/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/events.patterns deleted file mode 100644 index 27695039..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/events.patterns +++ /dev/null @@ -1,7 +0,0 @@ -s/.*hid_mouse_//p -s/.*set_layer_state: //p -s/.*hid_listener_keycode/kp/p -s/.*mo_keymap_binding/mo/p -s/.*handle_state_changed_dispatcher: //p -s/.*handle_position_state_changed: //p -s/.*handle_keycode_state_changed: //p diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/keycode_events.snapshot deleted file mode 100644 index 214b8fea..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/keycode_events.snapshot +++ /dev/null @@ -1,29 +0,0 @@ -Dispatching handle_position_state_changed -Position excluded, continuing -layer_changed: layer 1 state 1 locked 0 -Dispatching handle_layer_state_changed -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -Dispatching handle_position_state_changed -Dispatching handle_position_state_changed -Position excluded, continuing -button_press: Button 0 count 1 -button_press: Mouse buttons set to 0x01 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -Dispatching handle_position_state_changed -button_release: Button 0 count: 0 -button_release: Button 0 released -button_release: Mouse buttons set to 0x00 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.conf b/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.keymap deleted file mode 100644 index 73ff0463..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.keymap +++ /dev/null @@ -1,46 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&auto_mouse_layer 1 0>; -}; - -/ { - auto_mouse_layer: auto_mouse_layer { - compatible = "zmk,input-processor-temp-layer"; - #input-processor-cells = <2>; - excluded-positions = <0>; - }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &none &none - >; - }; - - mkp_layer { - bindings = <&mkp LCLK &mkp RCLK &trans &trans>; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,150) - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_RELEASE(0,0,250) - >; -}; diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/events.patterns b/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/events.patterns deleted file mode 100644 index ae24cce0..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/events.patterns +++ /dev/null @@ -1,6 +0,0 @@ -s/.*hid_mouse_//p -s/.*set_layer_state: //p -s/.*hid_listener_keycode/kp/p -s/.*handle_state_changed_dispatcher: //p -s/.*handle_position_state_changed: //p -s/.*handle_keycode_state_changed: //p diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/keycode_events.snapshot deleted file mode 100644 index 53555472..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/keycode_events.snapshot +++ /dev/null @@ -1,150 +0,0 @@ -Dispatching handle_keycode_state_changed -Setting last_tapped_timestamp to: 11 -kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -Dispatching handle_keycode_state_changed -kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -4/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -4/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -layer_changed: layer 1 state 1 locked 0 -Dispatching handle_layer_state_changed -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -4/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -4/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -5/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -5/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -6/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -7/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -7/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -8/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -8/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -8/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -10/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -9/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -layer_changed: layer 1 state 0 locked 0 -Dispatching handle_layer_state_changed diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.conf b/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.keymap deleted file mode 100644 index ec78569c..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.keymap +++ /dev/null @@ -1,50 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&auto_mouse_layer 1 500>; -}; - -/ { - auto_mouse_layer: auto_mouse_layer { - compatible = "zmk,input-processor-temp-layer"; - #input-processor-cells = <2>; - require-prior-idle-ms = <500>; - }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &kp A &none - >; - }; - - mkp_layer { - bindings = <&mkp LCLK &mkp RCLK &trans &trans>; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,100) - /* before idle */ - ZMK_MOCK_PRESS(0,0,150) - ZMK_MOCK_RELEASE(0,0,200) - /* after idle */ - ZMK_MOCK_PRESS(0,0,700) - ZMK_MOCK_RELEASE(0,0,800) - >; -}; diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/events.patterns b/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/events.patterns deleted file mode 100644 index 9fab690e..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/events.patterns +++ /dev/null @@ -1,6 +0,0 @@ -s/.*hid_mouse_//p -s/.*set_layer_state: //p -s/.*handle_state_changed_dispatcher: //p -s/.*handle_layer_state_changed: //p -s/.*handle_position_state_changed: //p -s/.*handle_keycode_state_changed: //p diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/keycode_events.snapshot b/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/keycode_events.snapshot deleted file mode 100644 index 6cc1d8d9..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/keycode_events.snapshot +++ /dev/null @@ -1,31 +0,0 @@ -layer_changed: layer 1 state 1 locked 0 -Dispatching handle_layer_state_changed -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -layer_changed: layer 1 state 0 locked 0 -Dispatching handle_layer_state_changed -Deactivating layer that was activated by this processor -layer_changed: layer 1 state 1 locked 0 -Dispatching handle_layer_state_changed -movement_set: Mouse movement set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -2/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -movement_set: Mouse movement set to -3/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.conf b/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.keymap deleted file mode 100644 index 6ae1d228..00000000 --- a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.keymap +++ /dev/null @@ -1,43 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&mmv_input_listener { - input-processors = <&zip_temp_layer 1 500>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - - default_layer { - bindings = < - &mmv MOVE_LEFT &mmv MOVE_UP - &mo 1 &none - >; - }; - - mkp_layer { - bindings = <&mkp LCLK &mkp RCLK &trans &trans>; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,150) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,150) - >; -}; diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/events.patterns b/app/tests/pointing/mouse-scroll/move_diagonal/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-scroll/move_diagonal/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/keycode_events.snapshot b/app/tests/pointing/mouse-scroll/move_diagonal/keycode_events.snapshot deleted file mode 100644 index ac91bba5..00000000 --- a/app/tests/pointing/mouse-scroll/move_diagonal/keycode_events.snapshot +++ /dev/null @@ -1,12 +0,0 @@ -scroll_set: Mouse scroll set to -1/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf b/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap b/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap deleted file mode 100644 index e14fccb4..00000000 --- a/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &msc SCRL_LEFT &msc SCRL_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,500) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/events.patterns b/app/tests/pointing/mouse-scroll/move_hwheel/events.patterns deleted file mode 100644 index 258c4cd8..00000000 --- a/app/tests/pointing/mouse-scroll/move_hwheel/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/keycode_events.snapshot b/app/tests/pointing/mouse-scroll/move_hwheel/keycode_events.snapshot deleted file mode 100644 index 5625279d..00000000 --- a/app/tests/pointing/mouse-scroll/move_hwheel/keycode_events.snapshot +++ /dev/null @@ -1,24 +0,0 @@ -scroll_set: Mouse scroll set to 1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -1/0 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf b/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap b/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap deleted file mode 100644 index 2810f03b..00000000 --- a/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &msc SCRL_RIGHT &msc SCRL_LEFT - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,500) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/pointing/mouse-scroll/move_wheel/events.patterns b/app/tests/pointing/mouse-scroll/move_wheel/events.patterns deleted file mode 100644 index 258c4cd8..00000000 --- a/app/tests/pointing/mouse-scroll/move_wheel/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p diff --git a/app/tests/pointing/mouse-scroll/move_wheel/keycode_events.snapshot b/app/tests/pointing/mouse-scroll/move_wheel/keycode_events.snapshot deleted file mode 100644 index 18260573..00000000 --- a/app/tests/pointing/mouse-scroll/move_wheel/keycode_events.snapshot +++ /dev/null @@ -1,24 +0,0 @@ -scroll_set: Mouse scroll set to 0/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 0/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf b/app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap b/app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap deleted file mode 100644 index 893b8b0c..00000000 --- a/app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &msc SCRL_UP &msc SCRL_DOWN - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,500) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/events.patterns b/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/keycode_events.snapshot b/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/keycode_events.snapshot deleted file mode 100644 index 64d0d3c4..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/keycode_events.snapshot +++ /dev/null @@ -1,12 +0,0 @@ -scroll_set: Mouse scroll set to -3/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -3/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -3/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to -3/3 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.conf b/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.keymap b/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.keymap deleted file mode 100644 index 235f1e8d..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.keymap +++ /dev/null @@ -1,36 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include - -&msc_input_listener { - input-processors = <&zip_scroll_scaler 6 2>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &msc SCRL_LEFT &msc SCRL_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,500) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/events.patterns b/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/events.patterns deleted file mode 100644 index 812126fb..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_mouse_//p \ No newline at end of file diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/keycode_events.snapshot b/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/keycode_events.snapshot deleted file mode 100644 index 22cac5bd..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/keycode_events.snapshot +++ /dev/null @@ -1,12 +0,0 @@ -scroll_set: Mouse scroll set to 1/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 1/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 1/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 -scroll_set: Mouse scroll set to 1/-1 -scroll_set: Mouse scroll set to 0/0 -movement_set: Mouse movement set to 0/0 diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.conf b/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.conf deleted file mode 100644 index fa514727..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.conf +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_ZMK_POINTING=y diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.keymap b/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.keymap deleted file mode 100644 index ce74df76..00000000 --- a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.keymap +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include -#include -#include -#include -#include - -&msc_input_listener { - input-processors = <&zip_scroll_transform (INPUT_TRANSFORM_X_INVERT | INPUT_TRANSFORM_Y_INVERT)>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &msc SCRL_LEFT &msc SCRL_UP - &none &none - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,500) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/sticky-keys/1-os-dn-up/native_sim.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/1-os-dn-up/native_sim.keymap rename to app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_sim.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap similarity index 96% rename from app/tests/sticky-keys/10-callum-mods-quick-release/native_sim.keymap rename to app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap index 560c8424..bc541824 100644 --- a/app/tests/sticky-keys/10-callum-mods-quick-release/native_sim.keymap +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -9,6 +9,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot b/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot index 29be00ff..3e46e581 100644 --- a/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot +++ b/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot @@ -1,8 +1,8 @@ pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/10-callum-mods/native_sim.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap similarity index 96% rename from app/tests/sticky-keys/10-callum-mods/native_sim.keymap rename to app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 28f2db3d..9121b188 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_sim.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_sim.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap similarity index 97% rename from app/tests/sticky-keys/10-sl-sl-kp/native_sim.keymap rename to app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index 42bb9cfd..bafdbe38 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_sim.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -10,6 +10,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/11-lazy-timeout-during/events.patterns b/app/tests/sticky-keys/11-lazy-timeout-during/events.patterns deleted file mode 100644 index b1342af4..00000000 --- a/app/tests/sticky-keys/11-lazy-timeout-during/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/11-lazy-timeout-during/keycode_events.snapshot b/app/tests/sticky-keys/11-lazy-timeout-during/keycode_events.snapshot deleted file mode 100644 index 8fc9315f..00000000 --- a/app/tests/sticky-keys/11-lazy-timeout-during/keycode_events.snapshot +++ /dev/null @@ -1,6 +0,0 @@ -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap b/app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap deleted file mode 100644 index 75d997cb..00000000 --- a/app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include - -/* this test ensures that timing out while the other key is being held results in correct behavior */ - -&sk { - lazy; - release-after-ms = <50>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &sk LEFT_CONTROL &kp A - &sk LEFT_SHIFT &sk LEFT_ALT>; - }; - }; -}; - -&kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(0,1,60) - ZMK_MOCK_RELEASE(0,1,10) - /* tap A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/sticky-keys/11-lazy-timeout/events.patterns b/app/tests/sticky-keys/11-lazy-timeout/events.patterns deleted file mode 100644 index b1342af4..00000000 --- a/app/tests/sticky-keys/11-lazy-timeout/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/11-lazy-timeout/keycode_events.snapshot b/app/tests/sticky-keys/11-lazy-timeout/keycode_events.snapshot deleted file mode 100644 index 4d560461..00000000 --- a/app/tests/sticky-keys/11-lazy-timeout/keycode_events.snapshot +++ /dev/null @@ -1,4 +0,0 @@ -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap b/app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap deleted file mode 100644 index 05db46c8..00000000 --- a/app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include - -/* this test ensures that lazy sticky keys don't emit anything on timeout */ - -&sk { - lazy; - release-after-ms = <50>; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &sk LEFT_CONTROL &kp A - &sk LEFT_SHIFT &sk LEFT_ALT>; - }; - }; -}; - -&kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,60) - /* tap sk LEFT_ALT */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,60) - /* tap A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/sticky-keys/11-lazy/events.patterns b/app/tests/sticky-keys/11-lazy/events.patterns deleted file mode 100644 index b1342af4..00000000 --- a/app/tests/sticky-keys/11-lazy/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/11-lazy/keycode_events.snapshot b/app/tests/sticky-keys/11-lazy/keycode_events.snapshot deleted file mode 100644 index 1c1f8614..00000000 --- a/app/tests/sticky-keys/11-lazy/keycode_events.snapshot +++ /dev/null @@ -1,16 +0,0 @@ -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1D implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1D implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/11-lazy/native_sim.keymap b/app/tests/sticky-keys/11-lazy/native_sim.keymap deleted file mode 100644 index 80319872..00000000 --- a/app/tests/sticky-keys/11-lazy/native_sim.keymap +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -/* this test verifies that lazy sticky keys work similarly to regular sticky keys, and includes cases from 10-callum-mods and 8-lsk-osk. - the only difference is that the lazy key does not exit the sticky layer */ - -&sk { - lazy; -}; - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &sk LEFT_CONTROL &sl 1 - &kp A &mo 1>; - }; - - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &sk LEFT_SHIFT &kp Z>; - }; - }; -}; - -&kscan { - events = < - /* tap LEFT_CONTROL on base layer */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap Z */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - - /* press mo lower_layer */ - ZMK_MOCK_PRESS(1,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* release mo lower_layer */ - ZMK_MOCK_RELEASE(1,1,10) - /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; -}; \ No newline at end of file diff --git a/app/tests/sticky-keys/12-macro/events.patterns b/app/tests/sticky-keys/12-macro/events.patterns deleted file mode 100644 index b1342af4..00000000 --- a/app/tests/sticky-keys/12-macro/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/12-macro/keycode_events.snapshot b/app/tests/sticky-keys/12-macro/keycode_events.snapshot deleted file mode 100644 index 6757e834..00000000 --- a/app/tests/sticky-keys/12-macro/keycode_events.snapshot +++ /dev/null @@ -1,4 +0,0 @@ -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/12-macro/native_sim.keymap b/app/tests/sticky-keys/12-macro/native_sim.keymap deleted file mode 100644 index e7ec5b27..00000000 --- a/app/tests/sticky-keys/12-macro/native_sim.keymap +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - ZMK_MACRO(sk_sl, wait-ms = <1>; tap-ms = <1>; bindings = <&sk LEFT_CONTROL &sl 1>;) - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &sk_sl &mo 1 - &kp Y &kp B>; - }; - - upper_layer { - bindings = < - &kp T &kp X - &kp A &kp Z>; - }; - }; -}; - -&kscan { - events = < - /* tap sk_sl */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; -}; diff --git a/app/tests/sticky-keys/12-same-position-mods/events.patterns b/app/tests/sticky-keys/12-same-position-mods/events.patterns deleted file mode 100644 index b1342af4..00000000 --- a/app/tests/sticky-keys/12-same-position-mods/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/12-same-position-mods/keycode_events.snapshot b/app/tests/sticky-keys/12-same-position-mods/keycode_events.snapshot deleted file mode 100644 index 56d45c00..00000000 --- a/app/tests/sticky-keys/12-same-position-mods/keycode_events.snapshot +++ /dev/null @@ -1,6 +0,0 @@ -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/12-same-position-mods/native_sim.keymap b/app/tests/sticky-keys/12-same-position-mods/native_sim.keymap deleted file mode 100644 index f3dd4ba9..00000000 --- a/app/tests/sticky-keys/12-same-position-mods/native_sim.keymap +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &sk LEFT_CONTROL &mo 1 - &kp A &kp B>; - }; - - lower_layer { - bindings = < - &sk LEFT_SHIFT &kp X - &kp Y &kp Z>; - }; - }; -}; - -&kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* switch to lower layer */ - ZMK_MOCK_PRESS(0,1,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* deactivate lower layer */ - ZMK_MOCK_RELEASE(0,1,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; -}; diff --git a/app/tests/sticky-keys/12-same-position-sk-sl/events.patterns b/app/tests/sticky-keys/12-same-position-sk-sl/events.patterns deleted file mode 100644 index b1342af4..00000000 --- a/app/tests/sticky-keys/12-same-position-sk-sl/events.patterns +++ /dev/null @@ -1 +0,0 @@ -s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/12-same-position-sk-sl/keycode_events.snapshot b/app/tests/sticky-keys/12-same-position-sk-sl/keycode_events.snapshot deleted file mode 100644 index 6757e834..00000000 --- a/app/tests/sticky-keys/12-same-position-sk-sl/keycode_events.snapshot +++ /dev/null @@ -1,4 +0,0 @@ -pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/12-same-position-sk-sl/native_sim.keymap b/app/tests/sticky-keys/12-same-position-sk-sl/native_sim.keymap deleted file mode 100644 index 14473047..00000000 --- a/app/tests/sticky-keys/12-same-position-sk-sl/native_sim.keymap +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &sk LEFT_CONTROL &mo 1 - &kp A &kp B>; - }; - - lower_layer { - bindings = < - &sl 2 &kp X - &kp Y &kp Z>; - }; - - upper_layer { - bindings = < - &kp T &kp X - &kp A &kp Z>; - }; - }; -}; - -&kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* switch to lower layer */ - ZMK_MOCK_PRESS(0,1,10) - /* tap sl upper_layer */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* deactivate lower layer */ - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_sim.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_sim.keymap rename to app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot index 1b4c078c..addbca8c 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot @@ -1,8 +1,8 @@ pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_sim.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_sim.keymap rename to app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_sim.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap similarity index 97% rename from app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_sim.keymap rename to app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 93239797..38c8fb4c 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_sim.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -10,6 +10,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_sim.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_sim.keymap rename to app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_sim.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_sim.keymap rename to app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot index 1b091a6a..6e004ec2 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot @@ -1,4 +1,4 @@ pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_sim.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_sim.keymap rename to app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_sim.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_sim.keymap rename to app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot index 2b1619b4..3c757bbb 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot @@ -1,6 +1,6 @@ pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_sim.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_sim.keymap rename to app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_sim.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap similarity index 97% rename from app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_sim.keymap rename to app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap index 69db1635..4da4ad98 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_sim.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -9,6 +9,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot b/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot index 0c4054f7..f1aa915b 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot +++ b/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot @@ -1,8 +1,8 @@ pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_sim.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap similarity index 96% rename from app/tests/sticky-keys/8-lsk-osk-combination/native_sim.keymap rename to app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index 9523a75e..d9c49014 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_sim.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_sim.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap similarity index 94% rename from app/tests/sticky-keys/9-sk-dn-up-dn-up/native_sim.keymap rename to app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index 67efb6af..74678256 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_sim.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/sticky-keys/behavior_keymap.dtsi b/app/tests/sticky-keys/behavior_keymap.dtsi index 182ef58e..9322cb14 100644 --- a/app/tests/sticky-keys/behavior_keymap.dtsi +++ b/app/tests/sticky-keys/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/studio/add-layer/basic/events.patterns b/app/tests/studio/add-layer/basic/events.patterns deleted file mode 100644 index 8b349f8d..00000000 --- a/app/tests/studio/add-layer/basic/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*on_add_layer_binding_pressed/add_layer/p -s/.*on_set_layer_binding_at_idx_binding_pressed/set_layer_binding/p -s/.*layer_changed/layer_changed/p -s/.*hid_listener_keycode_//p diff --git a/app/tests/studio/add-layer/basic/extra-cmake-args b/app/tests/studio/add-layer/basic/extra-cmake-args deleted file mode 100644 index c5e4f18e..00000000 --- a/app/tests/studio/add-layer/basic/extra-cmake-args +++ /dev/null @@ -1,5 +0,0 @@ --DCONFIG_ZMK_BEHAVIOR_METADATA=y --DCONFIG_ZMK_BEHAVIOR_LOCAL_IDS=y --DCONFIG_ZMK_KEYMAP_LAYER_REORDERING=y --DCONFIG_ZMK_KEYMAP_SETTINGS_STORAGE=y --DCONFIG_SETTINGS=y diff --git a/app/tests/studio/add-layer/basic/keycode_events.snapshot b/app/tests/studio/add-layer/basic/keycode_events.snapshot deleted file mode 100644 index 83fbf0fe..00000000 --- a/app/tests/studio/add-layer/basic/keycode_events.snapshot +++ /dev/null @@ -1,6 +0,0 @@ -add_layer: Added layer 1 -set_layer_binding: Set binding at layer 1, index 0 to binding 1/2 -layer_changed: layer 1 state 1 locked 0 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -layer_changed: layer 1 state 0 locked 0 \ No newline at end of file diff --git a/app/tests/studio/add-layer/basic/native_sim.conf b/app/tests/studio/add-layer/basic/native_sim.conf deleted file mode 100644 index 3fb69a9d..00000000 --- a/app/tests/studio/add-layer/basic/native_sim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_ZMK_TEST_BEHAVIORS=y \ No newline at end of file diff --git a/app/tests/studio/add-layer/basic/native_sim.keymap b/app/tests/studio/add-layer/basic/native_sim.keymap deleted file mode 100644 index 59ac62a2..00000000 --- a/app/tests/studio/add-layer/basic/native_sim.keymap +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -// Test adding a layer, setting a binding, activating it, and pressing the binding -&kscan { - events = < - // add a new layer - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - // set binding A at layer 1, position 0 - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - // activate layer 1 with momentary - ZMK_MOCK_PRESS(1,0,10) - // press position 0 on new layer (should be A) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - // release momentary layer 1 - ZMK_MOCK_RELEASE(1,0,10) - >; -}; diff --git a/app/tests/studio/add-layer/behavior_keymap.dtsi b/app/tests/studio/add-layer/behavior_keymap.dtsi deleted file mode 100644 index 243a6e0f..00000000 --- a/app/tests/studio/add-layer/behavior_keymap.dtsi +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - add_layer: add_layer { - compatible = "zmk,behavior-add-layer"; - #binding-cells = <0>; - }; - - set_binding: set_binding { - compatible = "zmk,behavior-set-layer-binding-at-idx"; - #binding-cells = <2>; - bindings = <&kp A>, <&kp B>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &add_layer &set_binding 1 0 - &mo 1 &kp B>; - }; - - layer_1 { - status = "reserved"; - }; - }; -}; diff --git a/app/tests/studio/move-layer/basic/events.patterns b/app/tests/studio/move-layer/basic/events.patterns deleted file mode 100644 index a3fbafba..00000000 --- a/app/tests/studio/move-layer/basic/events.patterns +++ /dev/null @@ -1,3 +0,0 @@ -s/.*layer_changed/layer_changed/p -s/.*hid_listener_keycode_//p -s/.*on_move_layer_binding_pressed/move_layer/p diff --git a/app/tests/studio/move-layer/basic/extra-cmake-args b/app/tests/studio/move-layer/basic/extra-cmake-args deleted file mode 100644 index c5e4f18e..00000000 --- a/app/tests/studio/move-layer/basic/extra-cmake-args +++ /dev/null @@ -1,5 +0,0 @@ --DCONFIG_ZMK_BEHAVIOR_METADATA=y --DCONFIG_ZMK_BEHAVIOR_LOCAL_IDS=y --DCONFIG_ZMK_KEYMAP_LAYER_REORDERING=y --DCONFIG_ZMK_KEYMAP_SETTINGS_STORAGE=y --DCONFIG_SETTINGS=y diff --git a/app/tests/studio/move-layer/basic/keycode_events.snapshot b/app/tests/studio/move-layer/basic/keycode_events.snapshot deleted file mode 100644 index 365afc62..00000000 --- a/app/tests/studio/move-layer/basic/keycode_events.snapshot +++ /dev/null @@ -1,8 +0,0 @@ -move_layer: Moved layer from index 1 to index 2 -layer_changed: layer 1 state 1 locked 0 -layer_changed: layer 2 state 1 locked 0 -pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -layer_changed: layer 2 state 0 locked 0 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/studio/move-layer/basic/native_sim.conf b/app/tests/studio/move-layer/basic/native_sim.conf deleted file mode 100644 index 3fb69a9d..00000000 --- a/app/tests/studio/move-layer/basic/native_sim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_ZMK_TEST_BEHAVIORS=y \ No newline at end of file diff --git a/app/tests/studio/move-layer/basic/native_sim.keymap b/app/tests/studio/move-layer/basic/native_sim.keymap deleted file mode 100644 index 91afb094..00000000 --- a/app/tests/studio/move-layer/basic/native_sim.keymap +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -// Test moving a layer: swap layers 1 and 2, turn both on, -// press transparent on layer 1 at index 2 -// which should fall through to layer 2 at index 1 -&kscan { - events = < - // move layer 1 to position 2 (effectively swapping layers 1 and 2) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - // activate layers 1 and 2 - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - // press position 0,1 on layer 2 - should output C from layer 2 at index 1 - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - // release layer 2 (at index 1) - ZMK_MOCK_RELEASE(1,1,10) - // press position 0,1 again - should output A from default layer - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; -}; diff --git a/app/tests/studio/move-layer/behavior_keymap.dtsi b/app/tests/studio/move-layer/behavior_keymap.dtsi deleted file mode 100644 index 014bba46..00000000 --- a/app/tests/studio/move-layer/behavior_keymap.dtsi +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - move_layer: move_layer { - compatible = "zmk,behavior-move-layer"; - #binding-cells = <2>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &move_layer 1 2 &kp A - &mo 1 &mo 2>; - }; - - layer_1 { - bindings = < - &kp B &trans - &trans &trans>; - }; - - layer_2 { - bindings = < - &trans &kp C - &trans &trans>; - }; - }; -}; diff --git a/app/tests/studio/remove-layer/basic/events.patterns b/app/tests/studio/remove-layer/basic/events.patterns deleted file mode 100644 index 2b04f256..00000000 --- a/app/tests/studio/remove-layer/basic/events.patterns +++ /dev/null @@ -1,3 +0,0 @@ -s/.*layer_changed/layer_changed/p -s/.*hid_listener_keycode_//p -s/.*on_remove_layer_binding_pressed/remove_layer/p diff --git a/app/tests/studio/remove-layer/basic/extra-cmake-args b/app/tests/studio/remove-layer/basic/extra-cmake-args deleted file mode 100644 index c5e4f18e..00000000 --- a/app/tests/studio/remove-layer/basic/extra-cmake-args +++ /dev/null @@ -1,5 +0,0 @@ --DCONFIG_ZMK_BEHAVIOR_METADATA=y --DCONFIG_ZMK_BEHAVIOR_LOCAL_IDS=y --DCONFIG_ZMK_KEYMAP_LAYER_REORDERING=y --DCONFIG_ZMK_KEYMAP_SETTINGS_STORAGE=y --DCONFIG_SETTINGS=y diff --git a/app/tests/studio/remove-layer/basic/keycode_events.snapshot b/app/tests/studio/remove-layer/basic/keycode_events.snapshot deleted file mode 100644 index 4aa4cd63..00000000 --- a/app/tests/studio/remove-layer/basic/keycode_events.snapshot +++ /dev/null @@ -1,7 +0,0 @@ -remove_layer: Removed layer at index 1 -layer_changed: layer 1 state 1 locked 1 -pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -layer_changed: layer 2 state 1 locked 1 -pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/studio/remove-layer/basic/native_sim.conf b/app/tests/studio/remove-layer/basic/native_sim.conf deleted file mode 100644 index 3fb69a9d..00000000 --- a/app/tests/studio/remove-layer/basic/native_sim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_ZMK_TEST_BEHAVIORS=y \ No newline at end of file diff --git a/app/tests/studio/remove-layer/basic/native_sim.keymap b/app/tests/studio/remove-layer/basic/native_sim.keymap deleted file mode 100644 index 9f026de9..00000000 --- a/app/tests/studio/remove-layer/basic/native_sim.keymap +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -// Test removing layer 1 -&kscan { - events = < - // remove layer 1 - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - // toggle layer 1 on - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - // press position 0,0 - should output A (layer 0) because layer 1 was removed - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - // toggle layer 2 on - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - // press position 0,0 - should output C (layer 2) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/studio/remove-layer/behavior_keymap.dtsi b/app/tests/studio/remove-layer/behavior_keymap.dtsi deleted file mode 100644 index 14f093df..00000000 --- a/app/tests/studio/remove-layer/behavior_keymap.dtsi +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -/ { - behaviors { - remove_layer_behavior: remove_layer_behavior { - compatible = "zmk,behavior-remove-layer"; - #binding-cells = <1>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp A &tog 1 - &remove_layer_behavior 1 &tog 2>; - }; - - layer_1 { - bindings = < - &kp B &tog 1 - &remove_layer_behavior 0 &trans>; - }; - - layer_2 { - bindings = < - &kp C &trans - &none &trans>; - }; - }; -}; diff --git a/app/tests/studio/remove-layer/remove-default-layer/events.patterns b/app/tests/studio/remove-layer/remove-default-layer/events.patterns deleted file mode 100644 index b11b5a68..00000000 --- a/app/tests/studio/remove-layer/remove-default-layer/events.patterns +++ /dev/null @@ -1,5 +0,0 @@ -s/.*layer_changed/layer_changed/p -s/.*hid_listener_keycode_//p -s/.*on_remove_layer_binding_pressed/remove_layer/p -s/.*tog_keymap_binding_pressed/tog_pressed/p - diff --git a/app/tests/studio/remove-layer/remove-default-layer/extra-cmake-args b/app/tests/studio/remove-layer/remove-default-layer/extra-cmake-args deleted file mode 100644 index c5e4f18e..00000000 --- a/app/tests/studio/remove-layer/remove-default-layer/extra-cmake-args +++ /dev/null @@ -1,5 +0,0 @@ --DCONFIG_ZMK_BEHAVIOR_METADATA=y --DCONFIG_ZMK_BEHAVIOR_LOCAL_IDS=y --DCONFIG_ZMK_KEYMAP_LAYER_REORDERING=y --DCONFIG_ZMK_KEYMAP_SETTINGS_STORAGE=y --DCONFIG_SETTINGS=y diff --git a/app/tests/studio/remove-layer/remove-default-layer/keycode_events.snapshot b/app/tests/studio/remove-layer/remove-default-layer/keycode_events.snapshot deleted file mode 100644 index ad99cc87..00000000 --- a/app/tests/studio/remove-layer/remove-default-layer/keycode_events.snapshot +++ /dev/null @@ -1,8 +0,0 @@ -tog_pressed: position 1 layer 1 -layer_changed: layer 1 state 1 locked 1 -remove_layer: Removed layer at index 0 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 1 layer 1 -pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/studio/remove-layer/remove-default-layer/native_sim.conf b/app/tests/studio/remove-layer/remove-default-layer/native_sim.conf deleted file mode 100644 index 3fb69a9d..00000000 --- a/app/tests/studio/remove-layer/remove-default-layer/native_sim.conf +++ /dev/null @@ -1 +0,0 @@ -CONFIG_ZMK_TEST_BEHAVIORS=y \ No newline at end of file diff --git a/app/tests/studio/remove-layer/remove-default-layer/native_sim.keymap b/app/tests/studio/remove-layer/remove-default-layer/native_sim.keymap deleted file mode 100644 index 1aa43a6a..00000000 --- a/app/tests/studio/remove-layer/remove-default-layer/native_sim.keymap +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -// Test removing layer 0: layer 1 becomes bottom layer -&kscan { - events = < - // toggle layer 1 on - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - // remove layer 0 - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - // press position 0,0 - should output B (layer 1) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - // try to toggle layer 1 off - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - // press position 0,0 - should output B - // (layer 1 is now the bottom layer, so shouldn't be disabled) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; diff --git a/app/tests/studio/remove-layer/remove-default-layer/pending b/app/tests/studio/remove-layer/remove-default-layer/pending deleted file mode 100644 index 2e474100..00000000 --- a/app/tests/studio/remove-layer/remove-default-layer/pending +++ /dev/null @@ -1,2 +0,0 @@ -This test fails because the keymap function handling position state changes doesn't work correctly when the default layer is removed. -The iteration loop's end condition is incorrect. \ No newline at end of file diff --git a/app/tests/tap-dance/1a-tap1/native_sim.keymap b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/1a-tap1/native_sim.keymap rename to app/tests/tap-dance/1a-tap1/native_posix_64.keymap diff --git a/app/tests/tap-dance/1b-tap2/native_sim.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/1b-tap2/native_sim.keymap rename to app/tests/tap-dance/1b-tap2/native_posix_64.keymap diff --git a/app/tests/tap-dance/1c-tap3/native_sim.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/1c-tap3/native_sim.keymap rename to app/tests/tap-dance/1c-tap3/native_posix_64.keymap diff --git a/app/tests/tap-dance/2a-hold1/native_sim.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/2a-hold1/native_sim.keymap rename to app/tests/tap-dance/2a-hold1/native_posix_64.keymap diff --git a/app/tests/tap-dance/2b-hold2/native_sim.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/2b-hold2/native_sim.keymap rename to app/tests/tap-dance/2b-hold2/native_posix_64.keymap diff --git a/app/tests/tap-dance/2c-hold3/native_sim.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/2c-hold3/native_sim.keymap rename to app/tests/tap-dance/2c-hold3/native_posix_64.keymap diff --git a/app/tests/tap-dance/3a-tap-int-mid/native_sim.keymap b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3a-tap-int-mid/native_sim.keymap rename to app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap diff --git a/app/tests/tap-dance/3b-tap-int-seq/native_sim.keymap b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3b-tap-int-seq/native_sim.keymap rename to app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap diff --git a/app/tests/tap-dance/3c-tap-int-after/native_sim.keymap b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3c-tap-int-after/native_sim.keymap rename to app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap diff --git a/app/tests/tap-dance/3d-hold-int-mid/native_sim.keymap b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3d-hold-int-mid/native_sim.keymap rename to app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap diff --git a/app/tests/tap-dance/3e-hold-int-seq/native_sim.keymap b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3e-hold-int-seq/native_sim.keymap rename to app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap diff --git a/app/tests/tap-dance/3f-hold-int-after/native_sim.keymap b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3f-hold-int-after/native_sim.keymap rename to app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap diff --git a/app/tests/tap-dance/4a-single/native_sim.keymap b/app/tests/tap-dance/4a-single/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/4a-single/native_sim.keymap rename to app/tests/tap-dance/4a-single/native_posix_64.keymap diff --git a/app/tests/tap-dance/5a-tdint-mid/native_sim.keymap b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5a-tdint-mid/native_sim.keymap rename to app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap diff --git a/app/tests/tap-dance/5b-tdint-seq/native_sim.keymap b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5b-tdint-seq/native_sim.keymap rename to app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap diff --git a/app/tests/tap-dance/5c-tdint-after/native_sim.keymap b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5c-tdint-after/native_sim.keymap rename to app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap diff --git a/app/tests/tap-dance/5d-tdint-multiple/native_sim.keymap b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5d-tdint-multiple/native_sim.keymap rename to app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap diff --git a/app/tests/tap-dance/6-combo-tap2/native_sim.keymap b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/6-combo-tap2/native_sim.keymap rename to app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap diff --git a/app/tests/tap-dance/behavior_keymap.dtsi b/app/tests/tap-dance/behavior_keymap.dtsi index e45aba40..ce80e958 100644 --- a/app/tests/tap-dance/behavior_keymap.dtsi +++ b/app/tests/tap-dance/behavior_keymap.dtsi @@ -6,15 +6,17 @@ behaviors { ht: hold_tap { compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP"; #binding-cells = <2>; tapping-term-ms = <200>; - quick-tap-ms = <0>; + quick_tap_ms = <0>; flavor = "tap-preferred"; bindings = <&kp>, <&kp>; }; tdm: tap_dance_mixed { compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_MOD"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&ht LSHIFT A>, <&ht LALT B>, <&ht LGUI C>; @@ -22,6 +24,7 @@ tdb: tap_dance_basic { compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_BASIC"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp N1>, <&kp N2>, <&kp N3>; @@ -29,6 +32,7 @@ td2: tap_dance_basic_2 { compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_BASIC_2"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp A>, <&kp B>, <&kp C>; @@ -36,6 +40,7 @@ tds: tap_dance_single { compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_SINGlE"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp S>; @@ -54,6 +59,7 @@ keymap { compatible = "zmk,keymap"; + label = "Default keymap"; default_layer { bindings = < diff --git a/app/tests/to-layer/behavior_keymap.dtsi b/app/tests/to-layer/behavior_keymap.dtsi index 0be9cb96..7dc857fe 100644 --- a/app/tests/to-layer/behavior_keymap.dtsi +++ b/app/tests/to-layer/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/to-layer/normal/keycode_events.snapshot b/app/tests/to-layer/normal/keycode_events.snapshot index dcb1335c..a98f7479 100644 --- a/app/tests/to-layer/normal/keycode_events.snapshot +++ b/app/tests/to-layer/normal/keycode_events.snapshot @@ -1,18 +1,18 @@ kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 1 layer 1 -layer_changed: layer 1 state 1 locked 1 +layer_changed: layer 1 state 1 to_released: position 1 layer 1 kp_pressed: usage_page 0x07 keycode 0x0E implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x0E implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 0 layer 0 -layer_changed: layer 1 state 0 locked 1 -layer_changed: layer 0 state 1 locked 1 +layer_changed: layer 1 state 0 +layer_changed: layer 0 state 1 to_released: position 0 layer 0 kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 0 layer 0 to_released: position 0 layer 0 to_pressed: position 1 layer 1 -layer_changed: layer 1 state 1 locked 1 +layer_changed: layer 1 state 1 to_released: position 1 layer 1 diff --git a/app/tests/to-layer/normal/native_sim.keymap b/app/tests/to-layer/normal/native_posix_64.keymap similarity index 100% rename from app/tests/to-layer/normal/native_sim.keymap rename to app/tests/to-layer/normal/native_posix_64.keymap diff --git a/app/tests/toggle-layer/behavior_keymap.dtsi b/app/tests/toggle-layer/behavior_keymap.dtsi index 8fbf4858..1ecf8599 100644 --- a/app/tests/toggle-layer/behavior_keymap.dtsi +++ b/app/tests/toggle-layer/behavior_keymap.dtsi @@ -3,23 +3,14 @@ #include / { - behaviors { - tog_off: toggle_layer_off_only { - compatible = "zmk,behavior-toggle-layer"; - #binding-cells = <1>; - display-name = "Toggle Layer Off"; - toggle-mode = "off"; - locking; - }; - }; - keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < &kp B &tog 1 - &mo 2 &to 1>; + &kp D &kp G>; }; lower_layer { @@ -30,8 +21,8 @@ raise_layer { bindings = < - &kp W &tog 2 - &tog_off 2 &mo 2>; + &kp W &kp U + &kp X &kp M>; }; }; }; diff --git a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap new file mode 100644 index 00000000..0a0c88ea --- /dev/null +++ b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap @@ -0,0 +1,9 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/app/tests/toggle-layer/locking/events.patterns b/app/tests/toggle-layer/locking/events.patterns deleted file mode 100644 index 05b8cd15..00000000 --- a/app/tests/toggle-layer/locking/events.patterns +++ /dev/null @@ -1,3 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*tog_keymap_binding/tog/p -s/.*mo_keymap_binding/mo/p \ No newline at end of file diff --git a/app/tests/toggle-layer/locking/keycode_events.snapshot b/app/tests/toggle-layer/locking/keycode_events.snapshot deleted file mode 100644 index 73f4d251..00000000 --- a/app/tests/toggle-layer/locking/keycode_events.snapshot +++ /dev/null @@ -1,16 +0,0 @@ -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -mo_pressed: position 2 layer 2 -tog_pressed: position 1 layer 2 -tog_released: position 1 layer 2 -mo_released: position 2 layer 2 -kp_pressed: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 -mo_pressed: position 3 layer 2 -mo_released: position 3 layer 2 -kp_pressed: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 1 layer 2 -tog_released: position 1 layer 2 -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/toggle-layer/locking/native_posix_64.keymap b/app/tests/toggle-layer/locking/native_posix_64.keymap deleted file mode 100644 index fc70576e..00000000 --- a/app/tests/toggle-layer/locking/native_posix_64.keymap +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; \ No newline at end of file diff --git a/app/tests/toggle-layer/normal/keycode_events.snapshot b/app/tests/toggle-layer/normal/keycode_events.snapshot index 1d28c7f9..515772a4 100644 --- a/app/tests/toggle-layer/normal/keycode_events.snapshot +++ b/app/tests/toggle-layer/normal/keycode_events.snapshot @@ -2,7 +2,3 @@ tog_pressed: position 1 layer 1 tog_released: position 1 layer 1 kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 1 layer 1 -tog_released: position 1 layer 1 -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/toggle-layer/normal/native_posix_64.keymap b/app/tests/toggle-layer/normal/native_posix_64.keymap new file mode 100644 index 00000000..97bdd179 --- /dev/null +++ b/app/tests/toggle-layer/normal/native_posix_64.keymap @@ -0,0 +1,8 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/app/tests/toggle-layer/toggle-mode-off/events.patterns b/app/tests/toggle-layer/toggle-mode-off/events.patterns deleted file mode 100644 index 30996ad0..00000000 --- a/app/tests/toggle-layer/toggle-mode-off/events.patterns +++ /dev/null @@ -1,4 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*to_keymap_binding/to/p -s/.*layer_changed/layer_changed/p -s/.*tog_keymap_binding/tog/p \ No newline at end of file diff --git a/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot b/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot deleted file mode 100644 index e7db477d..00000000 --- a/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot +++ /dev/null @@ -1,14 +0,0 @@ -tog_pressed: position 1 layer 1 -tog_released: position 1 layer 1 -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -to_pressed: position 3 layer 1 -layer_changed: layer 1 state 1 locked 1 -to_released: position 3 layer 1 -kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 1 layer 1 -layer_changed: layer 1 state 0 locked 1 -tog_released: position 1 layer 1 -kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/toggle-layer/toggle-mode-off/native_sim.keymap b/app/tests/toggle-layer/toggle-mode-off/native_sim.keymap deleted file mode 100644 index a89182fc..00000000 --- a/app/tests/toggle-layer/toggle-mode-off/native_sim.keymap +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -&tog { - toggle-mode = "off"; -}; - -&kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; -}; \ No newline at end of file diff --git a/app/tests/toggle-layer/toggle-mode-on/events.patterns b/app/tests/toggle-layer/toggle-mode-on/events.patterns deleted file mode 100644 index 397fef4f..00000000 --- a/app/tests/toggle-layer/toggle-mode-on/events.patterns +++ /dev/null @@ -1,2 +0,0 @@ -s/.*hid_listener_keycode/kp/p -s/.*tog_keymap_binding/tog/p \ No newline at end of file diff --git a/app/tests/toggle-layer/toggle-mode-on/keycode_events.snapshot b/app/tests/toggle-layer/toggle-mode-on/keycode_events.snapshot deleted file mode 100644 index 3dd5f27e..00000000 --- a/app/tests/toggle-layer/toggle-mode-on/keycode_events.snapshot +++ /dev/null @@ -1,8 +0,0 @@ -tog_pressed: position 1 layer 1 -tog_released: position 1 layer 1 -kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 -tog_pressed: position 1 layer 1 -tog_released: position 1 layer 1 -kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/transparent/behavior_keymap.dtsi b/app/tests/transparent/behavior_keymap.dtsi index b70c8421..dd5ded90 100644 --- a/app/tests/transparent/behavior_keymap.dtsi +++ b/app/tests/transparent/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/tests/transparent/layered/native_sim.keymap b/app/tests/transparent/layered/native_posix_64.keymap similarity index 100% rename from app/tests/transparent/layered/native_sim.keymap rename to app/tests/transparent/layered/native_posix_64.keymap diff --git a/app/tests/transparent/normal/native_posix_64.keymap b/app/tests/transparent/normal/native_posix_64.keymap new file mode 100644 index 00000000..502f7ccc --- /dev/null +++ b/app/tests/transparent/normal/native_posix_64.keymap @@ -0,0 +1,8 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_sim.conf b/app/tests/wpm/1-single_keypress/native_posix_64.conf similarity index 100% rename from app/tests/wpm/1-single_keypress/native_sim.conf rename to app/tests/wpm/1-single_keypress/native_posix_64.conf diff --git a/app/tests/wpm/1-single_keypress/native_sim.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap similarity index 100% rename from app/tests/wpm/1-single_keypress/native_sim.keymap rename to app/tests/wpm/1-single_keypress/native_posix_64.keymap diff --git a/app/tests/wpm/2-multiple_keypress/native_sim.conf b/app/tests/wpm/2-multiple_keypress/native_posix_64.conf similarity index 100% rename from app/tests/wpm/2-multiple_keypress/native_sim.conf rename to app/tests/wpm/2-multiple_keypress/native_posix_64.conf diff --git a/app/tests/wpm/2-multiple_keypress/native_sim.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap similarity index 100% rename from app/tests/wpm/2-multiple_keypress/native_sim.keymap rename to app/tests/wpm/2-multiple_keypress/native_posix_64.keymap diff --git a/app/tests/wpm/behavior_keymap.dtsi b/app/tests/wpm/behavior_keymap.dtsi index 5f7cfd2d..52f9421c 100644 --- a/app/tests/wpm/behavior_keymap.dtsi +++ b/app/tests/wpm/behavior_keymap.dtsi @@ -5,6 +5,7 @@ / { keymap { compatible = "zmk,keymap"; + label ="Default keymap"; default_layer { bindings = < diff --git a/app/west.yml b/app/west.yml index 0d9d1e02..ffa36ca3 100644 --- a/app/west.yml +++ b/app/west.yml @@ -7,7 +7,7 @@ manifest: projects: - name: zephyr remote: zmkfirmware - revision: v4.1.0+zmk-fixes + revision: v3.2.0+zmk-fixes clone-depth: 1 import: name-blocklist: @@ -18,6 +18,7 @@ manifest: - hal_microchip - hal_nxp - hal_openisa + - hal_silabs - hal_xtensa - hal_st - hal_ti @@ -28,20 +29,6 @@ manifest: - openthread - edtt - trusted-firmware-m - - name: hal_stm32 - revision: 4fcc3a3f32abe1c4cb76d9d1cef967728dd03908 - path: modules/hal/stm32 - remote: zmkfirmware - groups: - - hal - - name: lvgl - revision: f1db87ee98f1810328a8419572fa42a3b5f352ae - path: modules/lib/gui/lvgl - remote: zmkfirmware - - name: zmk-studio-messages - revision: 6cb4c283e76209d59c45fbcb218800cd19e9339d - path: modules/msgs/zmk-studio-messages - remote: zmkfirmware - group-filter: [+optional] + - sof self: west-commands: scripts/west-commands.yml diff --git a/docs/.eslintignore b/docs/.eslintignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/docs/.eslintignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/docs/.eslintrc.js b/docs/.eslintrc.js new file mode 100644 index 00000000..b5fc0745 --- /dev/null +++ b/docs/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + node: true, + }, + extends: [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:mdx/recommended", + "prettier", + ], + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2021, + sourceType: "module", + }, + plugins: ["react"], + rules: {}, + settings: { + react: { + version: "detect", + }, + }, +}; diff --git a/docs/.prettierignore b/docs/.prettierignore index 5b489b61..2e03c0b0 100644 --- a/docs/.prettierignore +++ b/docs/.prettierignore @@ -3,4 +3,3 @@ build .docusaurus *.mustache hardware-metadata.json -src/hardware-metadata.d.ts diff --git a/docs/.prettierrc.js b/docs/.prettierrc.js index 2a60b0bd..2a1f0b48 100644 --- a/docs/.prettierrc.js +++ b/docs/.prettierrc.js @@ -1,4 +1,3 @@ module.exports = { endOfLine: "auto", - trailingComma: "es5", }; diff --git a/docs/blog/2020-05-24-wip.md b/docs/blog/2020-05-24-wip.md index e2d2e022..9b81bdff 100644 --- a/docs/blog/2020-05-24-wip.md +++ b/docs/blog/2020-05-24-wip.md @@ -1,6 +1,9 @@ --- title: WIP -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [keyboards, firmware, oss, ble] --- @@ -8,5 +11,3 @@ This blog is a work-in-progress as I work on basic docs + blog on this nascent k As is, there are more features _missing_ from ZMK than features it has. As always with pre-alpha software, if something breaks, you get to keep both halves! (especially if it is a split KB) - - diff --git a/docs/blog/2020-08-12-zmk-sotf-1.md b/docs/blog/2020-08-12-zmk-sotf-1.md index 9ea4038b..afa03405 100644 --- a/docs/blog/2020-08-12-zmk-sotf-1.md +++ b/docs/blog/2020-08-12-zmk-sotf-1.md @@ -1,6 +1,9 @@ --- title: "ZMK State Of The Firmware #1" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [SOTF, keyboards, firmware, oss, ble] --- @@ -8,17 +11,15 @@ Welcome to the first ZMK "State Of The Firmware"! With interest and Discord activity growing, it seemed important to lay out the progress made recently, current major bugs/showstoppers, and planned next steps. - - ## Recent Activity There's been lots of various activity in ZMK land! -- [Nicell](https://github.com/Nicell) (nice!nano creator) contributed initial [RGB Underglow](/docs/features/lighting#rgb-underglow) ([#64](https://github.com/zmkfirmware/zmk/pull/64)) support to ZMK. +- [Nicell](https://github.com/Nicell) (nice!nano creator) contributed initial [RGB Underglow](/docs/features/underglow) ([#64](https://github.com/zmkfirmware/zmk/pull/64)) support to ZMK. - Tons of [documentation](/docs) work. -- Refactoring ([#73](https://github.com/zmkfirmware/zmk/pull/73), [#74](https://github.com/zmkfirmware/zmk/pull/74)) of [keymaps](/docs/keymaps) to make them simpler for users. +- Refactoring ([#73](https://github.com/zmkfirmware/zmk/pull/73), [#74](https://github.com/zmkfirmware/zmk/pull/74)) of [keymaps](/docs/features/keymaps) to make them simpler for users. - Mod-Tap Behavior (docs coming!) is much improved ([#69](https://github.com/zmkfirmware/zmk/pull/69)) and usable now. -- An initial `setup.sh` script was created, allowing users to quickly bootstrap a "user config" setup and push it to GitHub, where GitHub Actions will build the firmware for you. +- An initial [`setup.sh`](http://localhost:3000/docs/user-setup#user-config-setup-script) script was created, allowing users to quickly bootstrap a "user config" setup and push it to GitHub, where GitHub Actions will build the firmware for you. - Corne shield ([#80](https://github.com/zmkfirmware/zmk/pull/80)) shield definition was added. - Initial [encoder](/docs/features/encoders) support ([#61](https://github.com/zmkfirmware/zmk/pull/61)) was added. diff --git a/docs/blog/2020-09-21-zmk-sotf-2.md b/docs/blog/2020-09-21-zmk-sotf-2.md index c65898f0..61e29422 100644 --- a/docs/blog/2020-09-21-zmk-sotf-2.md +++ b/docs/blog/2020-09-21-zmk-sotf-2.md @@ -1,6 +1,9 @@ --- title: "ZMK State Of The Firmware #2" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [SOTF, keyboards, firmware, oss, ble] --- @@ -9,8 +12,6 @@ Welcome to the second ZMK "State Of The Firmware" (SOTF)! This update will cover all the major activity since [SOTF #1](/blog/2020/08/12/zmk-sotf-1), preparations for the upcoming Hacktoberfest activity, and a current open call for community feedback on a ZMK mascot. - - ## Recent Activity So much going on in ZMK! diff --git a/docs/blog/2020-10-03-bootloader-fix.md b/docs/blog/2020-10-03-bootloader-fix.md index 41495fe5..435034cf 100644 --- a/docs/blog/2020-10-03-bootloader-fix.md +++ b/docs/blog/2020-10-03-bootloader-fix.md @@ -1,6 +1,9 @@ --- title: Fixing the Mysterious Broken Bootloader -authors: nickwinans +author: Nick Winans +author_title: Contributor +author_url: https://github.com/Nicell +author_image_url: https://avatars1.githubusercontent.com/u/9439650 tags: [bootloader, keyboards, firmware, oss, ble] --- @@ -9,8 +12,6 @@ Recently I was able to fix the "stuck in the bootloader" issue in for quite some time. I want to go over what the issue was, how the issue was diagnosed, and how it was fixed. - - ## Background What exactly is the "stuck in the bootloader" issue? Seemingly randomly, users' @@ -175,6 +176,7 @@ this to all of the `.dts` files for the boards that were affected by this issue. ```diff code_partition: partition@26000 { + label = "code_partition"; - reg = <0x00026000 0x000d2000>; + reg = <0x00026000 0x000c6000>; }; @@ -182,6 +184,7 @@ this to all of the `.dts` files for the boards that were affected by this issue. - storage_partition: partition@f8000 { + storage_partition: partition@ec000 { + label = "storage"; - reg = <0x000f8000 0x00008000>; + reg = <0x000ec000 0x00008000>; }; @@ -190,7 +193,3 @@ this to all of the `.dts` files for the boards that were affected by this issue. And with those changes, we should no longer run into this issue! In the process of these changes, we lost 48KB of space for application code, but we're only using around 20% of it anyways. 🎉 - -## Article Updates - -- 12/2023: Removed the deprecated `label` property from code snippets. diff --git a/docs/blog/2020-11-09-zmk-sotf-3.md b/docs/blog/2020-11-09-zmk-sotf-3.md index 428fe408..11d67040 100644 --- a/docs/blog/2020-11-09-zmk-sotf-3.md +++ b/docs/blog/2020-11-09-zmk-sotf-3.md @@ -1,6 +1,9 @@ --- title: "ZMK State Of The Firmware #3" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [SOTF, keyboards, firmware, oss, ble] --- @@ -8,8 +11,6 @@ Welcome to the third ZMK "State Of The Firmware" (SOTF)! This update will cover all the major activity since [SOTF #2](/blog/2020/09/21/zmk-sotf-2). This edition comes a bit later than planned, but the amount of features and changes will hopefully make it worth it! - - ## Recent Activity Here's a summary of the various major changes since last time, broken down by theme: @@ -21,7 +22,7 @@ Tons of activity related to keymaps, so we'll go into more detail this time. #### Codes Overhaul [innovaker] _completely_ overhauled the set of available codes for keymaps, and simultaneously has created -_beautiful_ [documentation](/docs/keymaps/list-of-keycodes) to help users visualize the codes, and also understand if they are supported on their particular operating system. +_beautiful_ [documentation](/docs/codes) to help users visualize the codes, and also understand if they are supported on their particular operating system. This also laid the foundation for the other keymap related changes that are now available. @@ -36,7 +37,7 @@ This also laid the foundation for the other keymap related changes that are now which sends `Control + c` when pressed. This feature is often used on smaller keyboards to achieve "shifted keycodes", e.g. `LS(N1)` to send a `!`. To make this easier, in addition to all the normal codes, we now have defines for common shifted codes, e.g. `EXCL` for `!`, `AT` for `@`, etc. -To learn more, check out the [Modifiers](/docs/keymaps/modifiers) documentation. +To learn more, check out the [Modifiers](/docs/codes/modifiers) documentation. #### Simplified Key Press Behavior @@ -66,7 +67,7 @@ With this change, you can add &ext_power EP_TOG ``` -to toggle (on/off) the power to external hardware like RGB underglow or OLEDs. Check out the [external power control](/docs/keymaps/behaviors/power#external-power-control) docs for more info. +to toggle (on/off) the power to external hardware like RGB underglow or OLEDs. Check out the [external power control](/docs/behaviors/power#external-power-control) docs for more info. #### Deep Sleep @@ -77,7 +78,7 @@ included some automatic power savings by switching to PORT events on the nRF52 c #### Output Selection -[joelspadin] added [output selection](/docs/keymaps/behaviors/outputs) to allow selecting whether to send output over USB or BLE if both are connected. This should now help avoid having "double keypresses" when your keyboard is plugged into a host. +[joelspadin] added [output selection](/docs/behaviors/outputs) to allow selecting whether to send output over USB or BLE if both are connected. This should now help avoid having "double keypresses" when your keyboard is plugged into a host. #### Bootloader Corruption Fix diff --git a/docs/blog/2021-01-27-zmk-sotf-4.md b/docs/blog/2021-01-27-zmk-sotf-4.md index f3105a4a..fbb53e40 100644 --- a/docs/blog/2021-01-27-zmk-sotf-4.md +++ b/docs/blog/2021-01-27-zmk-sotf-4.md @@ -1,6 +1,9 @@ --- title: "ZMK State Of The Firmware #4" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [SOTF, keyboards, firmware, oss, ble] --- @@ -8,8 +11,6 @@ Welcome to the fourth ZMK "State Of The Firmware" (SOTF)! This update will cover all the major activity since [SOTF #3](/blog/2020/11/09/zmk-sotf-3). - - ## Recent Activity Here's a summary of the various major changes since last time, broken down by theme: @@ -20,7 +21,7 @@ Since last time, there have been several new powerful keymap features and behavi #### Combos -The initial [combos](/docs/keymaps/combos) work has landed! The amazing [okke-formsma] has once again delivered another powerful feature for ZMK. Combos are "position based", and are configured in a new toplevel node next to they `keymap` node in user's keymap files. +The initial [combos](/docs/features/combos) work has landed! The amazing [okke-formsma] has once again delivered another powerful feature for ZMK. Combos are "position based", and are configured in a new toplevel node next to they `keymap` node in user's keymap files. An example, that would send the `ESC` keycode when pressing both the first and second positions on your keyboard: @@ -59,7 +60,7 @@ for a sticky layer. #### `&to` Layer Behavior -[mcrosson] contributed the new [`&to`](/docs/keymaps/behaviors/layers#to-layer) layer related behavior. This can be used to completely replace the active layer with a new one. +[mcrosson] contributed the new [`&to`](/docs/behaviors/layers#to-layer) layer related behavior. This can be used to completely replace the active layer with a new one. This is most frequently used when using multiple core base layers with different layouts, e.g. QWERTY and DVORAK, to switch between them. @@ -75,11 +76,11 @@ to your keymap will send `ESC` when pressed on its own, but will send `` ` `` wh #### RGB Underglow Color Selection -[mcrosson] updated the [RGB Underglow behavior](/docs/keymaps/behaviors/underglow) to allow [binding an explicit color selection](/docs/keymaps/behaviors/underglow#examples) to a key position. +[mcrosson] updated the [RGB Underglow behavior](/docs/behaviors/underglow) to allow [binding an explicit color selection](/docs/behaviors/underglow#examples) to a key position. #### Keymap Upgrader -[joelspadin] completed the [Keymap Upgrader](/keymap-upgrader) which can be used to update your keymap to using the latest supported codes, and move away from the old deprecated codes. +[joelspadin] completed the [Keymap Upgrader](/docs/codes/keymap-upgrader) which can be used to update your keymap to using the latest supported codes, and move away from the old deprecated codes. If you've made keymap customizations, please make sure to run your keymaps through the upgrader, since the old deprecated codes will be removed in a future version of ZMK. @@ -97,7 +98,7 @@ There has been lots of work to get display support complete enough for use by en #### Highest Layer Display -[mcrosson] has contributed the next display widget, showing the highest active layer in the keymap. [petejohanson] then added a small follow up to allow layers in keymaps to add a `name` property to each layer, e.g. `name = "Nav";` and have that name be displayed in the widget instead of the numeric layer number. +[mcrosson] has contributed the next display widget, showing the highest active layer in the keymap. [petejohanson] then added a small follow up to allow layers in keymaps to add a `label` property to each layer, e.g. `label = "Nav";` and have that label be displayed in the widget instead of the numeric layer number. #### WPM @@ -191,7 +192,3 @@ Thanks again to the numerous contributors, testers, and users who have made work [petejohanson]: https://github.com/petejohanson [innovaker]: https://github.com/innovaker [joelspadin]: https://github.com/joelspadin - -## Article Updates - -- 12/2023: The `label` property for keymap layers was renamed to `display-name`. diff --git a/docs/blog/2021-07-17-zephyr-2-5.md b/docs/blog/2021-07-17-zephyr-2-5.md index 4d119ade..153027bb 100644 --- a/docs/blog/2021-07-17-zephyr-2-5.md +++ b/docs/blog/2021-07-17-zephyr-2-5.md @@ -1,13 +1,14 @@ --- title: "Zephyr 2.5 Update" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [firmware, zephyr, core] --- I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/736/) to upgrade ZMK to [Zephyr 2.5](https://docs.zephyrproject.org/2.5.0/releases/release-notes-2.5.html)! - - A big part of this work was some _major_ refactors and improvements by [innovaker] to our [zmk-docker](https://github.com/zmkfirmware/zmk-docker/) Docker image and GH Actions automation. - Faster build times with improved caching. @@ -60,7 +61,7 @@ Once the container has rebuilt, VS Code will be running the 2.5 Docker image. The following steps will get you building ZMK locally against Zephyr 2.5: -- Run the updated [toolchain installation](/docs/development/local-toolchain/setup) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) - pull the latest ZMK `main` with `git pull` for your ZMK checkout - run `west update` to pull the updated Zephyr version and its dependencies diff --git a/docs/blog/2022-03-08-zephyr-3-0-upgrade-prep.md b/docs/blog/2022-03-08-zephyr-3-0-upgrade-prep.md index 6086991b..2f3c79ee 100644 --- a/docs/blog/2022-03-08-zephyr-3-0-upgrade-prep.md +++ b/docs/blog/2022-03-08-zephyr-3-0-upgrade-prep.md @@ -1,14 +1,15 @@ --- title: "Zephyr 3.0 Update Preparation" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [firmware, zephyr, core] --- As preparation for completing the [work](https://github.com/zmkfirmware/zmk/pull/1143) to upgrade ZMK to [Zephyr 3.0](https://docs.zephyrproject.org/3.0.0/releases/release-notes-3.0.html), users with user config repositories who wish to avoid future build failures with their GitHub Actions workflows can take steps to adjust their repositories now. - - GitHub Actions needs to use our latest Docker image to ensure continued compatibility with the ZMK codebase on Zephyr 3.0 (and beyond). You should: - Open `.github/workflows/build.yml` in your editor/IDE diff --git a/docs/blog/2022-04-02-zephyr-3-0.md b/docs/blog/2022-04-02-zephyr-3-0.md index 539f6dc7..6ec4c904 100644 --- a/docs/blog/2022-04-02-zephyr-3-0.md +++ b/docs/blog/2022-04-02-zephyr-3-0.md @@ -1,13 +1,14 @@ --- title: "Zephyr 3.0 Update" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [firmware, zephyr, core] --- I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1143) to upgrade ZMK to [Zephyr 3.0](https://docs.zephyrproject.org/3.0.0/releases/release-notes-3.0.html)! - - [petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes. - Moving to Zephyr's UF2 build integration that was submitted upstream by [petejohanson] @@ -61,7 +62,7 @@ Once the container has rebuilt, VS Code will be running the 3.0 Docker image. The following steps will get you building ZMK locally against Zephyr 3.0: -- Run the updated [toolchain installation](/docs/development/local-toolchain/setup) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) - pull the latest ZMK `main` with `git pull` for your ZMK checkout - run `west update` to pull the updated Zephyr version and its dependencies @@ -73,11 +74,12 @@ The following changes have [already been completed](https://github.com/zmkfirmwa ### RGB Underglow -Zephyr's WS2812 `led_strip` driver added a new required property. When adding [underglow](/docs/features/lighting#adding-rgb-underglow-support-to-a-keyboard) to a board, you now must also add the additional include `#include ` at the top of your devicetree file, and add a `color-mapping` property like: +Zephyr's WS2812 `led_strip` driver added a new required property. When adding [underglow](/docs/features/underglow#adding-rgb-underglow-to-a-board) to a board, you now must also add the additional include `#include ` at the top of your devicetree file, and add a `color-mapping` property like: ```dts led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ @@ -113,6 +115,7 @@ For example, for a shield with: oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; + label = "SSD1306"; width = <128>; height = <32>; segment-offset = <0>; @@ -150,6 +153,7 @@ Underneath the USB device, add the CDC ACM node: status = "okay"; cdc_acm_uart: cdc_acm_uart { compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; }; }; ``` @@ -222,7 +226,3 @@ This will also enable us to support the XIAO compatible Adafruit Qt Py RP2040 an Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. [petejohanson]: https://github.com/petejohanson - -## Article Updates - -- 12/2023: Removed the deprecated `label` property from code snippets. diff --git a/docs/blog/2022-04-10-zmk-sotf-5.md b/docs/blog/2022-04-10-zmk-sotf-5.md index e771f2e2..4ea62a31 100644 --- a/docs/blog/2022-04-10-zmk-sotf-5.md +++ b/docs/blog/2022-04-10-zmk-sotf-5.md @@ -1,6 +1,9 @@ --- title: "ZMK State Of The Firmware #5" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [SOTF, keyboards, firmware, oss, ble] --- @@ -8,8 +11,6 @@ Welcome to the fifth ZMK "State Of The Firmware" (SOTF)! This update will cover all the major activity since [SOTF #4](/blog/2021/01/27/zmk-sotf-4). That was over a year ago, so lots to cover! - - ## Recent Activity Here's a summary of the various major changes since last time, broken down by theme: @@ -20,16 +21,16 @@ Since last time, there have been several new powerful keymap features and behavi #### Caps Word -[petejohanson] added the [caps word](/docs/keymaps/behaviors/caps-word) behavior, i.e. `&caps_word`, in [#823](https://github.com/zmkfirmware/zmk/pull/823) that allows toggling a mode where all all alpha characters are sent +[petejohanson] added the [caps word](/docs/behaviors/caps-word) behavior, i.e. `&caps_word`, in [#823](https://github.com/zmkfirmware/zmk/pull/823) that allows toggling a mode where all all alpha characters are sent to the host capitalized until a non-alpha, non-"continue list" keycode is sent. This can be useful for typing things like `CONFIG_ENABLE_CAPS_WORD` without having to hold down shift. This is similar in spirit to using the caps lock key, but with the added benefit of turning itself off automatically. #### Key Repeat -[petejohanson] added the new [key repeat](/docs/keymaps/behaviors/key-repeat) behavior in [#1034](https://github.com/zmkfirmware/zmk/pull/1034) to allow repeating the last sent key-press again, including any modifiers that were applied to that key press. It can be added to your keymap using the simple `&key_repeat` reference. +[petejohanson] added the new [key repeat](/docs/behaviors/key-repeat) behavior in [#1034](https://github.com/zmkfirmware/zmk/pull/1034) to allow repeating the last sent key-press again, including any modifiers that were applied to that key press. It can be added to your keymap using the simple `&key_repeat` reference. #### Macros -[petejohanson], taking heavy inspiration on the initial work from [okke-formsma], added [macro support](/docs/keymaps/behaviors/macros) in [#1168](https://github.com/zmkfirmware/zmk/pull/1166). Several [common patterns](/docs/keymaps/behaviors/macros#common-patterns) are documented, but one example, changing the underglow color as you activate/deactivate a layer, looks like: +[petejohanson], taking heavy inspiration on the initial work from [okke-formsma], added [macro support](/docs/behaviors/macros) in [#1168](https://github.com/zmkfirmware/zmk/pull/1166). Several [common patterns](/docs/behaviors/macros#common-patterns) are documented, but one example, changing the underglow color as you activate/deactivate a layer, looks like: ```dts ZMK_MACRO(layer_color_macro, @@ -46,7 +47,7 @@ ZMK_MACRO(layer_color_macro, #### Tap Dance -[kurtis-lew] worked diligently to add the [tap-dance behavior](/docs/keymaps/behaviors/tap-dance) in [#1139](https://github.com/zmkfirmware/zmk/pull/1139), allowing different behaviors to be invoked based on the number of times +[kurtis-lew] worked diligently to add the [tap-dance behavior](/docs/behaviors/tap-dance) in [#1139](https://github.com/zmkfirmware/zmk/pull/1139), allowing different behaviors to be invoked based on the number of times a user taps a single key in their keymap, e.g. ```dts @@ -54,6 +55,7 @@ a user taps a single key in their keymap, e.g. behaviors { td0: tap_dance_0 { compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_0"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp N1>, <&kp N2>, <&kp N3>; @@ -74,7 +76,7 @@ a user taps a single key in their keymap, e.g. #### Conditional Layers -[bcat] added [conditional layers](/docs/keymaps/conditional-layers) in [#830](https://github.com/zmkfirmware/zmk/pull/830) as a generalized version of the common "adjust layer" pattern on smaller keyboards. +[bcat] added [conditional layers](/docs/features/conditional-layers) in [#830](https://github.com/zmkfirmware/zmk/pull/830) as a generalized version of the common "adjust layer" pattern on smaller keyboards. Example: @@ -92,23 +94,23 @@ Example: #### Combos -[mcrosson] added the [layer specific combos](https://zmk.dev/docs/keymaps/combos#configuration) in [#661](https://github.com/zmkfirmware/zmk/pull/661), so users can make certain combos only triggerable when the layers set for the combo are active. +[mcrosson] added the [layer specific combos](https://zmk.dev/docs/features/combos#configuration) in [#661](https://github.com/zmkfirmware/zmk/pull/661), so users can make certain combos only triggerable when the layers set for the combo are active. This is used by the [ZMK implementation](https://github.com/artseyio/zmk-artsey) of [ARTSEY](https://artsey.io/) extensively. #### Sticky Keys -[okke-formsma] updated [sticky keys](/docs/keymaps/behaviors/sticky-key) in [#1122](https://github.com/zmkfirmware/zmk/pull/1122) to add the `ignore-modifiers;` property; when set, sticky keys won't release when other modifiers are pressed. This allows you to combine sticky modifiers, which is popularly used with ["callum-style mods"](https://github.com/callum-oakley/qmk_firmware/tree/master/users/callum#oneshot-modifiers). +[okke-formsma] updated [sticky keys](/docs/behaviors/sticky-key) in [#1122](https://github.com/zmkfirmware/zmk/pull/1122) to add the `ignore-modifiers;` property; when set, sticky keys won't release when other modifiers are pressed. This allows you to combine sticky modifiers, which is popularly used with ["callum-style mods"](https://github.com/callum-oakley/qmk_firmware/tree/master/users/callum#oneshot-modifiers). #### Hold-Tap Improvements -[jmding8](https://github.com/jmding8) added an additional [positional hold-tap configuration](https://zmk.dev/docs/keymaps/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#835](https://github.com/zmkfirmware/zmk/pull/835) to help certain sequences produce the expected results. +[jmding8](https://github.com/jmding8) added an additional [positional hold-tap configuration](https://zmk.dev/docs/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#835](https://github.com/zmkfirmware/zmk/pull/835) to help certain sequences produce the expected results. -[jmding8](https://github.com/jmding8) also added an additional [hold-tap flavor: `tap-unless-interrupted`](https://zmk.dev/docs/keymaps/behaviors/hold-tap#flavors) in [#1018](https://github.com/zmkfirmware/zmk/pull/1018) which works very well with the new positional hold-tap config. +[jmding8](https://github.com/jmding8) also added an additional [hold-tap flavor: `tap-unless-interrupted`](https://zmk.dev/docs/behaviors/hold-tap#flavors) in [#1018](https://github.com/zmkfirmware/zmk/pull/1018) which works very well with the new positional hold-tap config. -[okke-formsma] implemented [`retro-tap` hold-tap property](https://zmk.dev/docs/keymaps/behaviors/hold-tap#retro-tap) in [#667](https://github.com/zmkfirmware/zmk/pull/667) +[okke-formsma] implemented [`retro-tap` hold-tap property](https://zmk.dev/docs/behaviors/hold-tap#retro-tap) in [#667](https://github.com/zmkfirmware/zmk/pull/667) -[okke-formsma] _also_ added [`quick-tap-ms` hold-tap property](https://zmk.dev/docs/keymaps/behaviors/hold-tap#quick-tap-ms) in [#655](https://github.com/zmkfirmware/zmk/pull/655) +[okke-formsma] _also_ added [`quick-tap-ms` hold-tap property](https://zmk.dev/docs/behaviors/hold-tap#quick-tap-ms) in [#655](https://github.com/zmkfirmware/zmk/pull/655) ### Apple Device Compatibility Improvements @@ -130,8 +132,8 @@ Another persistent bug that Apple users experienced was related to crashes and p The long awaited locality enhancement was finally merged by [petejohanson] in [#547](https://github.com/zmkfirmware/zmk/pull/547), allowing more fine grained control of where certain behaviors are invoked. Some key improvements thanks to the changes: -- [RGB Underglow](/docs/features/lighting#rgb-underglow) behaviors now run globally, so enabling/disabling RGB, changing the color, animation, etc. applies to both sides of a split properly. -- [Reset](/docs/keymaps/behaviors/reset#reset)/[Bootloader](/docs/keymaps/behaviors/reset#bootloader-reset) behaviors now run wherever the key was pressed. For example, adding a `&bootloader` reference to the peripheral side of a split will now put that side of the split into the bootloader when pressed. +- [RGB Underglow](/docs/features/underglow) behaviors now run globally, so enabling/disabling RGB, changing the color, animation, etc. applies to both sides of a split properly. +- [Reset](/docs/behaviors/reset#reset)/[Bootloader](/docs/behaviors/reset#bootloader) behaviors now run wherever the key was pressed. For example, adding a `&bootloader` reference to the peripheral side of a split will now put that side of the split into the bootloader when pressed. #### Split Connections @@ -141,7 +143,7 @@ The long awaited locality enhancement was finally merged by [petejohanson] in [# #### Backlight -[bortoz](https://github.com/bortoz) added [single color backlight support](/docs/features/lighting#backlight) in [#904](https://github.com/zmkfirmware/zmk/pull/904) for those keyboards that have it as an alternative to RGB underglow. +[bortoz](https://github.com/bortoz) added [single color backlight support](/docs/features/backlight) in [#904](https://github.com/zmkfirmware/zmk/pull/904) for those keyboards that have it as an alternative to RGB underglow. #### E-Paper Display (EPD) Driver @@ -219,7 +221,7 @@ This can be useful to be sure that lowering brightness doesn't set the brightnes ## Board/Shield Metadata -[nicell] and [petejohanson] worked together in [#883](https://github.com/zmkfirmware/zmk/pull/883) to settle on a [metadata format](/docs/hardware-integration/hardware-metadata-files) that is used to document every board and shield. This now drives automatic generation of our [supported hardware](/docs/hardware) page and our +[nicell] and [petejohanson] worked together in [#883](https://github.com/zmkfirmware/zmk/pull/883) to settle on a [metadata format](/docs/development/hardware-metadata-files) that is used to document every board and shield. This now drives automatic generation of our [supported hardware](/docs/hardware) page and our more nuanced GH Actions automation for testing changes to ZMK. ## Coming Soon! @@ -261,7 +263,3 @@ As we approach the two year birthday for ZMK, I am reminded of how far we have c [joelspadin]: https://github.com/joelspadin [bcat]: https://github.com/bcat [dxmh]: https://github.com/dxmh - -## Article Updates - -- 12/2023: Removed the deprecated `label` property from code snippets. diff --git a/docs/blog/2022-04-21-zmk-2yo.md b/docs/blog/2022-04-21-zmk-2yo.md index 102e0748..6ebadb96 100644 --- a/docs/blog/2022-04-21-zmk-2yo.md +++ b/docs/blog/2022-04-21-zmk-2yo.md @@ -1,13 +1,14 @@ --- title: "ZMK's Second Birthday" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [keyboards, firmware, oss] --- Two years ago, today, I minted the first ever commit for ZMK: - - ``` commit 85c8be89dea8f7a00e8efb06d38e2b32f3459935 Author: Pete Johanson @@ -58,7 +59,7 @@ The day I was finally able to type on a wireless, split keyboard running ZMK was ## Onward and Upward -We've come a long way since then, with our [supported hardware](/docs/hardware), [features](/docs/keymaps) and [behaviors](/docs/keymaps/behaviors/key-press) growing regularly. +We've come a long way since then, with our [supported hardware](/docs/hardware), [features](/docs/features/keymaps) and [behaviors](/docs/behaviors/key-press) growing regularly. ZMK powered keyboards are now available in group buys and in stock at various vendors; compatible controllers have been used in a wide range of builds to empower our users to free themselves from their USB/TRRS cables and move about untethered. diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md index a7d72402..69ecb6dd 100644 --- a/docs/blog/2023-04-06-zephyr-3-2.md +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -1,13 +1,14 @@ --- title: "Zephyr 3.2 Update" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [firmware, zephyr, core] --- I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1499) to upgrade ZMK to [Zephyr 3.2](https://docs.zephyrproject.org/3.2.0/releases/release-notes-3.2.html)! - - [petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes, with help from [Nicell] on the LVGL pieces. - Upgrade to LVGL 8.x API, and move to the new Kconfig settings. @@ -56,7 +57,7 @@ and then update it as appropriate to build the right shields/boards for your con ### Upgrade a manual script -If you have a custom GitHub Actions workflow you need to maintain for some reason, you can update the workflow to use the `stable` Docker image tag for the build: +If you have a custom GitHub Actions workflow you need to maintain for some reason, you can update the workflow to to use the `stable` Docker image tag for the build: - Open `.github/workflows/build.yml` in your editor/IDE - Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found @@ -86,7 +87,7 @@ Once the container has rebuilt, VS Code will be running the 3.2 Docker image. The following steps will get you building ZMK locally against Zephyr 3.2: -- Run the updated [toolchain installation](/docs/development/local-toolchain/setup) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) - Install the latest version of `west` by running `pip3 install --user --update west`. - pull the latest ZMK `main` with `git pull` for your ZMK checkout - run `west update` to pull the updated Zephyr version and its dependencies @@ -114,7 +115,7 @@ CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. -All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](/keymap-upgrader) and this will get fixed for you automatically. +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](/docs/codes/keymap-upgrader) and this will get fixed for you automatically. ## Board/Shield Changes diff --git a/docs/blog/2023-06-18-encoder-refactors.md b/docs/blog/2023-06-18-encoder-refactors.md index 8efaa57d..14be81c8 100644 --- a/docs/blog/2023-06-18-encoder-refactors.md +++ b/docs/blog/2023-06-18-encoder-refactors.md @@ -1,6 +1,9 @@ --- title: "Major Encoder Refactor" -authors: petejohanson +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 tags: [firmware, zephyr, sensors, encoders] --- @@ -8,8 +11,6 @@ Today, we merged a significant change to the low level sensor code that is used this paves the way for completing the work on supporting split peripheral sensors/encoders, and other future sensors like pointing devices. - - As part of the work, backwards compatibility for existing shields has been retained, but only for a grace period to allow out-of-tree shields to move to the new approach for encoders. Special thanks to [joelspadin] for the _thorough_ code review and testing throughout the development of the refactor. @@ -37,6 +38,7 @@ Previously, an encoder configuration looked like: ```dts left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; resolution = <4>; @@ -59,6 +61,7 @@ That was the entirety of the configuration for encoders. ```dts left_encoder: encoder_left { compatible = "alps,ec11"; + label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <80>; @@ -114,7 +117,3 @@ The old configuration will be supported for a period of one month, and then remo [petejohanson]: https://github.com/petejohanson [joelspadin]: https://github.com/joelspadin - -## Article Updates - -- 12/2023: Removed the deprecated `label` property from code snippets. diff --git a/docs/blog/2023-10-05-zmk-sotf-6.md b/docs/blog/2023-10-05-zmk-sotf-6.md index ba1bf63b..5aa1567a 100644 --- a/docs/blog/2023-10-05-zmk-sotf-6.md +++ b/docs/blog/2023-10-05-zmk-sotf-6.md @@ -1,6 +1,9 @@ --- title: "ZMK State Of The Firmware #6" -authors: caksoylar +author: Cem Aksoylar +author_title: Documentation maintainer +author_url: https://github.com/caksoylar +author_image_url: https://avatars.githubusercontent.com/u/7876996 tags: [SOTF, keyboards, firmware, oss, ble] --- @@ -8,8 +11,6 @@ Welcome to the sixth ZMK "State Of The Firmware" (SOTF)! This update will cover all the major activity since [SOTF #5](/blog/2022/04/10/zmk-sotf-5). That was over a year ago (again!), so there are many new exciting features and plenty of improvements to cover! - - ## Recent Activity Here's a summary of the various major changes since last time, broken down by theme: @@ -18,21 +19,22 @@ Here's a summary of the various major changes since last time, broken down by th #### Hold-tap improvements -[andrewjrae] added the [`require-prior-idle-ms` property](/docs/keymaps/behaviors/hold-tap#require-prior-idle-ms) to the hold-tap behavior in [#1187](https://github.com/zmkfirmware/zmk/pull/1187) and [#1387](https://github.com/zmkfirmware/zmk/pull/1387), which prevents the hold behavior from triggering if it hasn't been a certain duration since the last key press. This is a useful feature to prevent accidental hold activations during quick typing and made its way into many keymaps! The same property was added to [combos](/docs/keymaps/combos#configuration) as well to help prevent false combo activations. +[andrewjrae] added the [`require-prior-idle-ms` property](/docs/behaviors/hold-tap#require-prior-idle-ms) to the hold-tap behavior in [#1187](https://github.com/zmkfirmware/zmk/pull/1187) and [#1387](https://github.com/zmkfirmware/zmk/pull/1387), which prevents the hold behavior from triggering if it hasn't been a certain duration since the last key press. This is a useful feature to prevent accidental hold activations during quick typing and made its way into many keymaps! The same property was added to [combos](/docs/features/combos#configuration) as well to help prevent false combo activations. Note that an earlier iteration of this feature was supported with the `global-quick-tap` property, which did not allow customizing the timeout and used the value of `quick-tap-ms` for it. This property is now deprecated and users are encouraged to use `require-prior-idle-ms` instead. -[urob] added the [`hold-trigger-on-release` property](/docs/keymaps/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#1423](https://github.com/zmkfirmware/zmk/pull/1423). This significantly increases the usefulness of positional constraints on hold-taps, since it allows combining multiple holds such as different modifiers for home row mods usage. +[urob] added the [`hold-trigger-on-release` property](/docs/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#1423](https://github.com/zmkfirmware/zmk/pull/1423). This significantly increases the usefulness of positional constraints on hold-taps, since it allows combining multiple holds such as different modifiers for home row mods usage. #### Masking mods in mod-morphs -[aumuell](https://github.com/aumuell), [vrinek](https://github.com/vrinek) and [urob] contributed to improving the behavior of [mod-morphs](/docs/keymaps/behaviors/mod-morph) by masking the triggering modifiers and added `keep-mods` property in [#1412](https://github.com/zmkfirmware/zmk/pull/1412). This unlocks more use cases for mod-morphs, since you are no longer constrained to emitting keycodes that work well with the triggering modifier keycodes. +[aumuell](https://github.com/aumuell), [vrinek](https://github.com/vrinek) and [urob] contributed to improving the behavior of [mod-morphs](/docs/behaviors/mod-morph) by masking the triggering modifiers and added `keep-mods` property in [#1412](https://github.com/zmkfirmware/zmk/pull/1412). This unlocks more use cases for mod-morphs, since you are no longer constrained to emitting keycodes that work well with the triggering modifier keycodes. As an example, you can now define a mod-morph that swaps `;` and `:` so that the former is the shifted version of the latter, which wasn't previously possible: ```dts col_semi: colon_semicolon { compatible = "zmk,behavior-mod-morph"; + label = "COLON_SEMICOLON"; #binding-cells = <0>; bindings = <&kp COLON>, <&kp SEMI>; mods = <(MOD_LSFT|MOD_RSFT)>; @@ -41,13 +43,14 @@ As an example, you can now define a mod-morph that swaps `;` and `:` so that the #### Parameterized macros -[petejohanson] added [macros that can be parameterized](/docs/keymaps/behaviors/macros#parameterized-macros) with one or two parameters in [#1232](https://github.com/zmkfirmware/zmk/pull/1232). This allows users to define macros in a more modular way and is a nice quality-of-life improvement. +[petejohanson] added [macros that can be parameterized](/docs/behaviors/macros#parameterized-macros) with one or two parameters in [#1232](https://github.com/zmkfirmware/zmk/pull/1232). This allows users to define macros in a more modular way and is a nice quality-of-life improvement. As a simple example, you could define a macro that puts any keycode provided between double quotes as below, then use it like `&ql A` in your keymap: ```dts - ql: quoted_letter { + ql: quoted_letter_macro { #binding-cells = <1>; + label = "QUOTED_LETTER"; compatible = "zmk,behavior-macro-one-param"; bindings = <&kp DQT>, @@ -60,27 +63,27 @@ Please see the documentation page linked above for usage and more examples. #### Arbitrary behaviors on encoder rotation -[nickconway](https://github.com/nickconway) and [petejohanson] added [sensor rotation behaviors](/docs/keymaps/behaviors/sensor-rotate) to allow invoking arbitrary behaviors from encoders [#1758](https://github.com/zmkfirmware/zmk/pull/1758). Previously encoder rotations could only invoke the key-press behavior `&kp` through the `&inc_dec_kp` binding, whereas now you can define new sensor rotation behaviors to invoke others. +[nickconway](https://github.com/nickconway) and [petejohanson] added [sensor rotation behaviors](/docs/behaviors/sensor-rotate) to allow invoking arbitrary behaviors from encoders [#1758](https://github.com/zmkfirmware/zmk/pull/1758). Previously encoder rotations could only invoke the key-press behavior `&kp` through the `&inc_dec_kp` binding, whereas now you can define new sensor rotation behaviors to invoke others. (Note that currently behaviors that have "locality" such as `&rgb_ug` do not work as expected via encoder rotation bindings in split keyboards, due to issue [#1494](https://github.com/zmkfirmware/zmk/issues/1494).) #### Pre-releasing already pressed keys -[andrewjrae] contributed a tweak to emitting keycodes in [#1828](https://github.com/zmkfirmware/zmk/pull/1828), where rolling multiple keys that involve the same keycode now releases the keycode before sending a press event again. While this might sound like a technical distinction, it leads to more correct behavior when quickly typing sequences like `+=` and makes the [key repeat behavior](/docs/keymaps/behaviors/key-repeat) work properly when it is pressed before the previous key is released. +[andrewjrae] contributed a tweak to emitting keycodes in [#1828](https://github.com/zmkfirmware/zmk/pull/1828), where rolling multiple keys that involve the same keycode now releases the keycode before sending a press event again. While this might sound like a technical distinction, it leads to more correct behavior when quickly typing sequences like `+=` and makes the [key repeat behavior](/docs/behaviors/key-repeat) work properly when it is pressed before the previous key is released. #### Key toggle behavior -[cgoates](https://github.com/cgoates) added the [key toggle behavior](/docs/keymaps/behaviors/key-toggle) in [#1278](https://github.com/zmkfirmware/zmk/pull/1278), which can be used via its `&kt` binding to toggle the state of a keycode between pressed and released. +[cgoates](https://github.com/cgoates) added the [key toggle behavior](/docs/behaviors/key-toggle) in [#1278](https://github.com/zmkfirmware/zmk/pull/1278), which can be used via its `&kt` binding to toggle the state of a keycode between pressed and released. #### Apple Globe key -[ReFil] added support for the `C_AC_NEXT_KEYBOARD_LAYOUT_SELECT` keycode with alias `GLOBE` which acts as the Globe key in macOS and iOS in [#1938](https://github.com/zmkfirmware/zmk/pull/1938). Note that this keycode doesn't exactly behave like a Globe key that is present on an Apple keyboard and its limitations are documented in [this comment](https://github.com/zmkfirmware/zmk/pull/1938#issuecomment-1744579039) thanks to testing by [SethMilliken](https://github.com/SethMilliken). These limitations will be noted in the official [keycodes documentation](/docs/keymaps/list-of-keycodes) shortly. +[ReFil] added support for the `C_AC_NEXT_KEYBOARD_LAYOUT_SELECT` keycode with alias `GLOBE` which acts as the Globe key in macOS and iOS in [#1938](https://github.com/zmkfirmware/zmk/pull/1938). Note that this keycode doesn't exactly behave like a Globe key that is present on an Apple keyboard and its limitations are documented in [this comment](https://github.com/zmkfirmware/zmk/pull/1938#issuecomment-1744579039) thanks to testing by [SethMilliken](https://github.com/SethMilliken). These limitations will be noted in the official [keycodes documentation](/docs/codes/applications) shortly. #### Bug fixes and other improvements [petejohanson], [andrewjrae] and [okke-formsma] tracked down and fixed an issue causing stuck keys when there are combos on key positions involving hold-tap behaviors in [#1411](https://github.com/zmkfirmware/zmk/pull/1411). This was an elusive bug that took a lot of effort from the community to nail down and fix! -[nguyendown](https://github.com/nguyendown) and [joelspadin] tracked down and fixed a couple issues causing stuck keys with [sticky keys](/docs/keymaps/behaviors/sticky-key) in [#1586](https://github.com/zmkfirmware/zmk/pull/1586), [#1745](https://github.com/zmkfirmware/zmk/pull/1745). +[nguyendown](https://github.com/nguyendown) and [joelspadin] tracked down and fixed a couple issues causing stuck keys with [sticky keys](/docs/behaviors/sticky-key) in [#1586](https://github.com/zmkfirmware/zmk/pull/1586), [#1745](https://github.com/zmkfirmware/zmk/pull/1745). [okke-formsma] fixed an issue allowing tap dances to be invoked by combos in [#1518](https://github.com/zmkfirmware/zmk/pull/1518). @@ -104,7 +107,7 @@ Note that documentation is still lacking for utilizing more than one peripheral [petejohanson] contributed a fix to release held keys on peripheral disconnect [#1340](https://github.com/zmkfirmware/zmk/pull/1340), which makes scenarios where a split disconnects unexpectedly less painful. -[petejohanson] also improved [the `settings_reset` shield](/docs/troubleshooting/connection-issues#split-keyboard-parts-unable-to-pair) by making it clear bonds more reliably, and allow it to build for all boards in [#1879](https://github.com/zmkfirmware/zmk/pull/1879). +[petejohanson] also improved [the `settings_reset` shield](/docs/troubleshooting#split-keyboard-halves-unable-to-pair) by making it clear bonds more reliably, and allow it to build for all boards in [#1879](https://github.com/zmkfirmware/zmk/pull/1879). [petejohanson] and [xudongzheng] contributed additional split connectivity improvements, via using directed advertising in [#1913](https://github.com/zmkfirmware/zmk/pull/1913) and improving the robustness of central scanning in [#1912](https://github.com/zmkfirmware/zmk/pull/1912). @@ -130,7 +133,7 @@ This refactor paved way to implementing a long-awaited feature, encoder support #### Underglow auto-off options -[ReFil] added two [new RGB auto off options](/docs/config/lighting#rgb-underglow), one using an idle timeout and the other USB status in [#1010](https://github.com/zmkfirmware/zmk/pull/1010). +[ReFil] added two [new RGB auto off options](/docs/config/underglow), one using an idle timeout and the other USB status in [#1010](https://github.com/zmkfirmware/zmk/pull/1010). #### nice!view support @@ -173,7 +176,7 @@ For users or future contributors that might want to dive into writing their own #### Shield interconnects -[petejohanson] updated the [new shield guide](/docs/hardware-integration/new-shield) for non-Pro Micro interconnects including Xiao, Arduino Uno and Blackpill in [#1607](https://github.com/zmkfirmware/zmk/pull/1607). +[petejohanson] updated the [new shield guide](/docs/development/new-shield) for non-Pro Micro interconnects including Xiao, Arduino Uno and Blackpill in [#1607](https://github.com/zmkfirmware/zmk/pull/1607). #### Bluetooth feature page @@ -214,7 +217,7 @@ USB HID polling interval now defaults to 1 ms, i.e. a 1000Hz polling rate, thank - Waterfowl [#1554](https://github.com/zmkfirmware/zmk/pull/1554) - [JW2586](https://github.com/JW2586) - Kyria Rev 3 [#1627](https://github.com/zmkfirmware/zmk/pull/1627) - [petejohanson] - Leeloo v2 and Leeloo-Micro [#1762](https://github.com/zmkfirmware/zmk/pull/1762) - [ClicketySplit](https://github.com/ClicketySplit) -- Spaceboards Pancake [#1400](https://github.com/zmkfirmware/zmk/pull/1400) - [jasonhazel](https://github.com/jasonhazel) +- Spaceman Pancake [#1400](https://github.com/zmkfirmware/zmk/pull/1400) - [jasonhazel](https://github.com/jasonhazel) - Reviung5 [#1548](https://github.com/zmkfirmware/zmk/pull/1548) - [zblesk](https://github.com/zblesk) ## New Boards @@ -290,7 +293,3 @@ Also a big thank you to contributors that submit patches and perform reviews, te [urob]: https://github.com/urob [filterpaper]: https://github.com/filterpaper [ReFil]: https://github.com/ReFil - -## Article Updates - -- 12/2023: Removed the deprecated `label` property from code snippets. diff --git a/docs/blog/2023-11-09-keymap-editor.mdx b/docs/blog/2023-11-09-keymap-editor.md similarity index 80% rename from docs/blog/2023-11-09-keymap-editor.mdx rename to docs/blog/2023-11-09-keymap-editor.md index a0c5332f..1fe3b867 100644 --- a/docs/blog/2023-11-09-keymap-editor.mdx +++ b/docs/blog/2023-11-09-keymap-editor.md @@ -1,26 +1,24 @@ --- title: "Community Spotlight Series #1: Keymap Editor" -authors: caksoylar +author: Cem Aksoylar +author_title: Documentation maintainer +author_url: https://github.com/caksoylar +author_image_url: https://avatars.githubusercontent.com/u/7876996 tags: [keyboards, firmware, community] --- -import ThemedImage from "@theme/ThemedImage"; - -This blog post is the first in a series of posts where we highlight projects within the ZMK ecosystem that we think are cool and that the users might benefit from knowing about them. We are starting the series with a big one, [Keymap Editor](http://nickcoutsos.github.io/keymap-editor) by [Nick Coutsos](https://github.com/nickcoutsos)! - -{/* truncate */} +import ThemedImage from '@theme/ThemedImage'; +This blog post is the first in a series of posts where we highlight projects within the ZMK ecosystem that we think are cool and that the users might benefit from knowing about them. We are starting the series with a big one, [Keymap Editor] by [Nick Coutsos](https://github.com/nickcoutsos)! + In the rest of the post we leave it to Nick himself to introduce the project, detail his goals and motivation in developing such a tool, and talk about the future of the project. Stay tuned for future installments in the series! ## What is Keymap Editor? @@ -32,12 +30,12 @@ _[Keymap Editor]_ is a web based graphical editor for ZMK keymaps. It provides a ## What can Keymap Editor do? -- Render [devicetree keymaps](/docs/keymaps) using pre-defined, auto-generated, or side-loadable keyboard layouts +- Render [devicetree keymaps](/docs/features/keymaps) using pre-defined, auto-generated, or side-loadable keyboard layouts - Integrate with a GitHub repo to streamline firmware builds, or FileSystem/Clipboard if you'd still rather build locally -- Edit [combos](/docs/keymaps/combos), [behaviors](/docs/keymaps/behaviors/key-press), [macros](/docs/keymaps/behaviors/macros), [conditional layers](/docs/keymaps/conditional-layers) and [rotary encoder bindings](/docs/keymaps/behaviors/sensor-rotate) +- Edit [combos](/docs/features/combos), [behaviors](/docs/behaviors/key-press), [macros](/docs/behaviors/macros), [conditional layers](/docs/features/conditional-layers) and [rotary encoder bindings](/docs/behaviors/sensor-rotate) - Manage references: moving a layer or renaming a behavior will look for references throughout your keymap and update them. -But check back regularly, because I update pretty often. A recent significant achievement was enabling [parameterized macros](/docs/keymaps/behaviors/macros#parameterized-macros) and tying it in with my existing parameter type resolution so, yeah, you can finally create that reusable macro combining bluetooth profile selection with RGB backlight colour. Or use it for an actual useful thing, even. _(See also: [Using Parameterized Macros in Keymap Editor](https://github.com/nickcoutsos/keymap-editor/wiki/Using-Parameterized-Macros-in-Keymap-Editor))_ +But check back regularly, because I update pretty often. A recent significant achievement was enabling [parameterized macros](/docs/behaviors/macros#parameterized-macros) and tying it in with my existing parameter type resolution so, yeah, you can finally create that reusable macro combining bluetooth profile selection with RGB backlight colour. Or use it for an actual useful thing, even. _(See also: [Using Parameterized Macros in Keymap Editor](https://github.com/nickcoutsos/keymap-editor/wiki/Using-Parameterized-Macros-in-Keymap-Editor))_ My goals are, broadly: diff --git a/docs/blog/2023-12-17-nodefree-config.md b/docs/blog/2023-12-17-nodefree-config.md deleted file mode 100644 index d7fecdf4..00000000 --- a/docs/blog/2023-12-17-nodefree-config.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: "Community Spotlight Series #2: Node-free Config" -authors: caksoylar -tags: [keyboards, firmware, community] ---- - -This blog continues our series of posts where we highlight projects within the ZMK ecosystem -that we think are interesting and that the users might benefit from knowing about them. You might -be aware that ZMK configurations in the [Devicetree format](/docs/config#devicetree-files) -use the [C preprocessor](https://en.wikipedia.org/wiki/C_preprocessor) so that directives like -`#define RAISE 2` or `#include ` can be used in them. In this installment we are -highlighting the [`zmk-nodefree-config` project](https://github.com/urob/zmk-nodefree-config) -by [urob](https://github.com/urob) that contains helper methods that utilizes this fact -for users who prefer editing and maintaining their ZMK config directly using the Devicetree -syntax format. - - - -In the rest of the post we leave it to urob to introduce and explain the motivations of the -project, and various ways it can be used to help maintain ZMK keymaps. Stay tuned for future -installments in the series! - -## Overview - -Loosely speaking the _nodefree_ repo -- more on the name later -- is a -collection of helper functions that simplify configuring keymap files. Unlike -the graphical keymap editor covered in the [previous spotlight -post](https://zmk.dev/blog/2023/11/09/keymap-editor), it is aimed at users who -edit and maintain directly the source code of their keymap files. - -The provided helpers fall into roughly one of three categories: - -1. Helpers that eliminate boilerplate, reduce the complexity of keymaps, and improve readability. -2. Helpers that improve portability of "position-based" properties such as combos. -3. Helpers that define international and other unicode characters. - -The reminder of this post details each of these three categories. - -## Eliminating Boilerplate - -In ZMK, keymaps are configured using so-called _Devicetree_ files. Devicetree files -define a collection of nested _nodes_, whereas each node in turn specifies a variety of -_properties_ through which one can customize the keymap. - -For example, the following snippet sets up a -[mod-morph](https://zmk.dev/docs/keymaps/behaviors/mod-morph) behavior that sends . -("dot") when pressed by itself and sends : ("colon") when shifted: - -```dts {6-7} showLineNumbers -/ { - behaviors { - dot_colon: dot_colon_behavior { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp DOT>, <&kp COLON>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - }; -}; -``` - -Adding this snippet to the keymap will create a new node `dot_colon_behavior` -(nested underneath the `behaviors` and root `/` nodes), and assigns it four -properties (`compatible`, `#binding-cells`, etc). Here, the crucial properties are `bindings` -and `mods`, which spell out the actual functionality of the new behavior. The rest -of the snippet (including the nested node-structure) is boilerplate. - -The idea of the _nodefree_ repo is to use C preprocessor macros to improve -readability by eliminating as much boilerplate as possible. Besides hiding -redundant behavior properties from the user, it also automatically creates and -nests all required behavior nodes, making for a "node-free" and less -error-prone user experience (hence the name of the repo). - -For example, using `ZMK_BEHAVIOR`, one of the repo's helper functions, the -above snippet simplifies to: - -```dts showLineNumbers -ZMK_BEHAVIOR(dot_colon, mod_morph, - bindings = <&kp DOT>, <&kp COLON>; - mods = <(MOD_LSFT|MOD_RSFT)>; -) -``` - -For complex keymap files, the gains from eliminating boilerplate can be -enormous. To provide a benchmark, consider my [personal -config](https://github.com/urob/zmk-config), which uses the _nodefree_ repo to -create various behaviors, set up combos, and add layers to the keymap. Without -the _nodefree_ helpers, the total size of my keymap would have been 41 kB. Using -the helper macros, the actual size is instead reduced to a more sane 12 kB.[^1] - -[^1]: - To compute the impact on file size, I ran `pcpp ---passthru-unfound-includes` on the `base.keymap` file, comparing two - variants. First, I ran the pre-processor on the actual file. Second, I ran - it on a version where I commented out all the _nodefree_ headers, - preventing any of the helper functions from getting expanded. The - difference isolates precisely the size gains from eliminating boilerplate, - which in my ZMK config are especially large due to a vast number of - behaviors used to add various Unicode characters to my keymap. - -## Simplifying "Position-based" Behaviors - -In ZMK, there are several features that are position-based. As of today, these -are [combos](/docs/keymaps/combos) and [positional -hold-taps](/docs/keymaps/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions), -with behaviors like the ["Swapper"](https://github.com/zmkfirmware/zmk/pull/1366) and [Leader -key](https://github.com/zmkfirmware/zmk/pull/1380) currently -developed by [Nick Conway](https://github.com/nickconway) in pull requests also utilizing them. - -Configuring these behaviors involves lots of key counting, which can be -cumbersome and error-prone, especially on larger keyboards. It also reduces the -portability of configuration files across keyboards with different layouts. - -To facilitate configuring position-based behaviors, the _nodefree_ repo comes -with a community-maintained library of "key-position labels" for a variety of -popular layouts. The idea is to provide a standardized naming convention that -is consistent across different keyboards. For instance, the labels for a 36-key -layout are as follows: - -``` - ╭─────────────────────┬─────────────────────╮ - │ LT4 LT3 LT2 LT1 LT0 │ RT0 RT1 RT2 RT3 RT4 │ - │ LM4 LM3 LM2 LM1 LM0 │ RM0 RM1 RM2 RM3 RM4 │ - │ LB4 LB3 LB2 LB1 LB0 │ RB0 RB1 RB2 RB3 RB4 │ - ╰───────╮ LH2 LH1 LH0 │ RH0 RH1 RH2 ╭───────╯ - ╰─────────────┴─────────────╯ -``` - -The labels are all of the following form: - -- `L/R` for **L**eft/**R**ight side -- `T/M/B/H` for **T**op/**M**iddle/**B**ottom and t**H**umb row. -- `0/1/2/3/4` for the finger position, counting from the inside to the outside - -The library currently contains definitions for 17 physical -layouts, ranging from the tiny [Osprette](https://github.com/smores56/osprette) to the large-ish -[Glove80](https://www.moergo.com/collections/glove80-keyboards). -While some of these layouts contain more keys than others, the idea behind the -library is that keys that for all practical purposes are in the "same" location -share the same label. That is, the 3 rows containing the alpha keys are -always labeled `T/M/B` with `LM1` and `RM1` defining the home position of -the index fingers. For larger boards, the numbers row is always labeled -`N`. For even larger boards, the function key row and the row below `B` are -labeled `C` and `F` (mnemonics for **C**eiling and **F**loor), etc. - -Besides sparing the user from counting keys, the library also makes it easy to -port an entire, say, combo configuration from one keyboard to the next by simply -switching layout headers. - -## Unicode and International Keycodes - -The final category of helpers is targeted at people who wish to type international characters -without switching the input language of their operation system. To do so, the repo comes with -helper functions that can be used to define Unicode behaviors. - -In addition, the repo also ships with a community-maintained library of -language-files that define Unicode behaviors for all relevant characters in a -given language. For instance, after loading the German language file, one can -add `&de_ae` to the keymap, which will send ä/Ä when pressed or shifted. - -## About Me - -My path to ZMK and programmable keyboards started in the early pandemic, when I -built a [Katana60](https://geekhack.org/index.php?topic=88719.0) and learned -how to touch-type Colemak. Soon after I purchased a Planck, which turned out -to be the real gateway drug for me. - -Committed to making the best out of the Planck's 48 keys, I have since -discovered my love for tinkering with tiny layouts and finding new ways of -[squeezing out](https://xkcd.com/2583/) a bit more ergonomics. Along the way, I -also made the switch from QMK to ZMK, whose "object-oriented" approach to -behaviors I found more appealing for complex keymaps.[^2] - -[^2]: - I am using the term object-oriented somewhat loosely here. What I mean by - that is the differentiation between abstract behavior classes (such as - hold-taps) and specific behavior instances that are added to the keymap. - Allowing to set up multiple, reusable instances of each behavior has been a - _huge_ time-saver compared to QMK's more limited behavior settings that are - either global or key-specific. - -These days I mostly type on a Corne-ish Zen and are waiting for the day when I -will finally put together the -[Hypergolic](https://github.com/davidphilipbarr/hypergolic) that's been sitting -on my desk for months. My current keymap is designed for 34 keys, making -liberal use of combos and [timerless homerow -mods](https://github.com/urob/zmk-config#timeless-homerow-mods) to make up for -a lack of keys. diff --git a/docs/blog/2024-01-05-zmk-tools.md b/docs/blog/2024-01-05-zmk-tools.md deleted file mode 100644 index f18ad30d..00000000 --- a/docs/blog/2024-01-05-zmk-tools.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: "Community Spotlight Series #3: ZMK Tools and ZMK Locale Generator" -authors: caksoylar -tags: [keyboards, firmware, community] ---- - -This blog continues our series of posts where we highlight projects within the ZMK ecosystem -that we think are interesting and that the users might benefit from knowing about them. - -In this installment, we are highlighting two projects (and a bonus one!) from [Joel Spadin](https://github.com/joelspadin), -a member of the core ZMK team. - - - -The first one is [ZMK Tools](#zmk-tools), a handy Visual Studio Code extension to ease working with ZMK configurations, and the second is [ZMK Locale Generator](#zmk-locale-generator), a tool to help users that use non-US English keyboard locales in their operating systems. - -In the rest of the post we leave it to Joel to introduce and explain the motivations of his ZMK-related projects. -Stay tuned for future installments in the series! - -## ZMK Tools - -[ZMK Tools](https://github.com/joelspadin/zmk-tools) is an extension for [Visual Studio Code](https://code.visualstudio.com) that helps with editing a ZMK user config repo or a fork of ZMK. I originally created it to add some code completion in `.keymap` files, but then I realized that with the web version of VS Code, I could also let you set up a user config repo and build firmware, much like the user setup script, except without downloading a single thing. - -### User Config Setup in Browser - -Here is how you can use ZMK Tools to get started with writing a ZMK keymap entirely within your browser. More detailed instructions can be found on the [ZMK Tools README](https://github.com/joelspadin/zmk-tools/blob/main/README.md). - -1. Open the [ZMK config template repo](https://github.com/zmkfirmware/unified-zmk-config-template) on GitHub. -2. Click the **Use this template** button and follow the instructions to create your own repo. - - If you don't see this button, make sure you're signed in to GitHub first. - - You can name the repo anything you want, but "zmk-config" is the conventional name. -3. From the GitHub page for your new repo, press . (period) and it will re-open the repo in github.dev. -4. Press Ctrl + P and enter the following to install the ZMK Tools extension: - ``` - ext install spadin.zmk-tools - ``` -5. Press Ctrl + Shift + P and run the **ZMK: Add Keyboard** command. -6. Follow the prompts to select a keyboard. ZMK Tools will copy the default keymap for that keyboard if you don't already have one, and it will automatically add it to your `build.yaml` file so GitHub will build it for you. - -You can then edit your `.keymap` and `.conf` files. Once you're done: - -1. Click the **Source Control** tab on the side bar. -2. Hover over the header for the **Changes** list and click the `+` (Stage All Changes) button. -3. Write a commit message and click **Commit & Push** to push your changes to GitHub. - -GitHub will start building the new firmware. To check the results: - -1. Use your browser's back button to go back to your repo's GitHub page. -2. Click the **Actions** tab at the top of the page. -3. Click the latest build (it should show the commit message you entered earlier). If it's still in progress, wait for it to finish. -4. If the build was successful, go to the **Artifacts** section and click **firmware** to download the firmware. If it failed, check the error and go back to github.dev to fix it. - -### Keymap Code Completion - -ZMK Tools also provides some basic code completion in `.keymap` files. It will suggest any of ZMK's built-in behaviors inside `bindings` and `sensor-bindings` properties, and it will automatically add the necessary headers. - -For example, with the cursor at the end of line 6 in the following keymap... - -```dts {6} showLineNumbers -/ { - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - & - >; - }; - }; -}; -``` - -...it will suggest things such as `&kp`, `&mo`, etc., and upon entering one, it will recognize that `#include ` is missing and add it to the top of the keymap: - -```dts {1} showLineNumbers -#include -/ { - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp - >; - }; - }; -}; -``` - -Press space after `&kp`, and it will suggest all of ZMK's key codes. Upon entering one, it will again recognize that `#include ` is missing and add it too: - -```dts {2} showLineNumbers -#include -#include -/ { - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp A - >; - }; - }; -}; -``` - -This can be very helpful for making sure you spelled key codes correctly and included all the correct headers. - -### Future Work - -Unfortunately, all the code completion info currently comes from a config file baked into the extension, so it won't pick up any custom behaviors or key code aliases you've defined. I'd like to make that work eventually, but it's a much more difficult problem to solve. - -ZMK Tools will discover all the boards/shields from both ZMK and your user config repo. With some recent changes in ZMK to allow pulling in features from other Zephyr modules, it's now possible to use board/shields defined in other repos, but ZMK Tools doesn't know about this yet. I'd like to support this too, but making it work in the web version of the extension will be challenging. - -## ZMK Locale Generator - -ZMK's key codes follow the [HID specification](https://www.usb.org/hid), and many key codes indicate the _position_ of a key on US keyboard layout, not the key's function. If your operating system is set to a different keyboard locale, then the character each key types won't necessarily line up with the key code name. For example, on a German "QWERTZ" layout, `&kp Y` will type Z and `&kp Z` will type Y, so you have to write your layout as if it were QWERTY instead. Other layouts can be even more confusing! - -[ZMK Locale Generator](https://github.com/joelspadin/zmk-locale-generator) is another tool I made to help with this. It reads [CLDR keyboard layouts](https://cldr.unicode.org/index/charts/keyboards) and generates `#define`s to alias key codes to names that make sense in other locales. To use it, first go to the [latest release](https://github.com/joelspadin/zmk-locale-generator/releases/latest) and download the header that matches the locale you use. Next, copy it into the same folder as your keymap and `#include` it: - -```dts -#include "keys_de.h" - -/ { - ... -}; -``` - -If you open the header file in a text editor, you'll see that it contains many of the standard ZMK key codes, except they are prefixed by the locale code. Depending on the locale, it may also define key codes for special characters specific to that locale, e.g. `DE_A_UMLAUT` for "ä" and `DE_SZ` for "ß". If you use these in your keymap, then ZMK will send the correct key codes to type those characters. - -```dts -#include "keys_de.h" - -/ { - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp DE_Q &kp DE_W &kp DE_E &kp DE_R &kp DE_T &kp DE_Z ... - >; - }; - } -}; -``` - -I should note that, as a native English speaker and typer, I don't use any of this myself! I just saw that many people were asking for help with this, and I realized I could automate a solution. If you find something that isn't generated correctly, please [file an issue](https://github.com/joelspadin/zmk-locale-generator/issues) or PR a fix on GitHub. - -## Keyboard Latency Testing - -The last project I want to mention is a tool for testing keyboard latency. It requires only a Raspberry Pi, an optocoupler IC, a resistor, and some wire. If you've ever wondered how ZMK's latency compares to other keyboards, you can [check the results here](https://github.com/joelspadin/keyboard-latency-tester/blob/main/results/chart.ipynb)! - -I don't have a very large collection of keyboards though, so the data is pretty limited so far. If you want to try it on your own keyboard, see the instructions on the [keyboard latency tester README](https://github.com/joelspadin/keyboard-latency-tester), and please send me a PR with your results! - -## About Me - -I got a degree in electrical engineering but promptly became a software engineer instead. I still like tinkering with electronics though, so I discovered ZMK when I was making wireless macropad with a nice!nano, and I became a regular contributor after that. I use mostly larger keyboards with standard layouts and rarely use anything more complicated than momentary layers, so I've mostly focused on improving core features and tooling. - -The keyboards I regularly use are a Ducky One 2 TKL that I leave at work, a Freebird TKL[^1], a custom [wireless numpad](https://github.com/joelspadin/NumBLE), and a Yamaha CP4. - -[^1] Running QMK, but I have designs to make a wireless PCB for it someday... diff --git a/docs/blog/2024-02-09-zephyr-3-5.md b/docs/blog/2024-02-09-zephyr-3-5.md deleted file mode 100644 index 2362829e..00000000 --- a/docs/blog/2024-02-09-zephyr-3-5.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: "Zephyr 3.5 Update" -authors: petejohanson -tags: [firmware, zephyr, core] ---- - -I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1995) to upgrade ZMK to [Zephyr 3.5](https://docs.zephyrproject.org/3.5.0/releases/release-notes-3.5.html)! - - - -[petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes: - -- Add `west flash` support to all UF2 capable boards. -- Adjust for LVGL DTS/Kconfig changes -- Zephyr core API changes, including `CONTAINER_OF` work API changes, init priority/callback, and others - -## Getting The Changes - -Use the following steps to update to the latest tooling in order to properly use the new ZMK changes: - -### User Config Repositories Using GitHub Actions - -Existing user config repositories using Github Actions to build will pull down Zephyr 3.5 automatically, however if you created your user config a while ago, you may need to update it to reference our shared build configuration to leverage the correct Docker image. - -1. Replace the contents of your `.github/workflows/build.yml` with: - - ```yaml - on: [push, pull_request, workflow_dispatch] - - jobs: - build: - uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main - ``` - -1. If it doesn't exist already, add a new file to your repository named `build.yaml`: - - ```yaml - # This file generates the GitHub Actions matrix - # For simple board + shield combinations, add them - # to the top level board and shield arrays, for more - # control, add individual board + shield combinations to - # the `include` property, e.g: - # - # board: [ "nice_nano_v2" ] - # shield: [ "corne_left", "corne_right" ] - # include: - # - board: bdn9_rev2 - # - board: nice_nano_v2 - # shield: reviung41 - # - --- - ``` - -and then update it as appropriate to build the right shields/boards for your configuration. - -### VS Code & Docker (Dev Container) - -If you build locally using VS Code & Docker then: - -- Pull the latest ZMK `main` with `git pull` for your ZMK checkout -- Reload the project -- If you are prompted to rebuild the remote container, click `Rebuild` -- Otherwise, press `F1` and run `Remote Containers: Rebuild Container` -- Once the container has rebuilt and reloaded, run `west update` to pull the updated Zephyr version and its dependencies. - -Once the container has rebuilt, VS Code will be running the 3.5 Docker image. - -### Local Host Development - -The following steps will get you building ZMK locally against Zephyr 3.5: - -- Run the updated [toolchain installation](/docs/development/local-toolchain/setup) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) -- Install the latest version of `west` by running `pip3 install --user --update west`. -- Pull the latest ZMK `main` with `git pull` for your ZMK checkout -- Run `west update` to pull the updated Zephyr version and its dependencies - -From there, you should be ready to build as normal! - -## Board/Shield Changes - -The following changes have [already been completed](https://github.com/zmkfirmware/zmk/pull/1995/commits) for all boards/shields in ZMK `main` branch. For existing or new PRs, or out of tree boards, the following changes are necessary to properly work with the latest changes. - -### West Flash Support - -If you have a custom board for a target that has a UF2 supporting bootloader, you can easily add support for -flashing via `west flash`. Note that using `west flash` isn't mandatory, it is merely a convenient way to automate copying to the mass storage device, which you can continue to do manually. -To add support, add a line to your board's `board.cmake` file like so: - -``` -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -``` - -### LVGL DTS/Kconfig Changes - -Two items were changed for LVGL use for displays that may need adjusting for custom shields: - -#### DPI Kconfig Rename - -The old `LV_Z_DPI` Kconfig symbol was promoted to a Kconfig in upstream LVGL, and is now named `LV_DPI_DEF`. You -will need to replace this symbol in your board/shield's `Kconfig.defconfig` file. - -#### SSD1306 OLED Inverse Refactor - -Inverting black/white pixels has moved out of the Kconfig system and into a new DTS property. If you have a custom -shield that uses an SSD1306, you should: - -- Remove any override for the `SSD1306_REVERSE_MODE` from your Kconfig files. -- Add the new `inversion-on;` boolean property to the SSD1306 node in your devicetree file. - -### Maxim max17048 Sensor Driver - -Upstream Zephyr has added a driver for the max17048 fuel gauge, but using the new [fuel gauge API](https://docs.zephyrproject.org/3.5.0/hardware/peripherals/fuel_gauge.html) that ZMK -does not yet consume. To avoid a conflict with the new upstream and keep our existing sensor driver, our driver has been renamed to be namespaced with a ZMK prefix. The following changes are needed for any boards using the driver: - -- Change the `compatible` value for the node to be `zmk,maxim-17048`, e.g. `compatible = "zmk,maxim-max17048";`. -- If enabling the driver explicitly via Kconfig, rename `MAX17048` to the new `ZMK_MAX17048` in your `Kconfig.defconfig` or `_defconfig` files. - -## Upcoming Changes - -Moving to Zephyr 3.5 will unblock several exciting efforts that were dependent on that Zephyr release. - -### BLE Stability Improvements - -Many users have reported various BLE issues with some hardware combinations, including challenges with updated -Intel drivers, and macOS general stability problems. The Zephyr 3.5 release includes many fixes for the BT host and controller portions that, combined with some small upcoming ZMK changes, have been reported to completely resolve previous issues. Further focused testing will immediately commence to fully verify the ZMK changes before -making them the default. - -If you'd like to test those changes, enable `CONFIG_ZMK_BLE_EXPERIMENTAL_CONN=y` for your builds. - -### Pointer Integration - -The Zephyr 3.5 release includes a new [input subsystem](https://docs.zephyrproject.org/3.5.0/services/input/index.html) that we will be leveraging for our upcoming pointer support. The open PR for that work is now unblocked and further testing and code review will begin to work on getting that feature integrated into ZMK as well. - -### Power Domains - -Several power domain related changes are now available as well, which were a necessity for continued work on the improved peripheral power handling that's planned to supersede the existing "VCC cutoff" code that currently exists but causes problems for builds that include multiple powered peripherals like Displays + RGB. - -## Thanks! - -Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. - -[petejohanson]: https://github.com/petejohanson diff --git a/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx b/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx deleted file mode 100644 index d1bb7218..00000000 --- a/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx +++ /dev/null @@ -1,261 +0,0 @@ ---- -title: "ZMK Studio MVP General Availability" -authors: petejohanson -tags: [firmware, studio, core] ---- - -import Metadata from "@site/src/data/hardware-metadata.json"; - -import ThemedImage from "@theme/ThemedImage"; - -import studioApp from "./assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot.png"; -import studioAppDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot-dark-mode.png"; - -import niceAndTyperactive from "./assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive.png"; -import niceAndTyperactiveDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive-dark-mode.png"; - -import kinesis from "./assets/2024-11-11-zmk-studio-mvp-ga/kinesis.png"; -import kinesisDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/kinesis-dark-mode.png"; - -import cannonKeys from "./assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys.png"; -import cannonKeysDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys-dark-mode.png"; - -import keychron from "./assets/2024-11-11-zmk-studio-mvp-ga/keychron.png"; -import keychronDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/keychron-dark-mode.png"; - -import littleKeyboards from "./assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards.avif"; -import littleKeyboardsDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards-dark-mode.avif"; - -import keebmaker from "./assets/2024-11-11-zmk-studio-mvp-ga/keebmaker.png"; -import keebmakerDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/keebmaker-dark-mode.png"; - -import keebio from "./assets/2024-11-11-zmk-studio-mvp-ga/keebio.avif"; - -import mode from "./assets/2024-11-11-zmk-studio-mvp-ga/mode.png"; -import modeDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/mode-dark-mode.png"; - -import phaseByte from "./assets/2024-11-11-zmk-studio-mvp-ga/phasebyte.png"; - -import deskHero from "./assets/2024-11-11-zmk-studio-mvp-ga/deskhero.webp"; -import deskHeroDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/deskhero-dark-mode.webp"; - -import mechlovin from "./assets/2024-11-11-zmk-studio-mvp-ga/mechlovin.png"; -import mechlovinDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/mechlovin-dark-mode.png"; - -import splitkb from "./assets/2024-11-11-zmk-studio-mvp-ga/splitkb.png"; -import splitkbDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/splitkb-dark-mode.png"; - -import keycapsss from "./assets/2024-11-11-zmk-studio-mvp-ga/keycapsss.png"; -import keycapsssDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/keycapsss-dark-mode.png"; - -import mekibo from "./assets/2024-11-11-zmk-studio-mvp-ga/mekibo.png"; -import mekiboDarkMode from "./assets/2024-11-11-zmk-studio-mvp-ga/mekibo-dark-mode.png"; - -I'm delighted to announce that after many months of work, the ZMK Studio Minimum Viable Product (MVP) has reached General Availability (GA) status. I'm very excited with the feature set and foundation we've gotten into this first release, and equally excited for the upcoming work to add even more features. - -ZMK Studio provides runtime keymap functionality for ZMK powered devices, allowing you to make changes without the need to flash new firmware. It is a combination of major firmware enhancements paired with a new frontend application for interacting with your keyboard. - -The app is available for compatible browsers, and as an installable desktop application for Linux, macOS, and Windows. - - - -{/* truncate */} - -## Gratitude - -I'm extremely grateful for everyone who has helped make this release possible, which includes testers, code reviewers/contributors, including [Nick-Munnich], [joelspadin], and [caksoylar], as well as the collection of vendors who have directly sponsored my work on the project, allowing it to come to fruition _much_ faster than it would have taken me to do in my spare time. - -### Vendor Sponsors - -The following sponsors were instrumental in making ZMK Studio possible by sponsoring my work on the firmware and frontend application: - -{(function() { -const sponsors = [ -{ -level: "Platinum", -vendors: [ -{ -name: "nice!keyboards / typeractive", -img: niceAndTyperactive, -darkModeImg: niceAndTyperactiveDarkMode, -url: "https://typeractive.xyz/", -}, -{ -name: "Kinesis", -img: kinesis, -darkModeImg: kinesisDarkMode, -url: "https://kinesis-ergo.com/", -}, -], -}, -{ -level: "Gold+", -vendors: [ -{ -name: "CannonKeys", -img: cannonKeys, -darkModeImg: cannonKeysDarkMode, -url: "https://cannonkeys.com/", -}, -{ -name: "Keychron", -img: keychron, -darkModeImg: keychronDarkMode, -url: "https://keychron.com/", -}, -], -}, -{ -level: "Gold", -vendors: [ -{ -name: "Little Keyboards", -img: littleKeyboards, -darkModeImg: littleKeyboardsDarkMode, -url: "https://littlekeyboards.com/", -}, -{ -name: "Keebmaker", -img: keebmaker, -darkModeImg: keebmakerDarkMode, -url: "https://keebmaker.com/", -}, -], -}, -{ -level: "Silver", -vendors: [ -{ -name: "keeb.io", -img: keebio, -url: "https://keeb.io/", -}, -{ -name: "Mode Designs", -img: mode, -darkModeImg: modeDarkMode, -url: "https://modedesigns.com/", -}, -], -}, -{ -level: "Bronze", -vendors: [ -{ -name: "deskhero", -img: deskHero, -darkModeImg: deskHeroDarkMode, -url: "https://deskhero.ca/", -}, -{ -name: "PhaseByte", -img: phaseByte, -url: "https://phasebyte.com/", -}, -{ -name: "Mechlovin'", -img: mechlovin, -darkModeImg: mechlovinDarkMode, -url: "https://mechlovin.studio/", -}, -], -}, -{ -level: "Additional", -vendors: [ -{ -name: "splitkb.com", -img: splitkb, -darkModeImg: splitkbDarkMode, -url: "https://splitkb.com/", -}, -{ -name: "keycapsss", -img: keycapsss, -darkModeImg: keycapsssDarkMode, -url: "https://keycapsss.com/", -}, -{ -name: "mekibo", -img: mekibo, -darkModeImg: mekiboDarkMode, -url: "https://mekibo.com/", -}, -], -}, -]; - -return sponsors.map(g => { -return ( - -
-

{g.level} Level

-
- {g.vendors.map((v) => { - return ( - - - - ); - })} -
-
-); }); }())} - -## Using ZMK Studio - -:::note - -For keyboard maintainers, additional changes are needed to add metadata about the keyboard's physical layouts in order to use ZMK Studio. See the documentation on [physical layouts](/docs/hardware-integration/physical-layouts#optional-keys-property) for more information. -::: - -To use ZMK Studio, you need to have a firmware for your keyboard with the feature enabled, as well as a small keymap change to add an unlock key. See [Building with ZMK Studio](/docs/features/studio#building) and [ZMK Studio keymap changes](/docs/features/studio#keymap-changes) for more details. - -See [Accessing ZMK Studio](/docs/features/studio#accessing-zmk-studio) for more details on the browser and desktop options for using the ZMK Studio application. -Note: Depending on your browser, operating system, and app vs website selection, you may be limited to connecting over USB. See the previous link for details. - -## In-Tree Supported Keyboards - -The following in-tree keyboards have been updated to support ZMK Studio. -If your keyboard is supported by an external module/config, check with the maintainer to see -if support has been added. - -{(function() { -return ( - -
    - {Metadata.filter((m) => (m.features || []).includes("studio")).map((m) => { - return
  • {m.name}
  • ; - })} -
-); }())} - -## Next Steps - -The ZMK Studio MVP is truly that, a "minimum viable product". It establishes the core firmware functionality and frontend application infrastructure in order to validate the technology, prove the approaches, and get initial core features into user's hands as early as possible. - -There are many ZMK features that are not yet possible to update in ZMK Studio. For a better understanding of where ZMK Studio is today, and where we are headed, please have a look at the [ZMK Studio capabilities](/docs/features/studio#capabilities) table. - -[petejohanson]: https://github.com/petejohanson -[caksoylar]: https://github.com/caksoylar -[Nick-Munnich]: https://github.com/Nick-Munnich -[joelspadin]: https://github.com/joelspadin diff --git a/docs/blog/2025-03-20-contributor-sync-1.md b/docs/blog/2025-03-20-contributor-sync-1.md deleted file mode 100644 index 9267a8e5..00000000 --- a/docs/blog/2025-03-20-contributor-sync-1.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Contributor Sync February 2025 -authors: nmunnich -tags: [sync, keyboards, firmware, oss, ble] ---- - -On the 26th of February some of the ZMK contributors got together for a contributor sync. In the interest of transparency, it was decided that meeting notes from the sync would be published on the ZMK webpage. - - - -The following contributors were able to attend the sync: - -- [petejohanson] -- [caksoylar] -- [nmunnich] - -[joelspadin] was also able to comment on the meeting notes after the meeting. The notes have been adjusted accordingly. - -## Meeting Notes - -### Meeting Purpose - -- Purpose of meeting is to sync up, discuss blockers, talk about big picture work. -- Meeting notes should be published on the webpage, while the meetings themselves are private. - -### Pete's Summary - -- Starting a new job Mon. 2025-03-03. Reduced time for ZMK, but more freedom to work on what Pete wants/ZMK needs. -- Two main ZMK-contracts need to be finished: - - Pointer work. Basically good to go, just needs 2721 to be tested and verified as as fix. Then ZMK release v0.2 will happen. (This has already happened at time of publishing these notes) - - Wired split work. Separated into parts: - - UART full duplex, PR 2766. What's there seems very solid, barring some final touchups. Should have v0.2 released prior to merging this. (This has already happened at time of publishing these notes) - - Half-duplex with a single wire. To be a separate PR, but framework should be good for when that happens. To work on after UART full duplex is merged. - - Runtime dynamic switching between wired and wireless split using a GPIO as sense pin for wired. -- After contracts finish, look at versioning again. Better documentation, defaults, workflow improvements, etc. -- More Studio work is also on the cards. Studio work will continue, but slowly. - - Hoping for help from community around UI/UX, in particular clarity around saving edited keymaps would be good. - - Want to add runtime property modification next, allowing for e.g. changing hold-tap flavors in Studio. -- Investigate zmk-cli a bit; Pete has not investigated this enough and wants to get a solid overview of it. - -### Nick's summary: - -- Trying to make combo PR feasible (allows combo triggers inside behaviors, enabling e.g. tap-only combos) - - Adding `behavior_state_changed` event has a precursor (see 573, 532) - - Requires deleting ZMK_BEHAVIOR_TRANSPARENT - - Requires some refactoring/investigating of sensors/encoders, as they rely on ZMK_BEHAVIOR_TRANSPARENT -- Locking PR, needs review. Same with 2811. -- RP2040-Zero board definition matches upstream, acts as a temporary board definition until we update Zephyr (introduced to Zephyr in 4.1) -- Parameterised mod-morph and tap-dance - - Question: Do we move hold-tap over to the same system? - - Plan after discussion is to add a second hold-tap `compatible` and move over to it, to avoid breaking existing keymaps. -- Config index page and "Customising ZMK" docs overhaul, making them more visible and easier to understand. - -### Cem's summary: - -- Keymap recipes has been shelved for the time being. Prefer to have better examples in the behavior pages themselves, e.g. timeless homerow mods as an example under hold-tap. -- Hold-tap page needs overhauling. (This has already happened at time of publishing these notes) -- New behavior guide needs overhauling and should be aimed towards modules. -- 2758 needs a review and merge. (This has already happened at time of publishing these notes) - -### Other Discussion: - -#### ZMK-CLI: - -- It is likely time to rip the bandaid off and switch over to it, getting rid of the old setup script. -- CLI has some flaws that may need improvement (e.g. around modules), but is already much better than the existing script. -- New shield guide should be adjusted to take advantage of ZMK-CLI's templates. -- Joel requests issues be opened talking about points to improve on. - -#### zmk-locales: - -- Should be moved under zmkfirmware organisation - - Should do the same for zmk-locales-generator, and maybe figure out a way to set up a GH action that makes it send PRs to zmk-locales. - - Move first, make these adjustments afterwards - - Documenting them in list of keycodes page with a locale selector would be ideal, but complex - - Refer people to headers directly in the docs for the time being -- Runtime locale changing would be preferred, but would also be a lot of work. - - zmk-locales could be viewed as a (semi-permanent) bandaid until such a time - -#### Modules: - -- Need to find the right balance between overloading contributers and overfragmentation -- ZMK module collection https://github.com/nmunnich/zmk-module-collection seems like a good way to go forward - - Main concerns: - - Need to handle breaking changes elegantly, informing users _which_ module is to blame for the new version not working - - Need to have tests for modules (can assume keyboard works if it builds, what about other stuff?) - - Maintainability - - Hopefully have more volunteers from the community to look at modules and verify them, should be much easier than reviewing PRs - - Automated tests - - Add an "experimental" group tag for unverified modules - - Despite concerns, plenty of upsides. Seems like the best way forwards, and it is worth putting more time into. - - Some upsides: - - Very easy for users to add modules, particularly ones that depend on other modules - - Automated testing and notification for module owners - - Better discoverability - - Versioning parity between the collection and ZMK itself to allow for easy upgrades - - Likely will want to introduce "RC" releases, to allow module owners the time to fix any issues with their module before an actual release - - Likely will only accept keyboards and drivers initially, until better tooling and systems are in place, given they are easier to validate - -#### Minor notes: - -- Documenting BLE tests would be useful -- Need new display and lighting systems at some point -- Zephyr upgrade was not discussed in this meeting -- Would be good to give some extra priority to PRs from new contributors, to help motivate them. -- Would be nice to have another SOTF at some point. Doing a full commit overview is unfeasible at this point, but touching on the major issues seems doable. - -[petejohanson]: https://github.com/petejohanson -[joelspadin]: https://github.com/joelspadin -[caksoylar]: https://github.com/caksoylar -[nmunnich]: https://github.com/nmunnich diff --git a/docs/blog/2025-06-20-pinned-zmk.md b/docs/blog/2025-06-20-pinned-zmk.md deleted file mode 100644 index 4c9cb06e..00000000 --- a/docs/blog/2025-06-20-pinned-zmk.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: "Pin your ZMK version" -authors: nmunnich -tags: [keyboards, firmware, oss, versioning] ---- - -ZMK is preparing for a big breaking change. As such, users should consider pinning their ZMK version. Read on to find out more about our versioning system and how you can pin your ZMK version. - - - -## ZMK Versioning -- The 'what' and the 'why' - -Around 6 months ago, ZMK began using versioning. Prior to this point, all ZMK users ran their firmware off of `main`. This meant that users would always get the latest and greatest changes whenever they built new firmware, but on occasion there would be breaking changes in `main` that resulted in user confusion. - -Avoiding this user confusion became a limiting factor when it came to making changes. [Zephyr](https://www.zephyrproject.org/), the RTOS that ZMK is based off of, made some breaking changes in version 3.6. Hence ZMK has been stuck on Zephyr 3.5 for over 1.5 years, while Zephyr has already moved on to version 4.1. Asking when ZMK will upgrade is a frequent question we get asked, as the new version comes with plenty of improvements and drivers for newer, exciting hardware. - -With versioning now in place, users can pin their ZMK configuration to a particular version. This prevents sudden breaking changes from happening without user opt-in and frees ZMK contributors to make breaking changes more frequently, as is necessary. - -### ZMK's Versioning System - -ZMK follows the [Semantic Versioning](https://semver.org/) standard. Versions are `vX.Y.Z`. ZMK uses release branches and tags: Every major or minor version bump, a new branch and tag are created. The tag points to the latest patch version. For example, when releasing `v0.2.0` the branch `v0.2-branch` and tag `v0.2` were created. When patches are made, such as for `v0.2.1`, the branch and tag are updated to point to `v0.2.1` instead of `v0.2.0`. This way, users can receive non-breaking security and bug fixes without needing to bump their version. - -Whenever ZMK releases a major version with breaking changes, a proper changelog will be provided detailing the major changes from the previous version, along with clear instructions on how to upgrade and fix any breaking changes. - -## To Pin or Not To Pin - -For casual users of ZMK, pinning your version is recommended. Unpinned ZMK configurations are mainly suitable for those more heavily involved or interested in ZMK development. Moving forward, if you are on the `main` branch of ZMK you will be considered a (highly valued) tester, rather than a user. - -To ensure that you still update your ZMK version regularly and get the latest and greatest features that interest you, I would recommend setting up notifications about new releases. You can do so on the [GitHub repository](https://github.com/zmkfirmware/zmk): - -![Image of where to find the custom notifications](assets/2025-06-20-pinned-zmk/release1.png) -![Image of setting custom notification](assets/2025-06-20-pinned-zmk/release2.png) - -## How To Pin Your ZMK Version - -:::info -If you created your ZMK config on or after `2025-07-03`, then you are already pinned to what was the most recent ZMK version at the time of creation. -::: - -To pin your ZMK version, you need to edit two files: - -### West Manifest - -You need to edit the `config/west.yml` file in your `zmk-config` repository. The `config` folder also contains your keymaps, and is located next to the `build.yaml` file defining which keyboards are built in the first place. - -Your `west.yml` should look something like this (example without [modules](/docs/features/modules) shown for simplicity): - -```yaml {8} showLineNumbers -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - projects: - - name: zmk - remote: zmkfirmware - revision: main - import: app/west.yml - self: - path: config -``` - -Simply edit the line `revision` to point to the release tag instead of `main`. At the time of writing, the latest release is `v0.2`, making your `west.yml` look something like this: - -```yaml {8} showLineNumbers -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - projects: - - name: zmk - remote: zmkfirmware - revision: v0.2 - import: app/west.yml - self: - path: config -``` - -See that `main` has changed to `v0.2` on the 8th line. - -### GitHub Action - -You need to edit `.github/workflows/build.yml` in your `zmk-config`. Again, we are simply replacing `main` with the latest release tag (`v0.2` at time of writing): - -```yaml {6} showLineNumbers -name: Build ZMK firmware -on: [push, pull_request, workflow_dispatch] - -jobs: - build: - uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main -``` - -Your file's contents should look identical to the above. Replace with the below: - -```yaml {6} showLineNumbers -name: Build ZMK firmware -on: [push, pull_request, workflow_dispatch] - -jobs: - build: - uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@v0.2 -``` - -The change occurred on the last line. - -### Version Bumping - -If in the future you wish to upgrade your ZMK's version, simply change the tag in both of these files. For example, change from `v0.1` to `v0.2`. - -[nmunnich]: https://github.com/nmunnich diff --git a/docs/blog/2025-12-09-zephyr-4-1.md b/docs/blog/2025-12-09-zephyr-4-1.md deleted file mode 100644 index 0d3eb07f..00000000 --- a/docs/blog/2025-12-09-zephyr-4-1.md +++ /dev/null @@ -1,447 +0,0 @@ ---- -title: "Zephyr 4.1 Update" -authors: nmunnich -tags: [firmware, zephyr, core] ---- - -We're happy to announce that after a long wait, ZMK's `main` branch is now running [Zephyr 4.1](https://docs.zephyrproject.org/latest/releases/release-notes-4.1.html)! - - - -:::note - -The following changes have been made since this blog post was originally published: - -- The [move to `zmk` variants by default](https://github.com/zmkfirmware/zmk/pull/3145) for ZMK boards was documented. - -::: - -Zephyr 4.1 is a large leap forward from our previous version of 3.5, featuring: - -- Support for lots of new SoCs, boards, and shields, such as the WCH CH32V003, the Raspberry Pi Pico 2, and [many many more](https://docs.zephyrproject.org/4.1.0/boards/index.html#boards). -- Hardware Model V2 (HWMv2), providing better support for SoCs which have multiple cores on the same chip, such as the nRF5340. -- Lots of new drivers for chips such as the nPM1300. - -This was a very large undertaking, and a big congratulations and thanks to [petejohanson] is due for all of his hard work in making this possible. - -After we have verified functionality, ironed out any major bugs, and given any third party module maintainers time to update their code, we will be releasing ZMK `v0.4` as the first version to include this Zephyr version update. - -**All** out-of-tree keyboards will need to be updated to use HWMv2. If you maintain such a keyboard, you can find instructions on doing so [below](#moving-to-hwmv2). - -## Switching To the Previous Release - -Some readers may be coming here because the above changes have _broken_ their builds. ZMK uses a formal release process that allows users to build against a specific release, instead of following the unstable/development version found in the `main` branch. However, since this is a relatively new process, many users may still be tracking `main`. - -For all users, except those willing to accept periodic breaks they need to track down, we highly recommend [pinning your ZMK version](./2025-06-20-pinned-zmk.md). Doing so will allow you to avoid any issues related to the Zephyr upgrade, and allow you to choose when to upgrade to a future ZMK release when you are ready. - -## Getting The Changes - -### User Config Repositories Using GitHub Actions - -Existing user repositories that have `revision: main` in their `west.yml` will receive the changes automatically when rebuilding. - -Any user repositories created on or after `2025-07-03` are currently pinned to the most recent ZMK release. You will need to change over to `main` to get these changes immediately, or wait for `v0.4` and upgrade your version then. -See the recent [blog post on pinning ZMK versions](./2025-06-20-pinned-zmk.md) for more information. - -Likewise, if you are currently on `main` but do not wish to upgrade yet, please pin your ZMK version to `v0.3` by following the instructions in said blog post. - -### VS Code & Docker (Dev Container) - -If you build locally using VS Code & Docker then: - -- Pull the latest ZMK `main` with `git pull` for your ZMK checkout -- Reload the project -- If you are prompted to rebuild the remote container, click `Rebuild` -- Otherwise, press `F1` and run `Remote Containers: Rebuild Container` -- Once the container has rebuilt and reloaded, run `west update` to pull the updated Zephyr version and its dependencies. - -Once the container has rebuilt, VS Code will be running the 4.1 Docker image. - -### Local Host Development - -The following steps will get you building ZMK locally against Zephyr 4.1: - -- Run the updated [toolchain installation](/docs/development/local-toolchain/setup) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) -- Install the latest version of `west` by running `pip3 install --upgrade west` in a virtual environment, or add the `--user` flag if `west` is installed globally: `pip3 install --user --upgrade west`. -- Pull the latest ZMK `main` with `git pull` for your ZMK checkout -- Run `west update` to pull the updated Zephyr version and its dependencies -- Run `west packages pip --install` to update required Python packages - -From there, you should be ready to build as normal! - -## ZMK Board Variant - -The new Zephyr version includes a [standard mechanism for extending boards](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#board-extensions) found in Zephyr (like the Seeeduino XIAO, or Raspberry Pi Pico) with new variants that include additional configuration/defaults that are relevant to the application. This also means the original "stock" board can still be used as is, if consumers don't want to use those customizations for any reason. - -As a result, all board definitions found in the ZMK tree now must be used with a `zmk` variant. For example, the previous board ID of `adv360pro_left` would now be `adv360pro_left/nrf52840/zmk`, which can be shortened to `adv360pro_left//zmk` since there's only one SoC on the board. - -## Board Revisions - -As part of this change, ZMK is now using board/shield revisions, rather than duplicate board/shield definitions. This means that instead of having e.g. `nice_nano`, and `nice_nano_v2`, we only have `nice_nano`, which by default points to the `2.0.0` revision. To point to the original Nice!Nano V1, you would need to use `nice_nano@1.0.0` where you would have previously used `nice_nano`. Of course, you could also put `nice_nano@2.0.0` if you wished to make that explicit, instead of merely replacing `nice_nano_v2` with `nice_nano`. Some boards, such as the `nrfmicro`, also have additional _board qualifiers_ such as the choice between multiple SoCs. Board qualifiers must always be specified, and do not have defaults. See [Zephyr's overview](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#board-terminology) for more information on board qualifiers. The below table provides an overview of some of the differences in in-tree boards we have in ZMK, and how they are selected in the new build system. The shorthand shows the minimum needed to build with a specific board, taking into account defaults. - -- nice!nano (`nice_nano`) - - `nice_nano` -> `nice_nano@1.0.0//zmk` (short: `nice_nano@1//zmk`) - - `nice_nano_v2` -> `nice_nano@2.0.0//zmk` (short: `nice_nano//zmk`) -- nRFMicro (`nrfmicro/nrf52840`) - - `nrfmicro_11` -> `nrfmicro@1.1.0/nrf52840/zmk` (short: `nrfmicro@1.1/nrf52840/zmk`) - - `nrfmicro_11_flipped` -> `nrfmicro@1.1.0/nrf52840/flipped_zmk` (short: `nrfmicro@1.1/nrf52840/flipped_zmk`) - - `nrfmicro_13` -> `nrfmicro@1.3.0/nrf52840/zmk` (short: `nrfmicro/nrf52840/zmk`) - - `nrfmicro_13_52833` -> `nrfmicro@1.3.0/nrf52833/zmk` (short: `nrfmicro/nrf52833/zmk`) -- Mikoto (`mikoto`) - - `mikoto` -> `mikoto@5.20.0//zmk` (short: `mikoto//zmk`) - - `mikoto@6.1` -> `mikoto@6.1.0//zmk` (short: `mikoto@6//zmk`) - - `mikoto@7.2` -> `mikoto@7.2.0//zmk` (short: `mikoto@7//zmk`) -- XIAO RP2040 (`xiao_rp2040`) - - `seeeduino_xiao_rp2040` -> `xiao_rp2040//zmk` -- XIAO nRF52840/BLE (`xiao_ble`) - - `seeeduino_xiao_ble` -> `xiao_ble//zmk` -- BT60 (`bt60`) - - `bt60_v1` -> `bt60@1.0.0//zmk` - - `bt60_v2` -> `bt60@2.0.0//zmk` - - `bt60_hs` -> `bt60_hs//zmk` -- Planck (`planck`) - - `planck_rev6` -> `planck//zmk` -- BDN9 (`bdn9`) - - `bdn9_rev2` -> `bdn9//zmk` -- Ferris Rev2 (`ferris`) - - `ferris_rev02` -> `ferris@2.0.0//zmk` (short: `ferris//zmk`) -- Corne-ish Zen (`corneish_zen`) - - `corneish_zen_v2_left` -> `corneish_zen_left@2.0.0//zmk` (short: `corneish_zen_left//zmk`) - - `corneish_zen_v2_right` -> `corneish_zen_right@2.0.0//zmk` (short: `corneish_zen_right//zmk`) - - `corneish_zen_v1_left` -> `corneish_zen_left@1.0.0//zmk` (short: `corneish_zen_left@1//zmk`) - - `corneish_zen_v1_right` -> `corneish_zen_right@1.0.0//zmk` (short: `corneish_zen_right@1//zmk`) - -The boards above are those which have changed in ZMK's tree, with the addition of the very popular XIAO series. For other boards in Zephyr's tree, please refer to the Zephyr documentation or source files directly. - -## Moving To HWMv2 - -The move to HWMv2 has already been completed for all boards in ZMK's `main` branch. For out-of-tree boards, those need to be converted using either an automated script provided by the Zephyr project, or manually. - -:::note - -This _only_ applies to boards. Shields do not need any changes to account for the move to HWMv2. - -::: - -### Board Upgrade Script - -The Zephyr project provides a script to automate updating a board to HWMv2. To run the script, you'll need to have a local [development setup](/docs/development/local-toolchain/setup/) ready to use. You'll need to ensure you've updated to the new ZMK version and run `west update` to ensure you've got the new Zephyr version with the script available. - -:::note - -The board upgrade script does _not_ work well with split designs. If upgrading a split keyboard board definition, you'll need to update it by hand. - -::: - -The following parameters are relevant for out-of-tree boards: - -- `--board-root ` -- The board ID to update, e.g. `tenbit`. -- `-v ` -- The vendor for the board, this should be a vendor ID, or designer nickname. -- `-g ` -- The name of the group directory under which to place the new board files. Typically this will match the vendor ID. -- `-s ` -- The SoC identifier, e.g. `nrf52840`, `rp2040`, `stm32f411xe`. - -For example: - -```sh -$ python3 zmk/zephyr/scripts/utils/board_v1_to_v2.py \ - --board-root my-zmk-module -b my_board \ - -v my_company -g my_group -s nrf52840 -``` - -### Migrating an Out-Of-Tree Board Manually - -The following steps can be completed manually if you encounter issues with the upgrade script, or don't have a local development setup available. - -#### Vendor Directory - -Boards no longer need to live in a parent directory named after the architecture of the board (.e.g `boards/arm`), and should instead be placed in a vendor/designer named directory (e.g. `boards/my_company`). - -#### Write a `board.yml` - -In your board's folder, next to other files such as `.dts`, add a file called `board.yml`. This file should have the following structure: - -```yml title="board.yml" -board: - name: - vendor: - revision: - format: - default: - exact: - revisions: - - name: - - name: - ... - socs: - - name: - variants: - - name: - - name: - variants: - - name: - ... - - name: - ... -``` - -In the above: - -- `` is the name of the board as specified when selecting a build target, such as `nice_nano`. -- `` is the name of the board's vendor, such as `nicekeyboards`. If you are an individual, rather than acting as an organization, please use your name/online id/similar (e.g. `zhiayang` in the case of the `mikoto`). This value should match the vendor directory name that the board definition folder is placed in the previous section. -- `revision` defines any board revisions. See [Zephyr's overview](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#multiple-board-revisions) for more information on board revisions. If your board does not have any revisions, you can omit this section. -- `socs` lists all SoCs that your board could have, e.g. `nrf52840` or `stm32f072xb`. If your board only has one SoC available and no variants, then the SoC can be omitted when selecting a build target, but must still be specified in this file. For an understanding of SoC variants, refer to the Zephyr documentation. - -If you need to define multiple boards in the same `board.yml`, such as for a split keyboard, you can do so like this: - -```yml -boards: - - name: - ... - - name: - ... -``` - -#### Revision adjustments - -If, as a side effect of adding revisions, you renamed the board (e.g. `ferris_rev02` -> `ferris`), you should adjust the other places where the board name was previously -- `.zmk.yml` and `.yaml`. You may also need to rearrange/consolidate other Kconfig flags and devicetree nodes. See [the Zephyr documentation](https://docs.zephyrproject.org/latest/hardware/porting/board_porting.html#multiple-board-revisions) for more details. - -#### Adjust Kconfig files - -##### `Kconfig.` - -Previously, your board folder will have had a file named `Kconfig.board`. This should be renamed to `Kconfig.`, where `` is the board name given in `board.yml`. The contents of this file will previously look something like this: - -```title="Kconfig.board" -config BOARD_FERRIS - bool "Ferris rev 0.2" - depends on SOC_STM32F072XB -``` - -Remove the `bool` and change the `depends on` to a `select`: - -```title="Kconfig.ferris" -config BOARD_FERRIS - select SOC_STM32F072XB -``` - -If you had multiple boards specified for different SoCs, you should consolidate them to one: - -```title="Kconfig.nrfmicro" -config BOARD_NRFMICRO - select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840 - select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_FLIPPED - select SOC_NRF52833_QIAA if BOARD_NRFMICRO_NRF52833 -``` - -##### `_defconfig` - -Previously, this file was used to select the board and SOC with Kconfig flags. All such selections should be removed from this file. For example, all of the below flags should be removed: - -``` -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52833_QIAA=y -CONFIG_SOC_NRF52840_QIAA=y -CONFIG_BOARD_=y -CONFIG_SOC_SERIES_STM32F0X=y -CONFIG_SOC_STM32F072XB=y -``` - -#### DeviceTree changes - -For most boards, aside from rearranging due to moving to revisions, there should be no changes necessary to the devicetree nodes. However, if your board makes use of upstream Zephyr drivers, these may have been renamed (e.g. Ferris' `microchip,mcp230xx` has been changed to `microchip,mcp23017`). - -## General Board/Shield Changes - -A few other changes, unrelated to the HWMv2 move, may impact out-of-tree boards/shields: - -### Bootloader Setup - -With the version bump, the previous method to enable `&bootloader` has been disabled. Instead, ZMK is introducing _boot retention_, which as a side effect also enables `&bootloader` for SoCs which previously didn't work with said behavior, such as the STM32F072. To set up boot retention for your board, please read through [the dedicated page](/docs/hardware-integration/bootloader). - -### nRF52840 NFC Pins as GPIO - -If your board or shield is using either of the nRF52840 NFC pins, as is often done with the XIAO nRF52840, you'll need to perform an additional update. - -#### Remove deprecated Kconfig symbol - -Previously, using those pins required enabling `CONFIG_NFCT_PINS_AS_GPIOS=y` in some Kconfig file. That Kconfig symbol has been removed, so remove any use of that Kconfig symbol from your board/shield. - -#### Set up NFC GPIO devicetree - -The following should be added to the board or shield's devicetree, e.g. in `.dtsi` or in a board specific shield overlay file like `/boards/xiao_ble.overlay`: - -```dts -&uicr { - nfct-pins-as-gpios; -}; -``` - -### nRF52840 DC/DC Modes - -For boards with the necessary additional hardware to enable DC/DC modes for the reg0 and/or reg1 power stages, the configuration to enable DC/DC has also moved out of Kconfig and into devicetree. - -#### Remove Kconfig Settings - -Usually, the DC/DC modes were enabled in the board's `Kconfig.defconfig` file, looking like: - -```Kconfig -config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_MY_BOARD) - -config BOARD_ENABLE_DCDC_HV - bool "High voltage DCDC converter" - select SOC_DCDC_NRF52X_HV - default n - depends on (BOARD_MY_BOARD) -``` - -Remove the lines from the file that look like above, or remove the `Kconfig.defconfig` file entirely if that is the only content contained therein. - -#### Add DC/DC setup to devicetree - -The DC/DC mode is now enabled for the `®0` and `®1` devicetree nodes, depending on which stage you want to use in that mode. - -For a high voltage board, where the necessary inductor is connected to the `DCCH` pin, enable the following in the board's `.dts` file: - -```dts -®0 { - status = "okay"; -}; -``` - -For both high voltage and non-HV boards, where the necessary inductor is connected to the `DCC` pin, enable the following in the board's `.dts` file: - -```dts -®1 { - regulator-initial-mode = ; -}; -``` - -### RP2040 Board Adjustments - -A few small tweaks are required for custom/out-of-tree RP2040 based boards: - -#### Clock control - -RP2040 boards now require clock control enabled to use several peripherals, including USB. - -The following should be added to the board's `_defconfig` file: - -```dts -CONFIG_CLOCK_CONTROL=y -``` - -#### Base devicetree changes - -The location for the base set of devicetree these boards need to include has changed. In the board's `.dts` file, replace: - -```dts -#include -``` - -with - -```dts -#include -``` - -Next, any fixed clock node needs to be removed: - -```dts - xtal_clk: xtal-clk { - compatible = "fixed-clock"; - clock-frequency = <12000000>; - #clock-cells = <0>; - }; -``` - -And the following added, to set up the core device hardware properly: - -```dts -&timer { - status = "okay"; -}; - -&rtc { - clocks = <&clocks RPI_PICO_CLKID_CLK_RTC>; - status = "okay"; -}; - -&vreg { - regulator-always-on; - regulator-allowed-modes = ; -}; -``` - -Lastly, an additional property must be added to the `chosen` node to supplement the existing properties there: - -```dts -/ { - chosen { - ... - zephyr,flash-controller = &ssi; - ... - }; -}; -``` - -### LED Strip Kconfig Changes - -If your board or shield uses RGB underglow, the following Kconfig flag which was previously enabled should now be removed: - -``` -CONFIG_WS2812_STRIP=y -``` - -If this is the only SPI device your shield uses, also remove the Kconfig flag enabling SPI (assuming it is present). It will be automatically enabled. - -### Cirque Pinnacle Input Driver - -Upstream Zephyr now contains a driver for the popular small Cirque Pinnacle trackpads. To transition to the new upstream driver, instead of the [out-of-tree module](https://github.com/petejohanson/cirque-input-module), some small adjustments are needed. - -#### Remove module references - -Often, the out-of-tree module is referenced from the `west.yml` in user's repos. The entry pointing to the module should be removed from your `projects` list there. If building locally, be sure you are not adding the module directory to the `ZMK_EXTRA_MODULES` CMake parameter. - -#### Devicetree changes - -The properties for the upstream driver can be found [here](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/input/cirque%2Cpinnacle-i2c.html#dtbinding-cirque-pinnacle-i2c). The following changes are required when migrating: - -- The `dr-gpios` property in out-of-tree module is named `data-ready-gpios`, so renaming the property is required. -- Instead of an opt-out `no-taps` property to disable taps, you can enable primary taps with `primary-tap-enable`. -- The `sleep` property is now named `sleep-mode-enable`. -- Use `invert-x`/`invert-y` instead of `x-invert`/`y-invert`. -- Use `swap-xy` instead of `rotate-90`. - -## Other Changes - -LVGL was updated to 9.3.0, which comes with breaking API changes. If you are using custom widgets or displays from a module, these will likely need fixing. See the [LVGL changelog](https://docs.lvgl.io/master/CHANGELOG.html#v9-3-0-3-june-2025) for details. - -## Board Extensions - -Zephyr has formalized the concept of "board extensions", allowing modules/applications to extend boards that are defined elsewhere. If using a board from the upstream Zephyr project that ZMK hasn't yet extended with default settings, e.g. enabling the `CONFIG_ZMK_USB` symbol, users can add their own extensions to their modules under the `/boards/extensions//` directory. See https://github.com/zmkfirmware/zmk/tree/main/app/boards/extensions for the extensions that ZMK has added. - -## Zephyr Upgrade Instructions - -Should you encounter any other issues with custom or out-of-tree Zephyr code, consider consulting the following Zephyr upgrade guides: - -- [3.7 Upgrade](https://docs.zephyrproject.org/4.1.0/releases/migration-guide-3.7.html) -- [4.1 Upgrade](https://docs.zephyrproject.org/4.1.0/releases/migration-guide-4.1.html) - -## Thanks! - -Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. - -## Future - -Once a ZMK version based on Zephyr 4.1 is released, we'll be working towards updating Zephyr even further, to try to catch up with the latest actual Zephyr release. This will likely mean a jump to the upcoming Zephyr 4.3. As part of that work, some other semi-disruptive changes will be required, including: - -- Removing ZMK's use of the deprecated, and now removed, `kscan` APIs in favor of the newer matrix input API. ZMK already supports the matrix input API, but has not yet converted our existing drivers to that API. Advanced users looking to test can try leveraging the upstream Zephyr drivers today to test that functionality, but that is _not_ officially supported and is likely to have bugs or untested side effects. -- Move the new USB stack, that includes better High-Speed USB support. - -[nmunnich]: https://github.com/nmunnich -[petejohanson]: https://github.com/petejohanson diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys-dark-mode.png deleted file mode 100644 index 9c5b7475..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys.png deleted file mode 100644 index fa9ab2c9..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/cannonkeys.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/deskhero-dark-mode.webp b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/deskhero-dark-mode.webp deleted file mode 100644 index 68ad35e1..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/deskhero-dark-mode.webp and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/deskhero.webp b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/deskhero.webp deleted file mode 100644 index 99018cf0..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/deskhero.webp and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebio.avif b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebio.avif deleted file mode 100644 index 294182ec..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebio.avif and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebmaker-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebmaker-dark-mode.png deleted file mode 100644 index d8b6b487..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebmaker-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebmaker.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebmaker.png deleted file mode 100644 index 4341f09a..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keebmaker.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keycapsss-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keycapsss-dark-mode.png deleted file mode 100644 index 28a0eb6c..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keycapsss-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keycapsss.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keycapsss.png deleted file mode 100644 index b9158952..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keycapsss.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keychron-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keychron-dark-mode.png deleted file mode 100644 index 173b8103..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keychron-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keychron.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keychron.png deleted file mode 100644 index 26773f1f..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/keychron.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/kinesis-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/kinesis-dark-mode.png deleted file mode 100644 index 617f2568..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/kinesis-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/kinesis.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/kinesis.png deleted file mode 100644 index 15617580..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/kinesis.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards-dark-mode.avif b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards-dark-mode.avif deleted file mode 100644 index fd8159b7..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards-dark-mode.avif and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards.avif b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards.avif deleted file mode 100644 index 957b4d7a..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/littlekeyboards.avif and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mechlovin-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mechlovin-dark-mode.png deleted file mode 100644 index b1951c20..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mechlovin-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mechlovin.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mechlovin.png deleted file mode 100644 index 136a03ea..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mechlovin.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mekibo-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mekibo-dark-mode.png deleted file mode 100644 index 7058937e..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mekibo-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mekibo.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mekibo.png deleted file mode 100644 index dcfdee9f..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mekibo.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mode-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mode-dark-mode.png deleted file mode 100644 index 27d8a73a..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mode-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mode.png deleted file mode 100644 index fd8f8db4..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive-dark-mode.png deleted file mode 100644 index 39499508..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive.png deleted file mode 100644 index 8172555b..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/niceandtyperactive.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/phasebyte.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/phasebyte.png deleted file mode 100644 index 69259103..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/phasebyte.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/splitkb-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/splitkb-dark-mode.png deleted file mode 100644 index ec0e3204..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/splitkb-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/splitkb.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/splitkb.png deleted file mode 100644 index cb4ff84f..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/splitkb.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot-dark-mode.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot-dark-mode.png deleted file mode 100644 index e0623558..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot-dark-mode.png and /dev/null differ diff --git a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot.png b/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot.png deleted file mode 100644 index c4ada377..00000000 Binary files a/docs/blog/assets/2024-11-11-zmk-studio-mvp-ga/zmk-studio-screenshot.png and /dev/null differ diff --git a/docs/blog/assets/2025-06-20-pinned-zmk/release1.png b/docs/blog/assets/2025-06-20-pinned-zmk/release1.png deleted file mode 100644 index 0b0050c4..00000000 Binary files a/docs/blog/assets/2025-06-20-pinned-zmk/release1.png and /dev/null differ diff --git a/docs/blog/assets/2025-06-20-pinned-zmk/release2.png b/docs/blog/assets/2025-06-20-pinned-zmk/release2.png deleted file mode 100644 index 4a758020..00000000 Binary files a/docs/blog/assets/2025-06-20-pinned-zmk/release2.png and /dev/null differ diff --git a/docs/blog/authors.yml b/docs/blog/authors.yml deleted file mode 100644 index e335cfb5..00000000 --- a/docs/blog/authors.yml +++ /dev/null @@ -1,23 +0,0 @@ -petejohanson: - name: Pete Johanson - title: Project Creator - url: https://gitlab.com/petejohanson - image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 - -nickwinans: - name: Nick Winans - title: Contributor - url: https://github.com/Nicell - image_url: https://avatars1.githubusercontent.com/u/9439650 - -caksoylar: - name: Cem Aksoylar - title: Documentation maintainer - url: https://github.com/caksoylar - image_url: https://avatars.githubusercontent.com/u/7876996 - -nmunnich: - name: Nicolas Munnich - title: Documentation maintainer - url: https://github.com/nmunnich - image_url: https://avatars.githubusercontent.com/u/98408764 diff --git a/docs/docs/assets/features/keymaps/layer-diagram.png b/docs/docs/assets/features/keymaps/layer-diagram.png new file mode 100644 index 00000000..7b42daae Binary files /dev/null and b/docs/docs/assets/features/keymaps/layer-diagram.png differ diff --git a/docs/docs/assets/hardware-integration/numpad.svg b/docs/docs/assets/hardware-integration/numpad.svg deleted file mode 100644 index 073f2864..00000000 --- a/docs/docs/assets/hardware-integration/numpad.svg +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - -0 - - - -1 - - - -2 - - - -3 - - - -4 - - - -5 - - - -6 - - - -7 - - - -8 - - - -9 - - - -10 - - - -11 - - - -12 - - - -13 - - - -14 - - - -15 - - - -16 - - - -17 - - - -18 - - - -19 - - - -0 - - - -1 - - - -2 - - - -3 - - - -4 - - - -5 - - - -6 - - - -7 - - - -8 - - - -9 - - - -10 - - - -11 - - - -12 - - - -13 - - - -14 - - - -15 - - - -16 - - - - diff --git a/docs/docs/assets/hardware-integration/shift-register-daisy.png b/docs/docs/assets/hardware-integration/shift-register-daisy.png deleted file mode 100644 index db4031a6..00000000 Binary files a/docs/docs/assets/hardware-integration/shift-register-daisy.png and /dev/null differ diff --git a/docs/docs/assets/hold-tap/case1_2.svg b/docs/docs/assets/hold-tap/case1_2.svg index 27dada33..697d7346 100644 --- a/docs/docs/assets/hold-tap/case1_2.svg +++ b/docs/docs/assets/hold-tap/case1_2.svg @@ -1,137 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docs/assets/keymaps/layer-diagram.png b/docs/docs/assets/keymaps/layer-diagram.png deleted file mode 100644 index 31ff1489..00000000 Binary files a/docs/docs/assets/keymaps/layer-diagram.png and /dev/null differ diff --git a/docs/docs/assets/troubleshooting/building/devicetree-step.png b/docs/docs/assets/troubleshooting/building/devicetree-step.png deleted file mode 100755 index f2f75764..00000000 Binary files a/docs/docs/assets/troubleshooting/building/devicetree-step.png and /dev/null differ diff --git a/docs/docs/assets/troubleshooting/building/kconfig-step.png b/docs/docs/assets/troubleshooting/building/kconfig-step.png deleted file mode 100755 index 34bbdd22..00000000 Binary files a/docs/docs/assets/troubleshooting/building/kconfig-step.png and /dev/null differ diff --git a/docs/docs/assets/troubleshooting/multimeter/schematic_probe_example.png b/docs/docs/assets/troubleshooting/multimeter/schematic_probe_example.png deleted file mode 100644 index f3536a7e..00000000 Binary files a/docs/docs/assets/troubleshooting/multimeter/schematic_probe_example.png and /dev/null differ diff --git a/docs/docs/assets/troubleshooting/splitpairing/corecoverage.png b/docs/docs/assets/troubleshooting/splitpairing/corecoverage.png new file mode 100755 index 00000000..a2a928be Binary files /dev/null and b/docs/docs/assets/troubleshooting/splitpairing/corecoverage.png differ diff --git a/docs/docs/keymaps/behaviors/backlight.md b/docs/docs/behaviors/backlight.md similarity index 69% rename from docs/docs/keymaps/behaviors/backlight.md rename to docs/docs/behaviors/backlight.md index c65b03ef..322530e3 100644 --- a/docs/docs/keymaps/behaviors/backlight.md +++ b/docs/docs/behaviors/backlight.md @@ -5,7 +5,7 @@ sidebar_label: Backlight ## Summary -This page contains [backlight](../../features/lighting.md#backlight) behaviors supported by ZMK. +This page contains [backlight](../features/backlight.md) behaviors supported by ZMK. ## Backlight Action Defines @@ -36,10 +36,10 @@ Here is a table describing the action for each define: - Parameter #1: The backlight action define, e.g. `BL_TOG` or `BL_INC` - Parameter #2: Only applies to `BL_SET`and is the brightness value -:::note[Backlight settings persistence] -The backlight settings that are changed via the `&bl` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. -They will also override the start values set by [`CONFIG_ZMK_BACKLIGHT_*_START` settings](../../config/lighting.md#kconfig-1). -However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +:::note Backlight settings persistence +The backlight settings that are changed via the `&bl` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +They will also override the start values set by [`CONFIG_ZMK_BACKLIGHT_*_START` settings](../config/backlight.md#kconfig). +However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: ### Examples @@ -58,4 +58,4 @@ However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNC ## Split Keyboards -Backlight behaviors are [global](../../features/split-keyboards.md#global-locality-behaviors): This means that when triggered, they affect both the central and peripheral side of split keyboards. +Backlight behaviors are global: This means that when triggered, they affect both the central and peripheral side of split keyboards. diff --git a/docs/docs/keymaps/behaviors/bluetooth.md b/docs/docs/behaviors/bluetooth.md similarity index 61% rename from docs/docs/keymaps/behaviors/bluetooth.md rename to docs/docs/behaviors/bluetooth.md index 44e38d30..1d461722 100644 --- a/docs/docs/keymaps/behaviors/bluetooth.md +++ b/docs/docs/behaviors/bluetooth.md @@ -9,20 +9,10 @@ The bluetooth behavior allows management of various settings and states related between the keyboard and the host. By default, ZMK supports five "profiles" for selecting which bonded host computer/laptop/keyboard should receive the keyboard input; many of the commands here operate on those profiles. -:::note[Connection Management] -When pairing to a host device ZMK saves bond information to the selected -profile. It will not replace this when you initiate pairing with another device. -To pair with a new device, select a profile that doesn't have a pairing with `BT_SEL`, `BT_NXT` or -`BT_PRV` bindings, or clear an already paired profile using `BT_CLR` or `BT_CLR_ALL`. +:::note Connection Management +When pairing to a host device ZMK saves bond information to the selected profile. It will not replace this when you initiate pairing with another device. To pair with a new device select an unused profile with `BT_SEL`, `BT_NXT` or `BT_PRV` bindings, or by clearing an existing profile using `BT_CLR`. A ZMK device may show as "connected" on multiple hosts at the same time. This is working as intended, and only the host associated with the active profile will receive keystrokes. - -An _inactive_ connected profile can be explicitly disconnected using the `BT_DISC` behavior. This can be helpful in -cases when host devices behave differently when a bluetooth keyboard is connected, for example by hiding their on-screen -keyboard. Note that at present the active bluetooth profile will immediately reconnect if disconnected. This is true -even if OUT_USB is selected. To remain disconnected, another bluetooth profile must be first selected using (e.g.) -`BT_SEL`. - ::: ## Bluetooth Command Defines @@ -38,18 +28,16 @@ This will allow you to reference the actions defined in this header such as `BT_ Here is a table describing the command for each define: -| Define | Action | -| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BT_CLR` | Clear bond information between the keyboard and host for the selected profile. | -| `BT_CLR_ALL` | Clear bond information between the keyboard and host for all profiles. | -| `BT_NXT` | Switch to the next profile, cycling through to the first one when the end is reached. | -| `BT_PRV` | Switch to the previous profile, cycling through to the last one when the beginning is reached. | -| `BT_SEL` | Select the 0-indexed profile by number; must include a number as an argument in the keymap to work correctly, e.g. `BT_SEL 0`. | -| `BT_DISC` | Disconnect from the 0-indexed profile by number, if it's currently connected and inactive; must include a number as an argument in the keymap to work correctly, e.g. `BT_DISC 0`. | +| Define | Action | +| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BT_CLR` | Clear bond information between the keyboard and host for the selected profile. | +| `BT_NXT` | Switch to the next profile, cycling through to the first one when the end is reached. | +| `BT_PRV` | Switch to the previous profile, cycling through to the last one when the beginning is reached. | +| `BT_SEL` | Select the 0-indexed profile by number. Please note: this definition must include a number as an argument in the keymap to work correctly. eg. `BT_SEL 0` | -:::note[Selected profile persistence] -The profile that is selected by the `BT_SEL`/`BT_PRV`/`BT_NXT` actions will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. -However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +:::note Selected profile persistence +The profile that is selected by the `BT_SEL`/`BT_PRV`/`BT_NXT` actions will be saved to flash storage and hence persist across restarts and firmware flashes. +However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: ## Bluetooth Behavior @@ -60,7 +48,7 @@ The bluetooth behavior completes an bluetooth action given on press. - Reference: `&bt` - Parameter #1: The bluetooth command define, e.g. `BT_CLR` -- Parameter #2: Only applies to `BT_SEL` and `BT_DISC`, and is the 0-indexed profile by number +- Parameter #2: Only applies to `BT_SEL` and is the 0-indexed profile by number ### Examples @@ -98,10 +86,10 @@ ZMK support bluetooth “profiles” which allows connection to multiple devices The bluetooth MAC address and negotiated keys during pairing are stored in the permanent storage on your chip and can be reused even after reflashing the firmware. If for some reason you want to delete the stored information, you can bind the `BT_CLR` behavior described above to a key and use it to clear the _current_ profile. -:::note[Number of Profiles] +:::note Number of Profiles Please note there are five available Bluetooth profiles by default. If you need to adjust the number of available profiles, set `CONFIG_BT_MAX_CONN` _and_ `CONFIG_BT_MAX_PAIRED` to the desired number of profiles, `n`, or `n+1` for split keyboards, in your `zmk-config` `.conf` file. ::: :::note -If you clear bond of a paired profile, make sure you do the same thing on the peer device as well (typically achieved by _removing_ or _forgetting_ the bluetooth connection). Otherwise the peer will try to connect to your keyboard whenever it discovers it. But while the MAC address of both devices could remain the same, the security key no longer match: the peer device still possess the old key negotiated in the previous pairing procedure, but our keyboard firmware has deleted that key. So the connection will fail. If you [enabled USB logging](../../development/usb-logging.mdx), you might see a lot of failed connection attempts due to the reason of “Security failed”. +If you clear bond of a paired profile, make sure you do the same thing on the peer device as well (typically achieved by _removing_ or _forgetting_ the bluetooth connection). Otherwise the peer will try to connect to your keyboard whenever it discovers it. But while the MAC address of both devices could remain the same, the security key no longer match: the peer device still possess the old key negotiated in the previous pairing procedure, but our keyboard firmware has deleted that key. So the connection will fail. If you [enabled USB logging](../development/usb-logging.md), you might see a lot of failed connection attempts due to the reason of “Security failed”. ::: diff --git a/docs/docs/keymaps/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md similarity index 78% rename from docs/docs/keymaps/behaviors/caps-word.md rename to docs/docs/behaviors/caps-word.md index 861517f2..0233de52 100644 --- a/docs/docs/keymaps/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -5,9 +5,9 @@ sidebar_label: Caps Word ## Summary -The caps word behavior behaves similar to a caps lock, but will automatically deactivate when any key not in a continue list is pressed, or if the caps word key is pressed again. For smaller keyboards using [mod-taps](hold-tap.mdx#mod-tap), this can help avoid repeated alternating holds when typing words in all caps. +The caps word behavior behaves similar to a caps lock, but will automatically deactivate when any key not in a continue list is pressed, or if the caps word key is pressed again. For smaller keyboards using [mod-taps](/docs/behaviors/mod-tap), this can help avoid repeated alternating holds when typing words in all caps. -The modifiers are applied only to the alphabetic (`A` to `Z`) keycodes, to avoid automatically applying them to numeric values, etc. +The modifiers are applied only to to the alphabetic (`A` to `Z`) keycodes, to avoid automatically applying them to numeric values, etc. ### Behavior Binding @@ -21,7 +21,7 @@ Example: ### Configuration -#### Continue list +#### Continue List By default, the caps word will remain active when any alphanumeric character or underscore (`UNDERSCORE`), backspace (`BACKSPACE`), or delete (`DELETE`) characters are pressed. Any other non-modifier keycode sent will turn off caps word. If you would like to override this, you can set a new array of keys in the `continue-list` property in your keymap: @@ -37,7 +37,7 @@ By default, the caps word will remain active when any alphanumeric character or }; ``` -#### Applied modifier(s) +#### Applied Modifier(s) In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, you can override the `mods` property: @@ -59,8 +59,9 @@ If you want to use multiple caps breaks with different codes to break the caps, ```dts / { - prog_caps: prog_caps { + prog_caps: behavior_prog_caps_word { compatible = "zmk,behavior-caps-word"; + label = "PROG_CAPS"; #binding-cells = <0>; continue-list = ; }; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md new file mode 100644 index 00000000..96e03a0e --- /dev/null +++ b/docs/docs/behaviors/hold-tap.md @@ -0,0 +1,337 @@ +--- +title: Hold-Tap Behavior +sidebar_label: Hold-Tap +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## Summary + +Hold-tap is the basis for other behaviors such as layer-tap and mod-tap. + +Simply put, the hold-tap key will output the 'hold' behavior if it's held for a while, and output the 'tap' behavior when it's tapped quickly. + +### Hold-Tap + +The graph below shows how the hold-tap decides between a 'tap' and a 'hold'. + +![Simple behavior](../assets/hold-tap/case1_2.svg) + +By default, the hold-tap is configured to also select the 'hold' functionality if another key is tapped while it's active: + +![Hold preferred behavior](../assets/hold-tap/case_hold_preferred.svg) + +We call this the 'hold-preferred' flavor of hold-taps. While this flavor may work very well for a ctrl/escape key, it's not very well suited for home-row mods or layer-taps. That's why there are two more flavors to choose from: 'tap-preferred' and 'balanced'. + +#### Flavors + +- The 'hold-preferred' flavor triggers the hold behavior when the `tapping-term-ms` has expired or another key is pressed. +- The 'balanced' flavor will trigger the hold behavior when the `tapping-term-ms` has expired or another key is pressed and released. +- The 'tap-preferred' flavor triggers the hold behavior when the `tapping-term-ms` has expired. Pressing another key within `tapping-term-ms` does not affect the decision. +- The 'tap-unless-interrupted' flavor triggers a hold behavior only when another key is pressed before `tapping-term-ms` has expired. It triggers the tap behavior in all other situations. + +When the hold-tap key is released and the hold behavior has not been triggered, the tap behavior will trigger. + +![Hold-tap comparison](../assets/hold-tap/comparison.svg) + +### Basic usage + +For basic usage, please see the [mod-tap](mod-tap.md) and [layer-tap](layers.md#layer-tap) pages. + +### Advanced Configuration + +#### `tapping-term-ms` + +Defines how long a key must be pressed to trigger Hold behavior. + +#### `quick-tap-ms` + +If you press a tapped hold-tap again within `quick-tap-ms` milliseconds of the first press, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). + +#### `require-prior-idle-ms` + +`require-prior-idle-ms` is like `quick-tap-ms` however it will apply for _any_ non-modifier key pressed before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. + +For example, the following hold-tap configuration enables `require-prior-idle-ms` with a 125 millisecond term, alongside `quick-tap-ms` with a 200 millisecond term. + +```dts +rpi: require_prior_idle { + compatible = "zmk,behavior-hold-tap"; + label = "REQUIRE_PRIOR_IDLE"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <200>; + require-prior-idle-ms = <125>; + bindings = <&kp>, <&kp>; +}; +``` + +If you press `&kp A` and then `&rpi LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `require-prior-idle-ms`, without waiting for a timeout or an interrupting key. In other words, the `&rpi LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** the previous key press; otherwise it will act like `&kp B`. + +Note that the greater the value of `require-prior-idle-ms` is, the harder it will be to invoke the hold behavior, making this feature less applicable for use-cases like capitalizing letters while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. + +#### `retro-tap` + +If `retro-tap` is enabled, the tap behavior is triggered when releasing the hold-tap key if no other key was pressed in the meantime. + +For example, if you press `&mt LEFT_SHIFT A` and then release it without pressing another key, it will output `a`. + +```dts +&mt { + retro-tap; +}; +``` + +#### Positional hold-tap and `hold-trigger-key-positions` + +Including `hold-trigger-key-positions` in your hold-tap definition turns on the positional hold-tap feature. With positional hold-tap enabled, if you press any key **NOT** listed in `hold-trigger-key-positions` before `tapping-term-ms` expires, it will produce a tap. + +In all other situations, positional hold-tap will not modify the behavior of your hold-tap. Positional hold-tap is useful when used with home-row modifiers: for example, if you have a home-row modifier key in the left hand, by including only key positions from the right hand in `hold-trigger-key-positions`, you will only get hold behaviors during cross-hand key combinations. + +:::info +Note that `hold-trigger-key-positions` is an array of key position indexes. Key positions are numbered sequentially according to your keymap, starting with 0. So if the first key in your keymap is Q, this key is in position 0. The next key (probably W) will be in position 1, et cetera. +::: + +See the following example, which uses a hold-tap behavior definition, configured with the `hold-preferred` flavor, and with positional hold-tap enabled: + +```dts +#include +#include + +/ { + behaviors { + pht: positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <400>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <1>; // <---[[the W key]] + }; + }; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + default_layer { + bindings = < + // position 0 position 1 position 2 + &pht LEFT_SHIFT Q &kp W &kp E + >; + }; + }; +}; +``` + +- The sequence `(pht_down, E_down, E_up, pht_up)` produces `qe`. The normal hold behavior (LEFT_SHIFT) **IS** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `E key`, which is in position 2, which **is NOT** included in `hold-trigger-key-positions`. +- The sequence `(pht_down, W_down, W_up, pht_up)` produces `W`. The normal hold behavior (LEFT_SHIFT) **is NOT** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `W key`, which is in position 1, which **IS** included in `hold-trigger-key-positions`. +- If the `LEFT_SHIFT / Q key` is held by itself for longer than `tapping-term-ms`, a hold behavior is produced. This is because positional hold-tap only modifies the behavior of a hold-tap if another key is pressed before the `tapping-term-ms` period expires. + +By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after +the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. + +#### Using different behavior types with hold-taps + +You can create instances of hold-taps invoking most [behavior types](../features/keymaps.md#behaviors) for hold or tap actions, by referencing their node labels in the `bindings` value. +The two parameters that are passed to the hold-tap in your keymap will be forwarded to the referred behaviors, first one to the hold behavior and second one to the tap. + +If you use behaviors that accept no parameters such as [mod-morphs](mod-morph.md) or [macros](macros.md), you can pass a dummy parameter value such as `0` to the hold-tap when you use it in your keymap. +For instance, a hold-tap with node label `caps` and `bindings = <&kp>, <&caps_word>;` can be used in the keymap as below to send the caps lock keycode on hold and invoke the [caps word behavior](caps-word.md) on tap: + +```dts +&caps CAPS 0 +``` + +:::info +You cannot use behaviors that expect more than one parameter such as [`&bt`](bluetooth.md) and [`&rgb_ug`](underglow.md) with hold-taps, due to the limitations of the [devicetree keymap format](../config/index.md#devicetree-files). +One workaround is to create a [macro](macros.md) that invokes those behaviors and use the macro as the hold or tap action. +::: + +### Example Use-Cases + + + + + +The following are suggested hold-tap configurations that work well with home row mods: + +##### Option 1: cross-hand only modifiers, using `tap-unless-interrupted` and positional hold-tap (`hold-trigger-key-positions`) + +```dts title="Homerow Mods: Cross-hand Example" +#include +#include + +/ { + behaviors { + lh_pht: left_hand_positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LEFT_POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 + &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI + >; + }; + }; +}; +``` + +##### Option 2: `tap-preferred` + +```dts title="Homerow Mods: Tap-Preferred Example" +#include +#include + +/ { + behaviors { + hm: homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <150>; + quick-tap-ms = <0>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F + >; + }; + }; +}; +``` + +##### Option 3: `balanced` + +```dts title="Homerow Mods: Balanced Example" +#include +#include + +/ { + behaviors { + bhm: balanced_homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <200>; // <---[[moderate duration]] + quick-tap-ms = <0>; + flavor = "balanced"; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F + >; + }; + }; +}; +``` + + + + + +A popular method of implementing Autoshift in ZMK involves a C-preprocessor macro, commonly defined as `AS(keycode)`. This macro applies the `LSHIFT` modifier to the specified `keycode` when `AS(keycode)` is held, and simply performs a [keypress](key-press.md), `&kp keycode`, when the `AS(keycode)` binding is tapped. This simplifies the use of Autoshift in a keymap, as the complete hold-tap bindings for each desired Autoshift key, as in `&as LS() &as LS() ... &as LS() `, can be quite cumbersome to use when applied to a large portion of the keymap. + +```dts title="Hold-Tap Example: Autoshift" +#include +#include + +#define AS(keycode) &as LS(keycode) keycode // Autoshift Macro + +/ { + behaviors { + as: auto_shift { + compatible = "zmk,behavior-hold-tap"; + label = "AUTO_SHIFT"; + #binding-cells = <2>; + tapping_term_ms = <135>; + quick_tap_ms = <0>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys + >; + }; + }; +}; +``` + + + + + +This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) when the keybind is held and a [toggle-layer](layers.md/#toggle-layer) when it is tapped. Similar to the Autoshift and Sticky Hold use-cases, a `MO_TOG(layer)` macro is defined such that the `&mo` and `&tog` behaviors can target a single layer. + +```dts title="Hold-Tap Example: Momentary layer on Hold, Toggle layer on Tap" +#include +#include + +#define MO_TOG(layer) &mo_tog layer layer // Macro to apply momentary-layer-on-hold/toggle-layer-on-tap to a specific layer + +/ { + behaviors { + mo_tog: behavior_mo_tog { + compatible = "zmk,behavior-hold-tap"; + label = "mo_tog"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&tog>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap + MO_TOG(3) // &mo 3 on hold, &tog 3 on tap + >; + }; + }; +}; +``` + + + + + +### Comparison to QMK + +The `hold-preferred` flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default. diff --git a/docs/docs/keymaps/behaviors/key-press.md b/docs/docs/behaviors/key-press.md similarity index 70% rename from docs/docs/keymaps/behaviors/key-press.md rename to docs/docs/behaviors/key-press.md index f60c1776..a298d040 100644 --- a/docs/docs/keymaps/behaviors/key-press.md +++ b/docs/docs/behaviors/key-press.md @@ -8,16 +8,16 @@ sidebar_label: Key Press The most basic of behaviors, is the ability to send certain keycode presses and releases in response to activating a certain key. -The categories of supported keycodes are: +The categories of supported codes are: -- [Keyboard](../list-of-keycodes.mdx#keyboard) -- [Modifiers](../list-of-keycodes.mdx#modifiers) -- [Keypad](../list-of-keycodes.mdx#keypad) -- [Editing](../list-of-keycodes.mdx#editing) -- [Media](../list-of-keycodes.mdx#media) -- [Applications](../list-of-keycodes.mdx#applications) -- [Input Assist](../list-of-keycodes.mdx#input-assist) -- [Power & Lock](../list-of-keycodes.mdx#power--lock) +- [Keyboard & Keypad](../codes/keyboard-keypad.mdx) +- [Editing](../codes/editing.mdx) +- [Media](../codes/media.mdx) +- [Applications](../codes/applications.mdx) +- [Input Assist](../codes/input-assist.mdx) +- [Power](../codes/power.mdx) + +Please visit the [codes](../codes/index.mdx) section for a comprehensive list. For advanced users, user-defined HID usages are also supported but must be encoded, please see [`dt-bindings/zmk/keys.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/keys.h) for further insight. diff --git a/docs/docs/keymaps/behaviors/key-repeat.md b/docs/docs/behaviors/key-repeat.md similarity index 97% rename from docs/docs/keymaps/behaviors/key-repeat.md rename to docs/docs/behaviors/key-repeat.md index 21870084..9772fdb4 100644 --- a/docs/docs/keymaps/behaviors/key-repeat.md +++ b/docs/docs/behaviors/key-repeat.md @@ -19,7 +19,7 @@ Example: ### Configuration -#### Usage pages +#### Usage Pages By default, the key repeat will only track the last pressed key from the HID "Key" usage page, and ignore events from other usages, e.g. Consumer page. diff --git a/docs/docs/behaviors/key-toggle.md b/docs/docs/behaviors/key-toggle.md new file mode 100644 index 00000000..080b5b53 --- /dev/null +++ b/docs/docs/behaviors/key-toggle.md @@ -0,0 +1,26 @@ +--- +title: Key Toggle Behavior +sidebar_label: Key Toggle +--- + +## Summary + +The key toggle behavior toggles the press of a key. +If the key is not currently pressed, key toggle will press it, holding it until the key toggle is pressed again or the key is released in some other way. +If the key _is_ currently pressed, key toggle will release it. + +Example uses for key toggle include shift lock, or `ALT-TAB` window switching without holding down the `ALT` modifier. + +### Behavior Binding + +- Reference: `&kt` +- Parameter: The [keycode](../codes/index.mdx), e.g. `LALT` or `DOWN_ARROW` + +Example: + +```dts +&kt LALT +``` + +You can use any keycode that works for `&kp` as parameter to `&kt`, however, [modified keys](../codes/modifiers.mdx#modifier-functions) such as `LA(A)` will be toggled based on the status of the base keycode (in this case `A`). +In other words, modifiers are ignored when determining whether or not the key is currently pressed. diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md new file mode 100644 index 00000000..162b792f --- /dev/null +++ b/docs/docs/behaviors/layers.md @@ -0,0 +1,155 @@ +--- +title: Layer Behaviors +sidebar_label: Layers +--- + +## Summary + +Often, you may want a certain key position to alter which layers are enabled, change the default layer, etc. +Some of those behaviors are still in the works; the ones that are working now are documented here. + +## Defines To Refer To Layers + +When working with layers, you may have several different key positions with bindings that enable/disable those layers. +To make it easier to refer to those layers in your key bindings, and to change which layers are where later, you can +add a set of `#define`s at the top of your keymap file, and use those layer in your keymap. + +For example, if you have three layers, you can add the following to the top of your keymap: + +```dts +#define DEFAULT 0 +#define LOWER 1 +#define RAISE 2 +``` + +This allows you to use those defines, e.g. `LOWER` later in your keymap. + +## Momentary Layer + +The "momentary layer" behavior enables a layer while a certain key is pressed. Immediately upon +activation of the key, the layer is enabled, and immediately upon release of the key, the layer is disabled +again. + +### Behavior Binding + +- Reference: `&mo` +- Parameter: The layer number to enable/disable, e.g. `1` + +Example: + +```dts +&mo LOWER +``` + +## Layer-tap + +The "layer-tap" behavior enables a layer when a key is held, and outputs a [keypress](key-press.md) when the key is only tapped for a short time. + +### Behavior Binding + +- Reference: `<` +- Parameter: The layer number to enable when held, e.g. `1` +- Parameter: The keycode to send when tapped, e.g. `A` + +Example: + +```dts +< LOWER SPACE +``` + +### Configuration + +You can configure a different tapping term or tweak other properties noted in the [hold-tap](hold-tap.md#advanced-configuration) documentation page in your keymap: + +```dts +< { + tapping-term-ms = <200>; +}; + +/ { + keymap { + ... + }; +}; +``` + +:::info +Functionally, the layer-tap is a [hold-tap](hold-tap.md) of the ["tap-preferred" flavor](hold-tap.md/#flavors) and a [`tapping-term-ms`](hold-tap.md/#tapping-term-ms) of 200 that takes in a [`momentary layer`](#momentary-layer) and a [keypress](key-press.md) as its "hold" and "tap" parameters, respectively. + +For users who want to send a different [keycode](../codes/index.mdx) depending on if the same key is held or tapped, see [Mod-Tap](mod-tap.md). + +Similarly, for users looking to create a keybind like the layer-tap that depending on how long the key is held, invokes behaviors like [sticky keys](sticky-key.md) or [key toggles](key-toggle.md), see [Hold-Tap](hold-tap.md). + +::: + +## To Layer + +The "to layer" behavior enables a layer and disables _all_ other layers _except_ the default layer. + +### Behavior Binding + +- Reference: `&to` +- Parameter: The layer number to enable, e.g. `1` + +Example: + +```dts +&to 3 +``` + +## Toggle Layer + +The "toggle layer" behavior enables a layer until the layer is manually disabled. + +### Behavior Binding + +- Reference: `&tog` +- Parameter: The layer number to enable/disable, e.g. `1` + +Example: + +```dts +&tog LOWER +``` + +"Toggle layer" for a : + +```dts +#define DEFAULT 0 +#define NAVI 1 + +#define NONE 0 + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS + &kp NUMBER_7 &kp NUMBER_8 &kp NUMBER_9 &kp KP_PLUS + &kp NUMBER_4 &kp NUMBER_5 &kp NUMBER_6 &kp KP_PLUS + &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 &kp RETURN + &kp NUMBER_0 &kp NUMBER_0 &kp DOT &kp RETURN + >; + }; + + nav_layer { + bindings = < + &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS + &kp HOME &kp UP &kp PAGE_UP &kp KP_PLUS + &kp LEFT &none &kp RIGHT &kp KP_PLUS + &kp END &kp DOWN &kp PAGE_DOWN &kp RETURN + &kp INSERT &kp INSERT &kp DEL &kp RETURN + >; + }; + }; +}; +``` + +It is possible to use "toggle layer" to have keys that raise and lower the layers as well. + +## Conditional Layers + +The "conditional layers" feature enables a particular layer when all layers in a specified set are active. +For more information, see [conditional layers](../features/conditional-layers.md). diff --git a/docs/docs/keymaps/behaviors/macros.md b/docs/docs/behaviors/macros.md similarity index 90% rename from docs/docs/keymaps/behaviors/macros.md rename to docs/docs/behaviors/macros.md index 45780bfa..7ce968e9 100644 --- a/docs/docs/keymaps/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -18,6 +18,7 @@ A macro definition looks like: / { macros { zed_em_kay: zed_em_kay { + label = "ZM_zed_em_kay"; compatible = "zmk,behavior-macro"; #binding-cells = <0>; bindings @@ -45,12 +46,12 @@ The macro can then be bound in your keymap by referencing it by the label `&zed_ :::note For use cases involving sending a single keycode with modifiers, for instance ctrl+tab, the [key press behavior](key-press.md) -with [modifier functions](../modifiers.mdx#modifier-functions) can be used instead of a macro. +with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. ::: ### Bindings -Like [hold-taps](hold-tap.mdx), macros are created by composing other behaviors, and any of those behaviors can +Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can be added to the `bindings` list, e.g.: ```dts @@ -111,7 +112,7 @@ bindings ### Wait Time The wait time setting controls how long of a delay is introduced between behaviors in the `bindings` list. The initial wait time for a macro, -which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS`](../../config/behaviors.md#macro) by default, can +which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS`](../config/behaviors.md#macro) by default, can be set by assigning a value to the `wait-ms` property of the macro, e.g. `wait-ms = <20>;`. If you want to update the wait time at any point in the macro bindings list, use `¯o_wait_time`, e.g. `¯o_wait_time 30`. A full example: @@ -127,7 +128,7 @@ bindings ### Tap Time The tap time setting controls how long a tapped behavior is held in the `bindings` list. The initial tap time for a macro, -which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_TAP_MS`](../../config/behaviors.md#macro) by default, can +which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_TAP_MS`](../config/behaviors.md#macro) by default, can be set by assigning a value to the `tap-ms` property of the macro, e.g. `tap-ms = <20>;`. If you want to update the tap time at any point in a macro bindings list, use `¯o_tap_time`, e.g. `¯o_tap_time 30`. A full example: @@ -144,9 +145,9 @@ bindings Macros use an internal queue to invoke each behavior in the bindings list when triggered, which has a size of 64 by default. Bindings in "press" and "release" modes correspond to one event in the queue, whereas "tap" mode bindings correspond to two (one for press and one for release). As a result, the effective number of actions processed might be less than 64 and this can cause problems for long macros. -To prevent issues with longer macros, you can change the size of this queue via the `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` setting in your configuration, [typically through your `.conf` file](../../config/index.md). For example, `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE=512` would allow your macro to type about 256 characters. +To prevent issues with longer macros, you can change the size of this queue via the `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` setting in your configuration, [typically through your `.conf` file](../config/index.md). For example, `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE=512` would allow your macro to type about 256 characters. -Another limit worth noting is that the maximum number of bindings you can pass to a `bindings` field in the [Devicetree](../../config/index.md#devicetree-files) is 256, which also constrains how many behaviors can be invoked by a macro. +Another limit worth noting is that the maximum number of bindings you can pass to a `bindings` field in the [Devicetree](../config/index.md#devicetree-files) is 256, which also constrains how many behaviors can be invoked by a macro. ## Parameterized Macros @@ -218,12 +219,12 @@ Below are some examples of how the macro behavior can be used for various useful ### Layer Activation + More -Macros make it easy to combine a [layer behavior](layers.md), e.g. `&mo` with another behavior at the same time. +Macros make it easy to combine a [layer behavior](/docs/behaviors/layers), e.g. `&mo` with another behavior at the same time. Common examples are enabling one or more modifiers when the layer is active, or changing the RBG underglow color. To achieve this, a combination of a 0ms wait time and splitting the press and release between a `¯o_pause_for_release` is used: -#### Layer + modifier +#### Layer + Modifier ```dts /** @@ -238,6 +239,7 @@ To achieve this, a combination of a 0ms wait time and splitting the press and re * `&lm NUM_LAYER LSHIFT` */ lm: lm { + label = "LAYER_MOD"; compatible = "zmk,behavior-macro-two-param"; wait-ms = <0>; tap-ms = <0>; @@ -256,7 +258,7 @@ lm: lm { }; ``` -#### Layer + underglow color +#### Layer + Underglow Color To trigger a different underglow when the macro is pressed, and when it is released, we use the macro "press" activation mode whenever triggering the `&rgb_ug` behavior: @@ -312,11 +314,16 @@ To avoid repetition or possible typos when declaring a **zero parameter macro**, ) ``` +:::note +`ZMK_MACRO()` **only supports declaring non-parameterized (zero parameter) macros**; parameterized declarations are not currently supported. +::: + This can be used instead of a complete macro definition. During the firmware build process, the example above would produce the complete macro definition below: ```dts my_zero_param_macro: my_zero_param_macro { compatible = "zmk,behavior-macro"; + label = "ZM_my_macro"; #binding-cells = <0>; wait-ms = <30>; tap-ms = <40>; diff --git a/docs/docs/keymaps/behaviors/misc.md b/docs/docs/behaviors/misc.md similarity index 100% rename from docs/docs/keymaps/behaviors/misc.md rename to docs/docs/behaviors/misc.md diff --git a/docs/docs/behaviors/mod-morph.md b/docs/docs/behaviors/mod-morph.md new file mode 100644 index 00000000..6099b428 --- /dev/null +++ b/docs/docs/behaviors/mod-morph.md @@ -0,0 +1,90 @@ +--- +title: Mod-Morph Behavior +sidebar_label: Mod-Morph +--- + +## Summary + +The Mod-Morph behavior sends a different keypress, depending on whether a specified modifier is being held during the keypress. + +- If you tap the key by itself, the first keycode is sent. +- If you tap the key while holding the specified modifier, the second keycode is sent. + +## Mod-Morph + +The Mod-Morph behavior acts as one of two keycodes, depending on if the required modifier is being held during the keypress. + +### Configuration + +An example of how to implement the mod-morph "Grave Escape": + +```dts +/ { + behaviors { + gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; + mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; + }; + }; +}; +``` + +Note that this specific mod-morph exists in ZMK by default using code `&gresc`. + +### Behavior Binding + +- Reference: `&gresc` +- Parameter: None + +Example: + +```dts +&gresc +``` + +### Mods + +This is how you determine what modifiers will activate the morphed version of the keycode. + +Available Modifiers: + +- `MOD_LSFT` +- `MOD_RSFT` +- `MOD_LCTL` +- `MOD_RCTL` +- `MOD_LALT` +- `MOD_RALT` +- `MOD_LGUI` +- `MOD_RGUI` + +Example: + +```dts +mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; +``` + +### Advanced configuration + +`keep-mods` + +When a modifier specified in `mods` is being held, it won't be sent along with the morphed keycode unless it is also specified in `keep-mods`. By default `keep-mods` equals `0`, which means no modifier specified in `mods` will be sent along with the morphed keycode. + +For example, the following configuration morphs `LEFT_SHIFT` + `BACKSPACE` into `DELETE`, and morphs `RIGHT_SHIFT` + `BACKSPACE` into `RIGHT_SHIFT` + `DELETE`. + +```dts +/ { + behaviors { + bspc_del: backspace_delete { + compatible = "zmk,behavior-mod-morph"; + label = "BACKSPACE_DELETE"; + #binding-cells = <0>; + bindings = <&kp BACKSPACE>, <&kp DELETE>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = <(MOD_RSFT)>; + }; + }; +}; +``` diff --git a/docs/docs/behaviors/mod-tap.md b/docs/docs/behaviors/mod-tap.md new file mode 100644 index 00000000..d789a8b7 --- /dev/null +++ b/docs/docs/behaviors/mod-tap.md @@ -0,0 +1,54 @@ +--- +title: Mod-Tap Behavior +sidebar_label: Mod-Tap +--- + +## Summary + +The Mod-Tap behavior sends a different keypress, depending on whether it's held or tapped. + +- If you hold the key for longer than 200ms, the first keycode ("mod") is sent. +- If you tap the key (release before 200ms), the second keycode ("tap") is sent. + +If you press another key within the 200ms, the 'mod' behavior is also activated. + +## Mod-Tap + +The Mod-Tap behavior either acts as a held modifier, or as a tapped keycode. + +### Behavior Binding + +- Reference: `&mt` +- Parameter #1: The keycode to be sent when activating as a modifier, e.g. `LSHIFT` +- Parameter #2: The keycode to sent when used as a tap, e.g. `A`, `B`. + +Example: + +```dts +&mt LSHIFT A +``` + +### Configuration + +You can configure a different tapping term in your keymap: + +```dts +&mt { + tapping-term-ms = <400>; +}; + +/ { + keymap { + ... + }; +}; +``` + +:::info +Under the hood, the mod-tap is simply a [hold-tap](hold-tap.md) of the ["hold-preferred" flavor](hold-tap.md/#flavors) with a [`tapping-term-ms`](hold-tap.md/#tapping-term-ms) of 200 that takes in two [keypresses](key-press.md) as its "hold" and "tap" parameters. This means that the mod-tap can be used to invoke **any** [keycode](../codes/index.mdx), and is not limited to only activating [modifier keys](../codes/modifiers.mdx) when it is held. + +For users who want to momentarily access a specific [layer](../features/keymaps#layers) while a key is held and send a keycode when the same key is tapped, see [Layer-Tap](layers.md/#layer-tap). + +Similarly, for users looking to create a keybind like the mod-tap that invokes behaviors _other_ than [keypresses](key-press.md), like [sticky keys](sticky-key.md) or [key toggles](key-toggle.md), see [Hold-Tap](hold-tap.md). + +::: diff --git a/docs/docs/keymaps/behaviors/outputs.md b/docs/docs/behaviors/outputs.md similarity index 70% rename from docs/docs/keymaps/behaviors/outputs.md rename to docs/docs/behaviors/outputs.md index 77090a17..46b567cf 100644 --- a/docs/docs/keymaps/behaviors/outputs.md +++ b/docs/docs/behaviors/outputs.md @@ -12,7 +12,7 @@ keyboard to USB for power but outputting to a different device over bluetooth. By default, output is sent to USB when both USB and BLE are connected. Once you select a different output, it will be remembered until you change it again. -:::note[Powering the keyboard via USB] +:::note Powering the keyboard via USB ZMK is not always able to detect if the other end of a USB connection accepts keyboard input or not. So if you are using USB only to power your keyboard (for example with a charger or a portable power bank), you will want to select the BLE output through below behavior to be able to send keystrokes to the selected bluetooth profile. @@ -29,12 +29,11 @@ header, which is added at the top of the keymap file: This allows you to reference the actions defined in this header: -| Define | Action | -| ---------- | ----------------------------------------------- | -| `OUT_USB` | Prefer sending to USB | -| `OUT_BLE` | Prefer sending to the current bluetooth profile | -| `OUT_TOG` | Toggle between USB and BLE | -| `OUT_NONE` | Prevent from sending any output | +| Define | Action | +| --------- | ----------------------------------------------- | +| `OUT_USB` | Prefer sending to USB | +| `OUT_BLE` | Prefer sending to the current bluetooth profile | +| `OUT_TOG` | Toggle between USB and BLE | ## Output Selection Behavior @@ -45,9 +44,9 @@ The output selection behavior changes the preferred output on press. - Reference: `&out` - Parameter #1: Command, e.g. `OUT_BLE` -:::note[Output selection persistence] -The endpoint that is selected by the `&out` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. -However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +:::note External power state persistence +The endpoint that is selected by the `&out` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: ### Examples diff --git a/docs/docs/keymaps/behaviors/power.md b/docs/docs/behaviors/power.md similarity index 79% rename from docs/docs/keymaps/behaviors/power.md rename to docs/docs/behaviors/power.md index f118d0ca..5251d76c 100644 --- a/docs/docs/keymaps/behaviors/power.md +++ b/docs/docs/behaviors/power.md @@ -43,12 +43,12 @@ Here is a table describing the command for each define: - Reference: `&ext_power` - Parameter#1: Command, e.g `EP_ON` -:::note[External power state persistence] -The on/off state that is set by the `&ext_power` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. -However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +:::note External power state persistence +The on/off state that is set by the `&ext_power` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: -### Examples +### Example: 1. Behavior binding to enable the external power @@ -70,4 +70,4 @@ However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../ ## Split Keyboards -Power management behaviors are [global](../../features/split-keyboards.md#global-locality-behaviors): This means that when triggered, they affects both the central and peripheral side of split keyboards. +Power management behaviors are global: This means that when triggered, they affects both the central and peripheral side of split keyboards. diff --git a/docs/docs/keymaps/behaviors/reset.md b/docs/docs/behaviors/reset.md similarity index 50% rename from docs/docs/keymaps/behaviors/reset.md rename to docs/docs/behaviors/reset.md index 5ba6e65a..b7850eca 100644 --- a/docs/docs/keymaps/behaviors/reset.md +++ b/docs/docs/behaviors/reset.md @@ -44,6 +44,8 @@ Example: ## Split Keyboards -Both basic and bootloader reset behaviors are [source-specific](../../features/split-keyboards.md#source-locality-behaviors): This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&sys_reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. +Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&sys_reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. -Note that [combos](../combos.md) always invoke reset behavior bindings on the [central part](../../features/split-keyboards.md#central-and-peripheral-roles) of the split keyboard. +:::note Peripheral invocation +The peripheral side of the keyboard has to be paired and connected to the central side in order to be able to activate these behaviors, even if it is possible to trigger the behavior using only keys on that side. This is because the key bindings are processed on the central side which would then instruct the peripheral side to reset. +::: diff --git a/docs/docs/keymaps/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md similarity index 85% rename from docs/docs/keymaps/behaviors/sensor-rotate.md rename to docs/docs/behaviors/sensor-rotate.md index 5a18ec8d..3ff69dc6 100644 --- a/docs/docs/keymaps/behaviors/sensor-rotate.md +++ b/docs/docs/behaviors/sensor-rotate.md @@ -17,13 +17,14 @@ The standard sensor rotation behavior allows fully binding behaviors to be invok ### Configuration -Here is an example that binds the [RGB Underglow Behavior](underglow.md) to change the RGB brightness: +Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/underglow.md) to change the RGB brightness: ```dts / { behaviors { rgb_encoder: rgb_encoder { compatible = "zmk,behavior-sensor-rotate"; + label = "RGB_ENCODER"; #sensor-binding-cells = <0>; bindings = <&rgb_ug RGB_BRI>, <&rgb_ug RGB_BRD>; }; @@ -52,13 +53,14 @@ allowing the sensor rotation instance to be bound with two parameters at usage t Here is an example, showing how send key presses on rotation: -First, defining the sensor rotation itself, binding the [Key Press Behavior](key-press.md) twice, then binding it in the `sensor-bindings` property of a keymap layer: +First, defining the sensor rotation itself, binding the [Key Press Behavior](/docs/behaviors/key-press.md) twice, then binding it in the `sensor-bindings` property of a keymap layer: ```dts / { behaviors { - rot_kp: sensor_rotate_kp { + rot_kp: behavior_sensor_rotate_kp { compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KP"; #sensor-binding-cells = <2>; bindings = <&kp>, <&kp>; }; diff --git a/docs/docs/keymaps/behaviors/sticky-key.md b/docs/docs/behaviors/sticky-key.md similarity index 70% rename from docs/docs/keymaps/behaviors/sticky-key.md rename to docs/docs/behaviors/sticky-key.md index b71bf3e4..8b003f55 100644 --- a/docs/docs/keymaps/behaviors/sticky-key.md +++ b/docs/docs/behaviors/sticky-key.md @@ -34,15 +34,9 @@ By default, sticky keys stay pressed for a second if you don't press any other k Some typists may find that using a sticky shift key interspersed with rapid typing results in two or more capitalized letters instead of one. This happens as the sticky key is active until the next key is released, under which other keys may be pressed and will receive the modifier. You can enable the `quick-release` setting to instead deactivate the sticky key on the next key being pressed, as opposed to released. -#### `lazy` - -By default, sticky keys are activated on press until another key is pressed. You can enable the `lazy` setting to instead activate the sticky key right _before_ the other key is pressed. This is useful for mouse interaction or situations where you don't want the host to see anything during a sticky-key timeout, for example `&sk LGUI`, which can trigger a menu if pressed alone. - -Note that tapping a lazy sticky key will not trigger other behaviors such as the release of other sticky keys or layers. If you want to use a lazy sticky key to activate the release of a sticky layer, potential solutions include wrapping the sticky key in a simple macro which presses the sticky behavior around the sticky key press, doing the same with `&mo LAYER`, or triggering a tap of some key like `K_CANCEL` on sticky key press. - #### `ignore-modifiers` -This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. Please note that activating multiple modifiers via [modifier functions](../modifiers.mdx#modifier-functions) such as `&sk LS(LALT)`, require `ignore-modifiers` enabled in order to function properly. +This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. Please note that activating multiple modifiers via [modifier functions](https://zmk.dev/docs/codes/modifiers#modifier-functions) such as `&sk LS(LALT)`, require `ignore-modifiers` enabled in order to function properly. #### Example @@ -67,6 +61,7 @@ This configuration would apply to all sticky keys. This may not be appropriate i behaviors { skq: sticky_key_quick_release { compatible = "zmk,behavior-sticky-key"; + label = "STICKY_KEY_QUICK_RELEASE"; #binding-cells = <1>; bindings = <&kp>; release-after-ms = <1000>; @@ -81,7 +76,7 @@ This configuration would apply to all sticky keys. This may not be appropriate i }; ``` -### Advanced Usage +### Advanced usage Sticky keys can be combined; if you tap `&sk LCTRL` and then `&sk LSHIFT` and then `&kp A`, the output will be ctrl+shift+a. diff --git a/docs/docs/keymaps/behaviors/sticky-layer.md b/docs/docs/behaviors/sticky-layer.md similarity index 98% rename from docs/docs/keymaps/behaviors/sticky-layer.md rename to docs/docs/behaviors/sticky-layer.md index 6a231f08..41c2ccf5 100644 --- a/docs/docs/keymaps/behaviors/sticky-layer.md +++ b/docs/docs/behaviors/sticky-layer.md @@ -36,7 +36,7 @@ You can configure a different `release-after-ms` in your keymap: }; ``` -### Advanced Usage +### Advanced usage Sticky layers behave slightly different from sticky keys. They are configured to `quick-release`. This means that the layer is released immediately when another key is pressed. "Normal" sticky keys are not `quick-release`; they are released when the next key is released. This makes it possible to combine sticky layers and sticky keys as such: tap `&sl 1`, tap `&sk LSHIFT` on layer 1, tap `&kp A` on base layer to output shift+A. diff --git a/docs/docs/keymaps/behaviors/tap-dance.mdx b/docs/docs/behaviors/tap-dance.md similarity index 85% rename from docs/docs/keymaps/behaviors/tap-dance.mdx rename to docs/docs/behaviors/tap-dance.md index 0cbcaaff..ac85b3da 100644 --- a/docs/docs/keymaps/behaviors/tap-dance.mdx +++ b/docs/docs/behaviors/tap-dance.md @@ -3,8 +3,8 @@ title: Tap-Dance Behavior sidebar_label: Tap-Dance --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; ## Summary @@ -20,14 +20,13 @@ Defines the maximum elapsed time after the last tap-dance keybind press before a #### `bindings` -An array of one or more keybinds. This list can include [any ZMK keycode](../list-of-keycodes.mdx) and any listed ZMK behavior, like [hold-taps](hold-tap.mdx), or [sticky keys](sticky-key.md). The index of a keybind in the `bindings` array corresponds to the number of times the tap-dance binding is pressed. For example, in the basic tap-dance counter shown below, `&kp N2` is the second binding in the array of `bindings`: we then see an output of `2` when the `td0` binding is pressed twice. +An array of one or more keybinds. This list can include [any ZMK keycode](../codes/) and any listed ZMK behavior, like [hold-taps](hold-tap.md), or [sticky keys](sticky-key.md). The index of a keybind in the `bindings` array corresponds to the number of times the tap-dance binding is pressed. For example, in the [basic tap-dance counter](#basic-example-counter) shown below, `&kp N2` is the second binding in the array of `bindings`: we then see an output of `2` when the `td0` binding is pressed twice. The number of bindings in this array also determines the tap-dance's maximum number of keypresses. When a tap-dance reaches its maximum number of keypresses, it will immediately invoke the last behavior in its list of `bindings`, rather than waiting for [`tapping-term-ms`](#tapping-term-ms) to expire before the output is displayed. ### Example Usage ; tapping-term-ms = <200>; bindings = <&kp N1>, <&kp N2>, <&kp N3>; @@ -66,7 +66,7 @@ This example configures a tap-dance named `td0` that outputs the number of times The following image describes the behavior of this particular tap-dance. -![Timing Diagram](../../assets/tap-dance/timing_diagram.svg) +![Timing Diagram](../assets/tap-dance/timing_diagram.svg) :::note Alphanumeric [`key press`](key-press.md) bindings, like those used for `td0`, will release as soon as an interrupting key press occurs. For instance, if a modifier key like `LSHIFT` were to replace the `N1` binding in the last example above, it would remain pressed until `td0`'s binding is released and the output would instead be `J`. Any following alphanumeric key presses would be capitalized as long as `td0` is held down. @@ -86,6 +86,7 @@ This example configures a mod-tap inside a tap-dance named `td_mt` that outputs behaviors { td_mt: tap_dance_mod_tap { compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_MOD_TAP"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&mt LSHIFT CAPSLOCK>, <&kp LCTRL>; diff --git a/docs/docs/keymaps/behaviors/underglow.md b/docs/docs/behaviors/underglow.md similarity index 83% rename from docs/docs/keymaps/behaviors/underglow.md rename to docs/docs/behaviors/underglow.md index 245c6858..f94d9008 100644 --- a/docs/docs/keymaps/behaviors/underglow.md +++ b/docs/docs/behaviors/underglow.md @@ -5,7 +5,7 @@ sidebar_label: RGB Underglow ## Summary -This page contains [RGB Underglow](../../features/lighting.md#rgb-underglow) behaviors supported by ZMK. +This page contains [RGB Underglow](../features/underglow.md) behaviors supported by ZMK. ## RGB Action Defines @@ -43,7 +43,7 @@ Here is a table describing the action for each define: - Parameter #1: The RGB action define, e.g. `RGB_TOG` or `RGB_BRI` - Parameter #2: Only applies to `RGB_COLOR_HSB` and is the HSB representation of the color to set (see below for an example) -:::note[HSB Values] +:::note HSB Values When specifying HSB values you'll need to use `RGB_COLOR_HSB(h, s, b)` in your keymap file. @@ -55,10 +55,10 @@ Value Limits: ::: -:::note[RGB settings persistence] -The RGB settings that are changed via the `&rgb_ug` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. -They will also override the start values set by [`CONFIG_ZMK_RGB_*_START` settings](../../config/lighting.md#kconfig). -However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +:::note RGB settings persistence +The RGB settings that are changed via the `&rgb_ug` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +They will also override the start values set by [`CONFIG_ZMK_RGB_*_START` settings](../config/underglow.md#kconfig). +However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: ## Examples @@ -77,4 +77,4 @@ However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNC ## Split Keyboards -RGB underglow behaviors are [global](../../features/split-keyboards.md#global-locality-behaviors): This means that when triggered, they affect both the central and peripheral side of split keyboards. +RGB underglow behaviors are global: This means that when triggered, they affect both the central and peripheral side of split keyboards. diff --git a/docs/docs/codes/_applications.mdx b/docs/docs/codes/_applications.mdx new file mode 100644 index 00000000..099b701b --- /dev/null +++ b/docs/docs/codes/_applications.mdx @@ -0,0 +1,9 @@ +import Table from "@site/src/components/codes/Table"; + +## Application Controls + + + +## Applications (Launch) + +
diff --git a/docs/docs/codes/_editing.mdx b/docs/docs/codes/_editing.mdx new file mode 100644 index 00000000..2dd4d631 --- /dev/null +++ b/docs/docs/codes/_editing.mdx @@ -0,0 +1,9 @@ +import Table from "@site/src/components/codes/Table"; + +## Cut, Copy, Paste + +
+ +## Undo, Redo + +
diff --git a/docs/docs/keymaps/_footnotes/example.mdx b/docs/docs/codes/_footnotes/example.mdx similarity index 100% rename from docs/docs/keymaps/_footnotes/example.mdx rename to docs/docs/codes/_footnotes/example.mdx diff --git a/docs/docs/keymaps/_footnotes/globe.mdx b/docs/docs/codes/_footnotes/globe.mdx similarity index 100% rename from docs/docs/keymaps/_footnotes/globe.mdx rename to docs/docs/codes/_footnotes/globe.mdx diff --git a/docs/docs/keymaps/_footnotes/ios-application.mdx b/docs/docs/codes/_footnotes/ios-application.mdx similarity index 100% rename from docs/docs/keymaps/_footnotes/ios-application.mdx rename to docs/docs/codes/_footnotes/ios-application.mdx diff --git a/docs/docs/keymaps/_footnotes/ios-power.mdx b/docs/docs/codes/_footnotes/ios-power.mdx similarity index 100% rename from docs/docs/keymaps/_footnotes/ios-power.mdx rename to docs/docs/codes/_footnotes/ios-power.mdx diff --git a/docs/docs/keymaps/_footnotes/macos-power.mdx b/docs/docs/codes/_footnotes/macos-power.mdx similarity index 100% rename from docs/docs/keymaps/_footnotes/macos-power.mdx rename to docs/docs/codes/_footnotes/macos-power.mdx diff --git a/docs/docs/codes/_input-assist.mdx b/docs/docs/codes/_input-assist.mdx new file mode 100644 index 00000000..7dc432b4 --- /dev/null +++ b/docs/docs/codes/_input-assist.mdx @@ -0,0 +1,5 @@ +import Table from "@site/src/components/codes/Table"; + +## Input Assist + +
diff --git a/docs/docs/codes/_keyboard-keypad.mdx b/docs/docs/codes/_keyboard-keypad.mdx new file mode 100644 index 00000000..063a8540 --- /dev/null +++ b/docs/docs/codes/_keyboard-keypad.mdx @@ -0,0 +1,61 @@ +import Table from "@site/src/components/codes/Table"; + +## Keyboard + +### Letters + +
+ +### Numbers + +
+ +### Symbols / Punctuation + +
+ +### Control & Whitespace + +
+ +### Navigation + +
+ +### Modifiers + +The [Modifiers](modifiers.mdx) page includes further information. + +
+ +### Locks + +
+ +### F Keys + +
+ +### International + +
+ +### Language + +
+ +### Miscellaneous + +
+ +## Keypad + +
+ +### Numbers + +
+ +### Symbols / Operations + +
diff --git a/docs/docs/codes/_media.mdx b/docs/docs/codes/_media.mdx new file mode 100644 index 00000000..7be80ab9 --- /dev/null +++ b/docs/docs/codes/_media.mdx @@ -0,0 +1,21 @@ +import Table from "@site/src/components/codes/Table"; + +## Sound / Volume + +
+ +## Display + +
+ +## Media Controls + +
+ +## Consumer Menus + +
+ +## Consumer Controls + +
diff --git a/docs/docs/codes/_power.mdx b/docs/docs/codes/_power.mdx new file mode 100644 index 00000000..dd06e953 --- /dev/null +++ b/docs/docs/codes/_power.mdx @@ -0,0 +1,5 @@ +import Table from "@site/src/components/codes/Table"; + +## Power & Lock + +
diff --git a/docs/docs/codes/applications.mdx b/docs/docs/codes/applications.mdx new file mode 100644 index 00000000..68e24d36 --- /dev/null +++ b/docs/docs/codes/applications.mdx @@ -0,0 +1,15 @@ +--- +title: Applications +sidebar_label: Applications +hide_title: true +--- + +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Content, { toc as contentToc } from "./_applications.mdx"; + +export const toc = contentToc; + + + + diff --git a/docs/docs/codes/editing.mdx b/docs/docs/codes/editing.mdx new file mode 100644 index 00000000..3475d6c2 --- /dev/null +++ b/docs/docs/codes/editing.mdx @@ -0,0 +1,15 @@ +--- +title: Editing +sidebar_label: Editing +hide_title: true +--- + +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Content, { toc as contentToc } from "./_editing.mdx"; + +export const toc = contentToc; + + + + diff --git a/docs/docs/codes/index.mdx b/docs/docs/codes/index.mdx new file mode 100644 index 00000000..a701b4ce --- /dev/null +++ b/docs/docs/codes/index.mdx @@ -0,0 +1,35 @@ +--- +title: Codes +sidebar_label: Full List +hide_title: true +slug: ./ +--- + +import SpellingCaution from "@site/src/components/codes/SpellingCaution"; +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Key, { toc as keyToc } from "./_keyboard-keypad.mdx"; +import Editing, { toc as editingToc } from "./_editing.mdx"; +import Media, { toc as mediaToc } from "./_media.mdx"; +import Applications, { toc as applicationsToc } from "./_applications.mdx"; +import InputAssist, { toc as inputAssistToc } from "./_input-assist.mdx"; +import Power, { toc as powerToc } from "./_power.mdx"; + +export const toc = [ + ...keyToc, + ...editingToc, + ...mediaToc, + ...applicationsToc, + ...inputAssistToc, + ...powerToc, +]; + + + + + + + + + + diff --git a/docs/docs/codes/input-assist.mdx b/docs/docs/codes/input-assist.mdx new file mode 100644 index 00000000..e8406f5c --- /dev/null +++ b/docs/docs/codes/input-assist.mdx @@ -0,0 +1,15 @@ +--- +title: Input Assist +sidebar_label: Input Assist +hide_title: true +--- + +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Content, { toc as contentToc } from "./_input-assist.mdx"; + +export const toc = contentToc; + + + + diff --git a/docs/docs/codes/keyboard-keypad.mdx b/docs/docs/codes/keyboard-keypad.mdx new file mode 100644 index 00000000..7b040bfd --- /dev/null +++ b/docs/docs/codes/keyboard-keypad.mdx @@ -0,0 +1,15 @@ +--- +title: Keyboard & Keypad +sidebar_label: Keyboard & Keypad +hide_title: true +--- + +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Content, { toc as contentToc } from "./_keyboard-keypad.mdx"; + +export const toc = contentToc; + + + + diff --git a/docs/docs/codes/keymap-upgrader.mdx b/docs/docs/codes/keymap-upgrader.mdx new file mode 100644 index 00000000..bcee82b5 --- /dev/null +++ b/docs/docs/codes/keymap-upgrader.mdx @@ -0,0 +1,21 @@ +--- +title: Keymap Upgrader +sidebar_label: Keymap Upgrader +hide_title: true +hide_table_of_contents: true +--- + +# Keymap Upgrader + +Many codes have been renamed to be more consistent with each other. +Paste the contents of a `.keymap` file below to upgrade all deprecated codes to their replacements. + +Hover your mouse over the upgraded keymap and click the `Copy` button to copy it to your clipboard. + +You will likely need to realign columns in the upgraded keymap. The upgrader also does not handle +codes inside a `#define`, so you will need to update those manually using +[this list of deprecated codes and replacements](https://github.com/zmkfirmware/zmk/blob/main/docs/src/data/keymap-upgrade.js). + +import KeymapUpgrader from "@site/src/components/KeymapUpgrader/index"; + + diff --git a/docs/docs/codes/media.mdx b/docs/docs/codes/media.mdx new file mode 100644 index 00000000..c7884479 --- /dev/null +++ b/docs/docs/codes/media.mdx @@ -0,0 +1,15 @@ +--- +title: Media +sidebar_label: Media +hide_title: true +--- + +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Content, { toc as contentToc } from "./_media.mdx"; + +export const toc = contentToc; + + + + diff --git a/docs/docs/keymaps/modifiers.mdx b/docs/docs/codes/modifiers.mdx similarity index 63% rename from docs/docs/keymaps/modifiers.mdx rename to docs/docs/codes/modifiers.mdx index a434c4e2..db88ee92 100644 --- a/docs/docs/keymaps/modifiers.mdx +++ b/docs/docs/codes/modifiers.mdx @@ -1,14 +1,30 @@ --- title: Modifiers sidebar_label: Modifiers +hide_title: true --- -Modifiers are the special keyboard keys: _shift_, _alt_, _control_ & _GUI_. Their keycodes can be found in the [list of keycodes](./list-of-keycodes.mdx#modifiers). -Modifiers can be used both as [keys](#modifier-keys) and as [functions](#modifier-functions). +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Table from "@site/src/components/codes/Table"; + + + + +## Modifiers + +Modifiers are the special keyboard keys: _shift_, _alt_, _control_ & _GUI_. + +Modifiers can be used in two forms within ZMK: + +- Modifier [Keys](#modifier-keys) → `LEFT_SHIFT` +- Modifier [Functions](#modifier-functions) → `LS(code)` + +
### Modifier Keys -These act like any other keycode. +These act like any other key code. - e.g. `&kp LEFT_GUI` pushes and releases the left GUI key. @@ -24,9 +40,9 @@ These functions take the form: `XX(code)` - `&kp LC(RA(B))` = `LEFT_CONTROL`+`RIGHT_ALT`+`B` - They can be applied to a modifier keycode to create combined modifier keys: - `&kp LS(LALT)` = `LEFT_SHIFT` + `LEFT_ALT` -- Some basic keycodes already include a modifier function in their definition: +- Some basic codes already include a modifier function in their definition: - `DOLLAR` = `LS(NUMBER_4)` -- There are left- and right-handed versions of each modifier (also see [table in the list of keycodes](./list-of-keycodes.mdx#modifiers)): +- There are left- and right-handed versions of each modifier (also see table above): - `LS(x)`, `LC(x)`, `LA(x)`, `LG(x)`, `RS(x)`, `RC(x)`, `RA(x)`, `RG(x)` - Modified keys can safely be rolled-over. Modifier functions are released when another key is pressed. - Press `&kp LS(A)`, then press `&kp B`, release `&kp LS(A)` and release `&kp B` results in **Ab**. Only the A is capitalized. diff --git a/docs/docs/codes/power.mdx b/docs/docs/codes/power.mdx new file mode 100644 index 00000000..2af3233f --- /dev/null +++ b/docs/docs/codes/power.mdx @@ -0,0 +1,15 @@ +--- +title: Power +sidebar_label: Power +hide_title: true +--- + +import OsLegend from "@site/src/components/codes/OsLegend"; +import ToastyContainer from "@site/src/components/codes/ToastyContainer"; +import Content, { toc as contentToc } from "./_power.mdx"; + +export const toc = contentToc; + + + + diff --git a/docs/docs/config/backlight.md b/docs/docs/config/backlight.md new file mode 100644 index 00000000..8084be89 --- /dev/null +++ b/docs/docs/config/backlight.md @@ -0,0 +1,40 @@ +--- +title: Backlight Configuration +sidebar_label: Backlight +--- + +See the [backlight feature page](../features/backlight.md) for more details, including instructions for adding backlight support to a board. + +See [Configuration Overview](index.md) for instructions on how to change these settings. + +## Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Option | Type | Description | Default | +| ------------------------------------ | ---- | ----------------------------------------------------- | ------- | +| `CONFIG_ZMK_BACKLIGHT` | bool | Enables LED backlight | n | +| `CONFIG_ZMK_BACKLIGHT_BRT_STEP` | int | Brightness step in percent | 20 | +| `CONFIG_ZMK_BACKLIGHT_BRT_START` | int | Default brightness in percent | 40 | +| `CONFIG_ZMK_BACKLIGHT_ON_START` | bool | Default backlight state | y | +| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE` | bool | Turn off backlight when keyboard goes into idle state | n | +| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB` | bool | Turn off backlight when USB is disconnected | n | + +:::note +The `*_START` settings only determine the initial backlight state. Any changes you make with the [backlight behavior](../behaviors/backlight.md) are saved to flash after a one minute delay and will be used after that. +::: + +## Devicetree + +Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/build/dts/intro.html#aliases-and-chosen-nodes) + +| Property | Type | Description | +| --------------- | ---- | -------------------------------------------- | +| `zmk,backlight` | path | The node for the backlight LED driver to use | + +See the Zephyr devicetree bindings for LED drivers: + +- [gpio-leds](https://docs.zephyrproject.org/3.0.0/reference/devicetree/bindings/gpio/gpio-leds.html) +- [pwm-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/led/pwm-leds.html) + +See the [backlight feature page](../features/backlight.md) for examples of the properties that must be set to enable backlighting. diff --git a/docs/docs/config/battery.md b/docs/docs/config/battery.md index 0c3ba752..c56a30ef 100644 --- a/docs/docs/config/battery.md +++ b/docs/docs/config/battery.md @@ -16,32 +16,15 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ | `CONFIG_ZMK_BATTERY_REPORTING` | bool | Enables/disables all battery level detection/reporting | n | | `CONFIG_ZMK_BATTERY_REPORT_INTERVAL` | int | Battery level report interval in seconds | 60 | -:::note[Default setting] +:::note Default setting -While `CONFIG_ZMK_BATTERY_REPORTING` is disabled by default it is implied by `CONFIG_ZMK_BLE`, thus any board with BLE enabled will have this automatically enabled unless explicitly overridden. - -::: - -:::note[BLE reporting on MacOS] - -On macOS the BLE battery reporting packets can cause the computer to wakeup from sleep. To prevent this, the battery _reporting_ service can be disabled by setting `CONFIG_BT_BAS=n`. This setting is independent of battery _monitoring_, for instance the battery level can still be indicated on a display. - -::: - -### Peripheral Battery Monitoring - -You can [configure ZMK to allow support for peripheral battery monitoring over BLE](split.md) (e.g. when having a split keyboard with two independent and wirelessly connected sides). -If you want to report the battery levels of both sides of a split keyboard, you should have both `CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_PROXY` and `CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING` set to `y`. - -:::note[Displaying both battery levels on your host] - -Host support for multiple battery levels is undefined. It appears that in most of the cases only the main battery is being reported. In order to correctly display all the battery values, you probably need a special application or script. +While `CONFIG_ZMK_BATTERY_REPORTING` is disabled by default it is implied by `CONFIG_ZMK_BLE`, thus any board with BLE enabled will have this automatically enabled unless explicitly overriden. ::: ### Devicetree -Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/intro.html#aliases-and-chosen-nodes) | Property | Type | Description | | ------------- | ---- | --------------------------------------------- | @@ -55,11 +38,11 @@ Driver for reading the voltage of a battery using an ADC connected to a voltage Applies to: `compatible = "zmk,battery-voltage-divider"` -See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/iio/afe/voltage-divider.html). +See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/latest/build/dts/api/bindings/adc/voltage-divider.html). ## nRF VDDH Battery Sensor -Driver for reading the voltage of a battery using a Nordic nRF52's VDDH pin. +Driver for reading the voltage of a battery using a Nordic nRF52's VDDH pin. This driver has no configuration except for the required `label` property. ### Devicetree @@ -67,4 +50,6 @@ Applies to: `compatible = "zmk,battery-nrf-vddh"` Definition file: [zmk/app/module/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/sensor/zmk%2Cbattery-nrf-vddh.yaml) -This driver has no configuration. +| Property | Type | Description | +| -------- | ------ | ------------------------- | +| `label` | string | Unique label for the node | diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index ce53ee99..f3f1f563 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -17,19 +17,11 @@ See the [zmk/app/dts/behaviors/](https://github.com/zmkfirmware/zmk/tree/main/ap | --------------------------------- | ---- | ------------------------------------------------------------------------------------ | ------- | | `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` | int | Maximum number of behaviors to allow queueing from a macro or other complex behavior | 64 | -### Devicetree - -Definition file: [zmk/app/dts/bindings/behaviors/behavior-metadata.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/behavior-metadata.yaml) - -| Property | Type | Description | Default | -| -------------- | ------ | -------------------------------------------------------------------------------- | ------- | -| `display-name` | string | Name of the layer, for use with a display or [ZMK Studio](../features/studio.md) | | - ## Caps Word Creates a custom behavior that behaves similar to a caps lock but deactivates when any key not in a continue list is pressed. -See the [caps word behavior](../keymaps/behaviors/caps-word.md) documentation for more details and examples. +See the [caps word behavior](../behaviors/caps-word.md) documentation for more details and examples. ### Devicetree @@ -37,11 +29,12 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml](ht Applies to: `compatible = "zmk,behavior-caps-word"` -| Property | Type | Description | Default | -| ---------------- | ----- | ------------------------------------------------------------------------------------ | ------------------------------- | -| `#binding-cells` | int | Must be `<0>` | | -| `continue-list` | array | List of [keycodes](/docs/keymaps/list-of-keycodes) which do not deactivate caps lock | `` | -| `mods` | int | A bit field of modifiers to apply | `` | +| Property | Type | Description | Default | +| ---------------- | ------ | ------------------------------------------------------------------ | ------------------------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `continue-list` | array | List of [key codes](/docs/codes) which do not deactivate caps lock | `` | +| `mods` | int | A bit field of modifiers to apply | `` | `continue-list` is treated as if it always includes alphanumeric characters (A-Z, 0-9). @@ -49,22 +42,15 @@ See [dt-bindings/zmk/modifiers.h](https://github.com/zmkfirmware/zmk/blob/main/a You can use the following nodes to tweak the default behaviors: -| Node | Behavior | -| ------------ | ---------------------------------------------- | -| `&caps_word` | [Caps Word](../keymaps/behaviors/caps-word.md) | +| Node | Behavior | +| ------------ | -------------------------------------- | +| `&caps_word` | [Caps Word](../behaviors/caps-word.md) | ## Hold-Tap Creates a custom behavior that triggers one behavior when a key is held or a different one when the key is tapped. -See the [hold-tap behavior](../keymaps/behaviors/hold-tap.mdx) documentation for more details and examples. - -### Kconfig - -| Config | Type | Description | Default | -| -------------------------------------------------- | ---- | -------------------------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_BEHAVIOR_HOLD_TAP_MAX_HELD` | int | Maximum number of simultaneous held hold-taps | 10 | -| `CONFIG_ZMK_BEHAVIOR_HOLD_TAP_MAX_CAPTURED_EVENTS` | int | Maximum number of system events to capture while deferring a hold or tap decision resolution | 40 | +See the [hold-tap behavior documentation](../behaviors/hold-tap.md) for more details and examples. ### Devicetree @@ -72,21 +58,17 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml](htt Applies to: `compatible = "zmk,behavior-hold-tap"` -| Property | Type | Description | Default | -| ----------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- | ------------------ | -| `#binding-cells` | int | Must be `<2>` | | -| `bindings` | phandles | A list of two behaviors (without parameters): one for hold and one for tap | | -| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | -| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | -| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | -| `require-prior-idle-ms` | int | Triggers a tap immediately if any non-modifier key was pressed within `require-prior-idle-ms` of the hold-tap | -1 (disabled) | -| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | -| `hold-while-undecided` | bool | Triggers the hold behavior immediately on press and releases before a tap | false | -| `hold-while-undecided-linger` | bool | Continues to hold the hold behavior until after the tap is released | false | -| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap | | -| `hold-trigger-on-release` | bool | If set, delays the evaluation of `hold-trigger-key-positions` until key release | false | - -This behavior forwards the first parameter it receives to the parameter of the first behavior specified in `bindings`, and second parameter to the parameter of the second behavior. +| Property | Type | Description | Default | +| ---------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------- | ------------------ | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<2>` | | +| `bindings` | phandle array | A list of two behaviors (without parameters): one for hold and one for tap | | +| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | +| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | +| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | +| `require-prior-idle-ms` | int | Triggers a tap immediately if any non-modifier key was pressed within `require-prior-idle-ms` of the hold-tap. | -1 (disabled) | +| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | +| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap. | | The `flavor` property may be one of: @@ -95,22 +77,22 @@ The `flavor` property may be one of: - `"tap-preferred"` - `"tap-unless-interrupted"` -See the [hold-tap behavior documentation](../keymaps/behaviors/hold-tap.mdx) for an explanation of each flavor. +See the [hold-tap behavior documentation](../behaviors/hold-tap.md) for an explanation of each flavor. `hold-trigger-key-positions` is an array of zero-based key position indices. You can use the following nodes to tweak the default behaviors: -| Node | Behavior | -| ----- | ----------------------------------------------------- | -| `<` | [Layer-tap](../keymaps/behaviors/layers.md#layer-tap) | -| `&mt` | [Mod-tap](../keymaps/behaviors/hold-tap.mdx#mod-tap) | +| Node | Behavior | +| ----- | --------------------------------------------- | +| `<` | [Layer-tap](../behaviors/layers.md#layer-tap) | +| `&mt` | [Mod-tap](../behaviors/mod-tap.md) | ## Key Repeat Creates a custom behavior that repeats the whatever key code was last sent. -See the [key repeat behavior](../keymaps/behaviors/key-repeat.md) documentation for more details and examples. +See the [key repeat behavior](../behaviors/key-repeat.md) documentation for more details and examples. ### Devicetree @@ -118,117 +100,25 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-key-repeat.yaml](h Applies to: `compatible = "zmk,behavior-key-repeat"` -| Property | Type | Description | Default | -| ---------------- | ----- | -------------------------------- | ----------------- | -| `#binding-cells` | int | Must be `<0>` | | -| `usage-pages` | array | List of HID usage pages to track | `` | +| Property | Type | Description | Default | +| ---------------- | ------ | -------------------------------- | ----------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `usage-pages` | array | List of HID usage pages to track | `` | For the `usage-pages` property, use the `HID_USAGE_*` defines from [dt-bindings/zmk/hid_usage_pages.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/hid_usage_pages.h). You can use the following nodes to tweak the default behaviors: -| Node | Behavior | -| ------------- | ------------------------------------------------ | -| `&key_repeat` | [Key repeat](../keymaps/behaviors/key-repeat.md) | - -## Key Toggle - -Creates a custom behavior that toggles a key code on, off, or switches between the two states. - -See the [key toggle behavior](../keymaps/behaviors/key-toggle.md) documentation for more details and examples. - -### Devicetree - -Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-key-toggle.yaml) - -Applies to: `compatible = "zmk,behavior-key-toggle"` - -| Property | Type | Description | Default | -| ---------------- | ---- | ------------------------------ | ------- | -| `#binding-cells` | int | Must be `<1>` | | -| `toggle-mode` | | One of `on`, `off`, and `flip` | `flip` | - -You can use the following node to tweak the default behavior: - -| Node | Behavior | -| ----- | ------------------------------------------------ | -| `&kt` | [Key toggle](../keymaps/behaviors/key-toggle.md) | - -## Momentary Layer - -Creates a custom behavior that toggles a layer on when pressed, and off when released. - -See the [momentary layer behavior](../keymaps/behaviors/layers.md#momentary-layer) documentation for more details and examples. - -### Devicetree - -Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-momentary-layer.yaml) - -Applies to: `compatible = "zmk,behavior-momentary-layer"` - -| Property | Type | Description | Default | -| ---------------- | ---- | --------------------------------------------------------------- | ------- | -| `#binding-cells` | int | Must be `<1>` | | -| `locking` | bool | Whether the behavior can lock and unlock layers in the on state | false | - -You can use the following node to tweak the default behavior: - -| Node | Behavior | -| ----- | ----------------------------------------------------------------- | -| `&mo` | [Momentary Layer](../keymaps/behaviors/layers.md#momentary-layer) | - -## Layer Toggle - -Creates a custom behavior that toggles a layer on, off, or switches between the two states. - -See the [layer toggle behavior](../keymaps/behaviors/layers.md#toggle-layer) documentation for more details and examples. - -### Devicetree - -Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-layer-toggle.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-layer-toggle.yaml) - -Applies to: `compatible = "zmk,behavior-layer-toggle"` - -| Property | Type | Description | Default | -| ---------------- | ---- | --------------------------------------------------------------- | ------- | -| `#binding-cells` | int | Must be `<1>` | | -| `toggle-mode` | | One of `on`, `off`, and `flip` | `flip` | -| `locking` | bool | Whether the behavior can lock and unlock layers in the on state | false | - -You can use the following node to tweak the default behavior: - -| Node | Behavior | -| ------ | ----------------------------------------------------------- | -| `&tog` | [Layer toggle](../keymaps/behaviors/layers.md#toggle-layer) | - -## To Layer - -Creates a custom behavior that toggles a layer on and toggles all other layers off, barring the default layer. - -See the [to layer behavior](../keymaps/behaviors/layers.md#to-layer) documentation for more details and examples. - -### Devicetree - -Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-to-layer.yaml) - -Applies to: `compatible = "zmk,behavior-to-layer"` - -| Property | Type | Description | Default | -| ---------------- | ---- | --------------------------------------------------------------- | ------- | -| `#binding-cells` | int | Must be `<1>` | | -| `locking` | bool | Whether the behavior can lock and unlock layers in the on state | false | - -You can use the following node to tweak the default behavior: - -| Node | Behavior | -| ----- | --------------------------------------------------- | -| `&to` | [To Layer](../keymaps/behaviors/layers.md#to-layer) | +| Node | Behavior | +| ------------- | ---------------------------------------- | +| `&key_repeat` | [Key repeat](../behaviors/key-repeat.md) | ## Macro Creates a custom behavior which triggers a sequence of other behaviors. -See the [macro behavior](../keymaps/behaviors/macros.md) documentation for more details and examples. +See the [macro behavior](../behaviors/macros.md) documentation for more details and examples. ### Kconfig @@ -239,21 +129,16 @@ See the [macro behavior](../keymaps/behaviors/macros.md) documentation for more ### Devicetree -Definition files: +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) -- [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) -- [zmk/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro-one-param.yaml) -- [zmk/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro-two-param.yaml) - -| Property | Type | Description | Default | -| ---------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | -| `compatible` | string | Macro type, **must be _one_ of**:
  • `"zmk,behavior-macro"`
  • `"zmk,behavior-macro-one-param"`
  • `"zmk,behavior-macro-two-param"`
| | -| `#binding-cells` | int | Must be
  • `<0>` if `compatible = "zmk,behavior-macro"`
  • `<1>` if `compatible = "zmk,behavior-macro-one-param"`
  • `<2>` if `compatible = "zmk,behavior-macro-two-param"`
| | -| `bindings` | phandle array | List of behaviors to trigger | | -| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | -| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | - -With `compatible = "zmk,behavior-macro-one-param"` or `compatible = "zmk,behavior-macro-two-param"`, this behavior forwards the parameters it receives according to the `¯o_param_*` control behaviors noted below. +| Property | Type | Description | Default | +| ---------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `label` | string | Unique label for the node | | +| `compatible` | string | Macro type, **must be _one_ of**:
• `"zmk,behavior-macro"`
• `"zmk,behavior-macro-one-param"`
• `"zmk,behavior-macro-two-param"` | | +| `#binding-cells` | int | Number of params accepted (depends on `compatible` property), **must be _one_ of**:
• `<0>`
• `<1>`
• `<2>` | | +| `bindings` | phandle array | List of behaviors to trigger | | +| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | +| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | ### Macro Control Behaviors @@ -276,8 +161,6 @@ The following macro-specific behaviors can be added at any point in the `binding Creates a custom behavior that triggers one of two behaviors depending on whether certain modifiers are held. -See the [mod-morph behavior](../keymaps/behaviors/mod-morph.md) documentation for more details and examples. - ### Devicetree Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-mod-morph.yaml) @@ -286,6 +169,7 @@ Applies to: `compatible = "zmk,behavior-mod-morph"` | Property | Type | Description | | ---------------- | ------------- | --------------------------------------------------------------------------------- | +| `label` | string | Unique label for the node | | `#binding-cells` | int | Must be `<0>` | | `bindings` | phandle array | A list of two behaviors: one for normal press and one for mod morphed press | | `mods` | int | A bit field of modifiers. The morph behavior is used if any of these are pressed. | @@ -294,53 +178,15 @@ See [dt-bindings/zmk/modifiers.h](https://github.com/zmkfirmware/zmk/blob/main/a You can use the following nodes to tweak the default behaviors: -| Node | Behavior | -| -------- | ------------------------------------------------- | -| `&gresc` | [Grave escape](../keymaps/behaviors/mod-morph.md) | - -## Sensor Rotation - -Creates a custom behavior which sends a tap of other behaviors when a sensor is rotated. -Has two variants: with `compatible = "zmk,behavior-sensor-rotate"` it accepts no parameters when used, whereas with `compatible = "zmk,behavior-sensor-rotate-var"` it accepts two parameters. - -See the [sensor rotation behavior](../keymaps/behaviors/sensor-rotate.md) documentation for more details and examples. - -### Devicetree - -Definition files: - -- [zmk/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-sensor-rotate.yaml) -- [zmk/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-sensor-rotate-var.yaml) - -Applies to: `compatible = "zmk,behavior-sensor-rotate"` - -| Property | Type | Description | Default | -| ----------------------- | -------- | ------------------------------------------------------------------------------------------------------ | ------- | -| `#sensor-binding-cells` | int | Must be `<0>` | | -| `bindings` | phandles | A list of two behaviors to trigger for each rotation direction, must _include_ any behavior parameters | | -| `tap-ms` | int | The tap duration (between press and release events) in milliseconds for behaviors in `bindings` | 5 | - -Applies to: `compatible = "zmk,behavior-sensor-rotate-var"` - -| Property | Type | Description | Default | -| ----------------------- | ------------- | ------------------------------------------------------------------------------------------------------ | ------- | -| `#sensor-binding-cells` | int | Must be `<2>` | | -| `bindings` | phandle array | A list of two behaviors to trigger for each rotation direction, must _exclude_ any behavior parameters | | -| `tap-ms` | int | The tap duration (between press and release events) in milliseconds for behaviors in `bindings` | 5 | - -With `compatible = "zmk,behavior-sensor-rotate-var"`, this behavior forwards the first parameter it receives to the parameter of the first behavior specified in `bindings`, and second parameter to the parameter of the second behavior. +| Node | Behavior | +| -------- | ----------------------------------------- | +| `&gresc` | [Grave escape](../behaviors/mod-morph.md) | ## Sticky Key Creates a custom behavior that triggers a behavior and keeps it pressed it until another key is pressed and released. -See the [sticky key behavior](../keymaps/behaviors/sticky-key.md) and [sticky layer behavior](../keymaps/behaviors/sticky-layer.md) documentation for more details and examples. - -### Kconfig - -| Config | Type | Description | Default | -| ----------------------------------------- | ---- | ----------------------------------------------- | ------- | -| `CONFIG_ZMK_BEHAVIOR_STICKY_KEY_MAX_HELD` | int | Maximum number of simultaneous held sticky keys | 10 | +See the [sticky key behavior](../behaviors/sticky-key.md) and [sticky layer behavior](../behaviors/sticky-layer.md) documentation for more details and examples. ### Devicetree @@ -348,36 +194,26 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml](h Applies to: `compatible = "zmk,behavior-sticky-key"` -| Property | Type | Description | Default | -| ------------------ | -------- | ------------------------------------------------------------------------ | ------- | -| `#binding-cells` | int | Must be `<1>` | | -| `bindings` | phandles | A behavior (without parameters) to trigger | | -| `release-after-ms` | int | Releases the key after this many milliseconds if no other key is pressed | 1000 | -| `quick-release` | bool | Release the sticky key on the next key press instead of release | false | -| `lazy` | bool | Wait until the next key press to activate the sticky key behavior | false | -| `ignore-modifiers` | bool | If enabled, pressing a modifier key does not cancel the sticky key | true | - -This behavior forwards the one parameter it receives to the parameter of the behavior specified in `bindings`. +| Property | Type | Description | Default | +| ------------------ | ------------- | ------------------------------------------------------------------------ | ------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must match the number of parameters the `bindings` behavior uses | | +| `bindings` | phandle array | A behavior (without parameters) to trigger | | +| `release-after-ms` | int | Releases the key after this many milliseconds if no other key is pressed | 1000 | +| `quick-release` | bool | Release the sticky key on the next key press instead of release | false | +| `ignore-modifiers` | bool | If enabled, pressing a modifier key does not cancel the sticky key | true | You can use the following nodes to tweak the default behaviors: -| Node | Behavior | -| ----- | ---------------------------------------------------- | -| `&sk` | [Sticky key](../keymaps/behaviors/sticky-key.md) | -| `&sl` | [Sticky layer](../keymaps/behaviors/sticky-layer.md) | +| Node | Behavior | +| ----- | -------------------------------------------- | +| `&sk` | [Sticky key](../behaviors/sticky-key.md) | +| `&sl` | [Sticky layer](../behaviors/sticky-layer.md) | ## Tap Dance Creates a custom behavior that triggers a different behavior corresponding to the number of times the key is tapped. -See the [tap dance behavior](../keymaps/behaviors/tap-dance.mdx) documentation for more details and examples. - -### Kconfig - -| Config | Type | Description | Default | -| ---------------------------------------- | ---- | ---------------------------------------------- | ------- | -| `CONFIG_ZMK_BEHAVIOR_TAP_DANCE_MAX_HELD` | int | Maximum number of simultaneous held tap-dances | 10 | - ### Devicetree Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-tap-dance.yaml) @@ -386,26 +222,7 @@ Applies to: `compatible = "zmk,behavior-tap-dance"` | Property | Type | Description | Default | | ----------------- | ------------- | -------------------------------------------------------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | | `#binding-cells` | int | Must be `<0>` | | | `bindings` | phandle array | A list of behaviors from which to select | | | `tapping-term-ms` | int | The maximum time (in milliseconds) between taps before an item from `bindings` is triggered. | 200 | - -## Two Axis Input - -This behavior is part of the core [pointing devices](../features/pointing.md) feature, and is used to generate X/Y and scroll input events. It is the underlying behavior used for the mouse [move](../keymaps/behaviors/mouse-emulation.md#mouse-move) and [scroll](../keymaps/behaviors/mouse-emulation.md#mouse-scroll) behaviors. - -### Devicetree - -Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-input-two-axis.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-input-two-axis.yaml) - -Applies to: `compatible = "zmk,behavior-input-two-axis"` - -| Property | Type | Description | Default | -| ----------------------- | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -| `#binding-cells` | int | Must be `<1>` | | -| `x-input-code` | int | The [relative event code](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) for generated input events for the X-axis. | | -| `y-input-code` | int | The [relative event code](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) for generated input events for the Y-axis. | | -| `trigger-period-ms` | int | How many milliseconds between generated input events based on the current speed/direction. | 16 | -| `delay-ms` | int | How many milliseconds to delay any processing or event generation when first pressed. | 0 | -| `time-to-max-speed-ms` | int | How many milliseconds it takes to accelerate to the curren max speed. | 0 | -| `acceleration-exponent` | int | The acceleration exponent to apply: `0` - uniform speed, `1` - uniform acceleration, `2` - linear acceleration | 1 | diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md index c9b8578c..d2ddefdd 100644 --- a/docs/docs/config/bluetooth.md +++ b/docs/docs/config/bluetooth.md @@ -9,11 +9,7 @@ See [Configuration Overview](index.md) for instructions on how to change these s ## Kconfig -| Option | Type | Description | Default | -| -------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- | -| `CONFIG_ZMK_BLE_EXPERIMENTAL_CONN` | bool | Enables a combination of settings that are planned to be default in future versions of ZMK to improve connection stability. Currently this only disables 2M PHY support. | n | -| `CONFIG_ZMK_BLE_EXPERIMENTAL_SEC` | bool | Enables a combination of settings that are planned to be officially supported in the future. This includes enabling BT Secure Connection passkey entry, and allows overwrite of keys from previously paired hosts. | n | -| `CONFIG_ZMK_BLE_EXPERIMENTAL_FEATURES` | bool | Aggregate config that enables both `CONFIG_ZMK_BLE_EXPERIMENTAL_CONN` and `CONFIG_ZMK_BLE_EXPERIMENTAL_SEC`. | n | -| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Enable passkey entry during pairing for enhanced security. (Note: After enabling this, you will need to re-pair all previously paired hosts.) | n | -| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | -| `CONFIG_BT_DEVICE_APPEARANCE` | int | Bluetooth device [appearance value](https://bluetooth.com/specifications/assigned-numbers) (should be converted from hexadecimal to decimal). | 961 | +| Option | Type | Description | Default | +| ------------------------------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Enable passkey entry during pairing for enhanced security. (Note: After enabling this, you will need to re-pair all previously paired hosts) | n | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | diff --git a/docs/docs/config/bootloader.md b/docs/docs/config/bootloader.md deleted file mode 100644 index 1387bc4c..00000000 --- a/docs/docs/config/bootloader.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Bootloader Integration Configuration -sidebar_label: Bootloader Integration ---- - -These are general settings that control the various bootloader integration features of ZMK. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -## Kconfig - -Definition file: [zmk/app/src/boot/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/boot/Kconfig) - -### Double Tap To Bootloader - -Some SoCs, like RP2040 or the various STM32 offerings, require holding a certain "boot button" down to enter the bootloader, on a hardware level. To make it easier to enter the bootloader on those platforms, ZMK integrates an optional feature to allow entering the bootloader by simply double tapping reset within the configured timeout period. - -| Config | Type | Description | Default | -| ------------------------------------------ | ---- | ------------------------------------------------------------------- | --------------------------- | -| `CONFIG_ZMK_DBL_TAP_BOOTLOADER` | bool | Enable the double-tap to enter bootloader functionality | y if STM32 or RP2040/RP2350 | -| `CONFIG_ZMK_DBL_TAP_BOOTLOADER_TIMEOUT_MS` | int | Duration (in ms) to wait for a second reset to enter the bootloader | 500 | - -### STM32 nBOOT_SEL Option Byte Setup - -Some newer STM32 series SoCs, in particular stm32c0 and stm32g0, enable the `nBOOT_SEL` bit of the option bytes by default. This bit prevents entering the system ROM bootloader by holding the BOOT0 pin/button during a reset/startup. - -To ensure the BOOT button on keyboard and controllers using these SoCs works as expected after being flashed with ZMK, we check the `nBOOT_SEL` bit on startup and clear it if it is set. Should you _not_ want that functionality, for some reason, this can be disabled. - -| Config | Type | Description | Default | -| ----------------------------------------- | ---- | ------------------------------------- | ----------------------- | -| `CONFIG_ZMK_BOOT_STM32_ENFORCE_NBOOT_SEL` | bool | Ensure the `nBOOT_SEL` bit is not set | y if STM32CO or STM32G0 | - -### Bootmode Magic Value Mapper - -Some target SoCs may use the bootmode magic value mapper for [bootloader integration](docs/hardware-integration/bootloader/index.mdx). When doing so, the following configurations are used: - -| Config | Type | Description | Default | -| ---------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_BOOTMODE_BOOTLOADER_MAGIC_VALUE` | hex | The magic value to place into retained memory when the bootloader boot mode is set | none | -| `CONFIG_ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_TINYUF2` | bool | Used to default the bootloader magic value for the tinyuf2 bootloader | false | -| `CONFIG_ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_BOSSA` | bool | Used to default the bootloader magic value for the Adafruit BOSSA (SAMD21) bootloader | false | -| `CONFIG_ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52` | bool | Used to default the bootloader magic value for the Adafruit nRF52 bootloader | false | diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index b8203cb4..4f5ebba3 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -3,7 +3,7 @@ title: Combo Configuration sidebar_label: Combos --- -See the [Combos informational page](../keymaps/combos.md) for more details and examples. +See the [Combos feature page](../features/combos.md) for more details and examples. See [Configuration Overview](index.md) for instructions on how to change these settings. @@ -11,9 +11,15 @@ See [Configuration Overview](index.md) for instructions on how to change these s Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) -| Config | Type | Description | Default | -| ------------------------------------- | ---- | ------------------------------------------------------------ | ------- | -| `CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS` | int | Maximum number of combos that can be active at the same time | 4 | +| Config | Type | Description | Default | +| ------------------------------------- | ---- | -------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS` | int | Maximum number of combos that can be active at the same time | 4 | +| `CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY` | int | Maximum number of active combos that use the same key position | 5 | +| `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` | int | Maximum number of keys to press to activate a combo | 4 | + +If `CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY` is 5, you can have 5 separate combos that use position `0`, 5 combos that use position `1`, and so on. + +If you want a combo that triggers when pressing 5 keys, you must set `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` to 5. ## Devicetree @@ -27,9 +33,11 @@ Each child node can have the following properties: | Property | Type | Description | Default | | ----------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| `bindings` | phandle-array | A [behavior](../keymaps/index.mdx#behaviors) to run when the combo is triggered | | +| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | | `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | | `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | | `require-prior-idle-ms` | int | If any non-modifier key is pressed within `require-prior-idle-ms` before a key in the combo, the key will not be considered for the combo | -1 (disabled) | | `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | -| `layers` | array | A list of layers on which the combo may be triggered. Omission of this property allows all layers. | | +| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | + +The `key-positions` array must not be longer than the `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` setting, which defaults to 4. If you want a combo that triggers when pressing 5 keys, then you must change the setting to 5. diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index 2896b418..e22f0da8 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -14,17 +14,15 @@ Definition files: - [zmk/app/src/display/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/Kconfig) - [zmk/app/src/display/widgets/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/widgets/Kconfig) -| Config | Type | Description | Default | -| -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------------ | -| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | -| `CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE` | bool | Blank display on idle | y if SSD1306 | -| `CONFIG_ZMK_DISPLAY_TICK_PERIOD_MS` | int | Period (in ms) between display task execution | 10 | -| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | -| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | -| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | -| `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | -| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | -| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +| Config | Type | Description | Default | +| -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | +| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | +| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | +| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images. @@ -53,23 +51,14 @@ You must also configure the driver for your display. ZMK provides the following - [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/display/Kconfig.il0323) -Zephyr provides several display drivers as well. Search for the name of your display in [Zephyr's Kconfig options](https://docs.zephyrproject.org/4.1.0/kconfig.html) documentation. +Zephyr provides several display drivers as well. Search for the name of your display in [Zephyr's Kconfig options](https://docs.zephyrproject.org/latest/kconfig.html) documentation. ## Devicetree See the Devicetree bindings for your display. Here are the bindings for common displays: - [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/display/gooddisplay%2Cil0323.yaml) -- [SSD1306 (i2c)](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/display/solomon,ssd1306fb-i2c.html) -- [SSD1306 (spi)](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/display/solomon,ssd1306fb-spi.html) +- [SSD1306 (i2c)](https://docs.zephyrproject.org/latest/build/dts/api/bindings/display/solomon,ssd1306fb-i2c.html) +- [SSD1306 (spi)](https://docs.zephyrproject.org/latest/build/dts/api/bindings/display/solomon,ssd1306fb-spi.html) -A full list of drivers provided by Zephyr can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings.html). - -### Chosen nodes - -Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) - -| Property | Type | Description | -| ----------------- | ---- | -------------------------------------------------------------------------------------------------------- | -| `zephyr,display` | path | The display device to use. | -| `zmk,display-led` | path | The LED device to use for on/off blanking, if the hardware requires it. Can be a PWM or GPIO LED device. | +A full list of drivers provided by Zephyr can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/latest/build/dts/api/bindings.html). diff --git a/docs/docs/config/encoders.md b/docs/docs/config/encoders.md index 7f68a0e9..3044b392 100644 --- a/docs/docs/config/encoders.md +++ b/docs/docs/config/encoders.md @@ -3,7 +3,7 @@ title: Encoder Configuration sidebar_label: Encoders --- -See the [Encoders informational page](../features/encoders.md) for more details, including instructions for adding encoder support to a board. +See the [Encoders feature page](../features/encoders.md) for more details, including instructions for adding encoder support to a board. See [Configuration Overview](index.md) for instructions on how to change these settings. @@ -29,7 +29,7 @@ If `CONFIG_EC11` is enabled, exactly one of the following options must be set to ### Devicetree -#### Keymap sensor config +#### Keymap Sensor Config For shields/boards that export a `sensors` node configuration label, both global and per-sensor settings can be set by overriding the properties there. @@ -55,8 +55,12 @@ Per sensor overrides can be added with ordered nested nodes with the correct ove }; ``` +:::note + The names of the child nodes are not important, and are applied in order to the sensors listed in the `sensors` property of the sensors node. +::: + Applies to the node and child nodes of: `compatible = "zmk,keymap-sensors"` Definition file: [zmk/app/drivers/zephyr/dts/bindings/zmk,keymap-sensors.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/zmk%2Ckeymap-sensors.yaml) @@ -65,7 +69,7 @@ Definition file: [zmk/app/drivers/zephyr/dts/bindings/zmk,keymap-sensors.yaml](h | ----------------------- | ---- | --------------------------------------------------------------- | ------- | | `triggers-per-rotation` | int | Number of times to trigger the bound behavior per full rotation | | -#### EC11 nodes +#### EC11 Nodes Applies to: `compatible = "alps,ec11"` @@ -73,6 +77,7 @@ Definition file: [zmk/app/module/dts/bindings/sensor/alps,ec11.yaml](https://git | Property | Type | Description | Default | | --------- | ---------- | ---------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | | `a-gpios` | GPIO array | GPIO connected to the encoder's A pin | | | `b-gpios` | GPIO array | GPIO connected to the encoder's B pin | | | `steps` | int | Number of encoder pulses per complete rotation | | diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index e81f65c3..3d7aeb48 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -24,47 +24,46 @@ When building with a `zmk-config` folder, ZMK will search the `zmk-config/config These files hold your personal settings for the keyboard. All files are optional. If present, they override any configuration set in the board or shield folders. Otherwise, the default configuration and/or keymap is used. -When using a [split keyboard](../features/split-keyboards.md), you can use a single file without the `_left` or `_right` suffix to configure both sides. For example, `corne.conf` and `corne.keymap` will apply to both `corne_left` and `corne_right`. If a shared config file exists, any left or right files will be ignored. +When using a split keyboard, you can use a single file without the `_left` or `_right` suffix to configure both sides. For example, `corne.conf` and `corne.keymap` will apply to both `corne_left` and `corne_right`. If a shared config file exists, any left or right files will be ignored. ### Board Folder -ZMK will search for config files in: +ZMK will search for config files in either of: -- [`zmk/app/boards//`](https://github.com/zmkfirmware/zmk/tree/main/app/boards) -- `zmk-config/boards//` -- `/boards//` -- `zmk-config/config/boards//` (For backwards compatibility only, do not use.) +- [`zmk/app/boards/arm/`](https://github.com/zmkfirmware/zmk/tree/main/app/boards/arm) +- `zmk-config/config/boards/arm/` -...where `` is the name of the creator or vendor, `` is the name of the board and `` is the root directory of any [included module](../features/modules.mdx). These files describe the hardware of the board. +...where `` is the name of the board. These files describe the hardware of the board. -ZMK will search the board folder for the following config files _in addition_ to [Zephyr board-defining files](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#create-your-board-directory): +ZMK will search the board folder for the following config files: +- `_defconfig` (Kconfig) - `.conf` (Kconfig) +- `.dts` (Devicetree) - `.keymap` (Devicetree, keyboards with onboard controllers only) Shared config files (excluding any `_left` or `_right` suffix) are not currently supported in board folders. -For more documentation on creating and configuring a new board, see [Zephyr's board porting guide](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#write-kconfig-files). +For more documentation on creating and configuring a new board, see [Zephyr's board porting guide](https://docs.zephyrproject.org/latest/hardware/porting/board_porting.html#write-kconfig-files). ### Shield Folder -When building with a shield, ZMK will search for config files in: +When building with a shield, ZMK will search for config files in either of: - [`zmk/app/boards/shields/`](https://github.com/zmkfirmware/zmk/tree/main/app/boards/shields) -- `zmk-config/boards/shields/` -- `/boards/shields/` -- `zmk-config/config/boards/shields/` (For backwards compatibility only, do not use.) +- `zmk-config/config/boards/shields/` -...where `` is the name of the shield and `` is the root directory of any [included module](../features/modules.mdx). These files describe the hardware of the shield that the board is plugged into. +...where `` is the name of the shield. These files describe the hardware of the shield that the board is plugged into. -ZMK will search the shield folder for the following config files _in addition_ to [Zephyr shield-defining files](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html#shield-porting-and-configuration): +ZMK will search the shield folder for the following config files: - `.conf` (Kconfig) +- `.overlay` (Devicetree) - `.keymap` (Devicetree) Shared config files (excluding any `_left` or `_right` suffix) are not currently supported in shield folders. -For more documentation on creating and configuring a new shield, see [Zephyr's shield documentation](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html) and [ZMK's new keyboard shield](../hardware-integration/new-shield.mdx) guide. +For more documentation on creating and configuring a new shield, see [Zephyr's shield documentation](https://docs.zephyrproject.org/latest/hardware/porting/shields.html) and [ZMK's new keyboard shield](../development/new-shield.md) guide. ## Kconfig Files @@ -78,17 +77,9 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y ``` -Files ending with `_defconfig` use the same syntax as `.conf` files. They set the default configuration for the hardware, which is then overridden by anything in a `.conf` file. +The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Files ending with `_defconfig` use the same syntax, but are intended for setting configuration specific to the hardware which users typically won't need to change. Note that options are _not_ prefixed with `CONFIG_` in these files. -The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Note that options are _not_ prefixed with `CONFIG_` in these files. - -See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html) for more details on Kconfig files. - -:::tip - -You can investigate the [final set of configuration settings](../troubleshooting/building-issues.md#configuration-setting-issues) that are in effect during a build to diagnose any issues with changing Kconfig settings. - -::: +See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/latest/build/kconfig/index.html) for more details on Kconfig files. ### KConfig Value Types @@ -112,9 +103,7 @@ Example: `CONFIG_FOO="foo"` ## Devicetree Files -Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps. A full primer on Devicetree can be found in the [Devicetree Overview page](../development/devicetree.md) -- a shorter summary of some of the points can be found below. - -### Devicetree Overview +Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps. Devicetree files use various file extensions. These indicate the purpose of the file, but they have no effect on how the file is processed. Common file extensions for Devicetree files include: @@ -133,19 +122,14 @@ Devicetree files look like this: kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; }; }; ``` Devicetree properties apply to specific nodes in the tree instead of globally. The properties that can be set for each node are determined by `.yaml` files in ZMK in the various `dts/bindings` folders. -See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/4.1.0/build/dts/index.html) for more details on Devicetree files. - -:::tip - -You can investigate the [final combined Devicetree](../troubleshooting/building-issues.md#devicetree-related-issues) produced during a build to diagnose any issues with changing Devicetree nodes. - -::: +See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/latest/build/dts/index.html) for more details on Devicetree files. ### Changing Devicetree Properties @@ -166,7 +150,7 @@ The part before the colon, `kscan0`, is a label. This is optional, and it provid The `compatible` property indicates what type of node it is. Search this documentation for the text inside the quotes to see which properties the node supports. You can also search ZMK for a file whose name is the value of the `compatible` property with a `.yaml` file extension. -To set a property, see below for examples for common property types, or see [Zephyr's Devicetree documentation](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#writing-property-values) for more details on the syntax for properties. +To set a property, see below for examples for common property types, or see [Zephyr's Devicetree documentation](https://docs.zephyrproject.org/latest/build/dts/intro.html#writing-property-values) for more details on the syntax for properties. To change a property for an existing node, first find the node you want to change and find its label. Next, outside of any other node, write an ampersand (`&`) followed by the node's label, an opening curly brace (`{`), one or more new property values, a closing curly brace (`}`), and a semicolon (`;`). @@ -188,3 +172,88 @@ If the node you want to edit doesn't have a label, you can also write a new tree }; }; ``` + +### Devicetree Property Types + +These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/build/dts/bindings.html) provides more detailed information and a full list of types. + +#### bool + +True or false. To set the property to true, list it with no value. To set it to false, do not list it. + +Example: `property;` + +If a property has already been set to true and you need to override it to false, use the following command to delete the existing property: + +```dts +/delete-property/ the-property-name; +``` + +#### int + +A single integer surrounded by angle brackets. Also supports mathematical expressions. + +Example: `property = <42>;` + +#### string + +Text surrounded by double quotes. + +Example: `property = "foo";` + +#### array + +A list of integers surrounded by angle brackets and separated with spaces. Mathematical expressions can be used but must be surrounded by parenthesis. + +Example: `property = <1 2 3 4>;` + +Values can also be split into multiple blocks, e.g. `property = <1 2>, <3 4>;` + +#### phandle + +A single node reference surrounded by angle brackets. + +Example: `property = <&label>` + +#### phandles + +A list of node references surrounded by angle brackets. + +Example: `property = <&label1 &label2 &label3>` + +#### phandle array + +A list of node references and possibly numbers to associate with the node. Mathematical expressions can be used but must be surrounded by parenthesis. + +Example: `property = <&none &mo 1>;` + +Values can also be split into multiple blocks, e.g. `property = <&none>, <&mo 1>;` + +See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/build/dts/bindings.html) +for more details on how parameters are associated with nodes. + +#### GPIO array + +This is just a phandle array. The documentation lists this as a different type to make it clear which properties expect an array of GPIOs. + +Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/latest/hardware/peripherals/gpio.html) for a full list of flags. + +Example: + +```dts +some-gpios = + <&gpio0 0 GPIO_ACTIVE_HIGH>, + <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; +``` + +#### path + +A path to a node, either as a node reference or as a string. + +Examples: + +```dts +property = &label; +property = "/path/to/some/node"; +``` diff --git a/docs/docs/config/keymap.md b/docs/docs/config/keymap.md index b20bdfe4..b4e81f5e 100644 --- a/docs/docs/config/keymap.md +++ b/docs/docs/config/keymap.md @@ -17,11 +17,11 @@ The `zmk,keymap` node itself has no properties. It should have one child node pe Each child node can have the following properties: -| Property | Type | Description | -| ----------------- | ------------- | -------------------------------------------------------------------- | -| `display-name` | string | Name for the layer in ZMK Studio and on displays | -| `bindings` | phandle-array | List of [key behaviors](../keymaps/index.mdx#behaviors), one per key | -| `sensor-bindings` | phandle-array | List of sensor behaviors, one per sensor | +| Property | Type | Description | +| ----------------- | ------------- | ---------------------------------------------------------------------- | +| `label` | string | Unique label for the node | +| `bindings` | phandle-array | List of [key behaviors](../features/keymaps.md#behaviors), one per key | +| `sensor-bindings` | phandle-array | List of sensor behaviors, one per sensor | Items for `bindings` must be listed in the order the keys are defined in the [keyboard scan configuration](kscan.md). diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 395342a2..00360c46 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -25,12 +25,12 @@ If the debounce press/release values are set to any value other than `-1`, they ### Devicetree -Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/intro.html#aliases-and-chosen-nodes) -| Property | Type | Description | -| ---------------------- | ---- | ---------------------------------------------------------------------- | -| `zmk,kscan` | path | The node for the keyboard scan driver to use | -| `zmk,matrix-transform` | path | The node for the [matrix transform](layout.md#matrix-transform) to use | +| Property | Type | Description | +| ---------------------- | ---- | ------------------------------------------------------------- | +| `zmk,kscan` | path | The node for the keyboard scan driver to use | +| `zmk,matrix_transform` | path | The node for the [matrix transform](#matrix-transform) to use | ## Demux Driver @@ -48,6 +48,7 @@ Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml](h | Property | Type | Description | Default | | ----------------------- | ---------- | -------------------------------- | ------- | +| `label` | string | Unique label for the node | | | `input-gpios` | GPIO array | Input GPIOs | | | `output-gpios` | GPIO array | Demultiplexer address GPIOs | | | `debounce-period` | int | Debounce period in milliseconds | 5 | @@ -71,22 +72,25 @@ Applies to: `compatible = "zmk,kscan-gpio-direct"` Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/kscan/zmk%2Ckscan-gpio-direct.yaml) -| Property | Type | Description | Default | -| ------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------- | ------- | -| `input-gpios` | GPIO array | Input GPIOs (one per key). Can be either direct GPIO pin or `gpio-key` references | | -| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing | 5 | -| `debounce-release-ms` | int | Debounce time for key release in milliseconds | 5 | -| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed | 1 | -| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_DIRECT_POLLING` is enabled | 10 | -| `toggle-mode` | bool | Use toggle switch mode | n | -| `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | n | +| Property | Type | Description | Default | +| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `input-gpios` | GPIO array | Input GPIOs (one per key) | | +| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | +| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | +| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | +| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_DIRECT_POLLING` is enabled. | 10 | +| `toggle-mode` | bool | Use toggle switch mode. | n | -Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/gpio.html#api-reference) for the elements in `input-gpios` should be `(GPIO_ACTIVE_LOW | GPIO_PULL_UP)`: +By default, a switch will drain current through the internal pull up/down resistor whenever it is pressed. This is not ideal for a toggle switch, where the switch may be left in the "pressed" state for a long time. Enabling `toggle-mode` will make the driver flip between pull up and down as the switch is toggled to optimize for power. + +`toggle-mode` applies to all switches handled by the instance of the driver. To use a toggle switch with other, non-toggle, direct GPIO switches, create two instances of the direct GPIO driver, one with `toggle-mode` and the other without. Then, use a [composite driver](#composite-driver) to combine them. + +Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/gpio.html#api-reference) for the elements in `input-gpios` should be `(GPIO_ACTIVE_LOW | GPIO_PULL_UP)`: ```dts kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; - wakeup-source; input-gpios = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -94,27 +98,6 @@ Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](http }; ``` -A direct pin defined in the `input-gpios` property is considered a column when used in a [matrix transform](layout.md#matrix-transform); e.g. the 5th pin on the list can be referred to using `RC(0,4)`. - -By default, a switch will drain current through the internal pull up/down resistor whenever it is pressed. This is not ideal for a toggle switch, where the switch may be left in the "pressed" state for a long time. Enabling `toggle-mode` will make the driver enable and disable the internal pull up/down resistor as needed when the switch is toggled to minimise power draw. For `toggle-mode` to work correctly each pole of the switch needs a dedicated GPIO pin. - -`toggle-mode` applies to all switches handled by the instance of the driver. To use a toggle switch with other, non-toggle, direct GPIO switches, create two instances of the direct GPIO driver, one with `toggle-mode` and the other without. Then, use a [composite driver](#composite-driver) to combine them. The state of the switch is read on power on, so if the switch is moved whilst the board is off this will get correctly interpreted by the driver. - -When using `toggle-mode` the pull resistors get automatically set by the driver and should not be set in the devicetree via GPIO flags. Assuming the common pole of the switch is connected to ground with an SP3T switch: - -```dts - kscan_sp3t_toggle: kscan_sp3t_toggle { - compatible = "zmk,kscan-gpio-direct"; - toggle-mode; - - input-gpios - = <&pro_micro 4 GPIO_ACTIVE_LOW> - , <&pro_micro 3 GPIO_ACTIVE_LOW> - , <&pro_micro 2 GPIO_ACTIVE_LOW> - ; - }; -``` - ## Matrix Driver Keyboard scan driver where keys are arranged on a matrix with one GPIO per row and column. @@ -133,16 +116,16 @@ Applies to: `compatible = "zmk,kscan-gpio-matrix"` Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/kscan/zmk%2Ckscan-gpio-matrix.yaml) -| Property | Type | Description | Default | -| ------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------- | ----------- | -| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | -| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | -| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing | 5 | -| `debounce-release-ms` | int | Debounce time for key release in milliseconds | 5 | -| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed | 1 | -| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | -| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_MATRIX_POLLING` is enabled | 10 | -| `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | n | +| Property | Type | Description | Default | +| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ----------- | +| `label` | string | Unique label for the node | | +| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | +| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | +| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | +| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | +| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | +| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | +| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_MATRIX_POLLING` is enabled. | 10 | The `diode-direction` property must be one of: @@ -151,13 +134,12 @@ The `diode-direction` property must be one of: | `"row2col"` | Diodes point from rows to columns (cathodes are connected to columns) | | `"col2row"` | Diodes point from columns to rows (cathodes are connected to rows) | -Given the `diode-direction`, the [GPIO flags](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/gpio.html#api-reference) for the elements in `row-` and `col-gpios` should be set appropriately. +Given the `diode-direction`, the [GPIO flags](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/gpio.html#api-reference) for the elements in `row-` and `col-gpios` should be set appropriately. The output pins (e.g. columns for `col2row`) should have the flag `GPIO_ACTIVE_HIGH`, and input pins (e.g. rows for `col2row`) should have the flags `(GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)`: ```dts kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - wakeup-source; diode-direction = "col2row"; col-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH> @@ -170,42 +152,6 @@ The output pins (e.g. columns for `col2row`) should have the flag `GPIO_ACTIVE_H }; ``` -## Charlieplex Driver - -Keyboard scan driver where keys are arranged on a matrix with each GPIO used as both input and output. - -- With `interrupt-gpios` unset, this allows n pins to drive n\*(n-1) keys. -- With `interrupt-gpios` set, n pins will drive (n-1)\*(n-2) keys, but provide much improved power handling. - -Definition file: [zmk/app/module/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/kscan/Kconfig) - -| Config | Type | Description | Default | -| --------------------------------------------------- | ----------- | ------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BEFORE_INPUTS` | int (ticks) | How long to wait before reading input pins after setting output active | 0 | -| `CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BETWEEN_OUTPUTS` | int (ticks) | How long to wait between each output to allow previous output to "settle" | 0 | - -### Devicetree - -Applies to: `compatible = "zmk,kscan-gpio-charlieplex"` - -Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-charlieplex.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/kscan/zmk%2Ckscan-gpio-charlieplex.yaml) - -| Property | Type | Description | Default | -| ------------------------- | ---------- | ------------------------------------------------------------------------------------------- | ------- | -| `gpios` | GPIO array | GPIOs used, listed in order. | | -| `interrupt-gpios` | GPIO array | A single GPIO to use for interrupt. Leaving this empty will enable continuous polling. | | -| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | -| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | -| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | -| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `interrupt-gpois` is not set. | 10 | -| `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | n | - -Define the transform with a [matrix transform](layout.md#matrix-transform). The row is always the driven pin, and the column always the receiving pin (input to the controller). -For example, in `RC(5,0)` power flows from the 6th pin in `gpios` to the 1st pin in `gpios`. -Exclude all positions where the row and column are the same as these pairs will never be triggered, since no pin can be both input and output at the same time. - -The [GPIO flags](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/gpio.html#api-reference) for the elements in `gpios` should be `GPIO_ACTIVE_HIGH`, and interrupt pins set in `interrupt-gpios` should have the flags `(GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)`. - ## Composite Driver Keyboard scan driver which combines multiple other keyboard scan drivers. @@ -216,21 +162,20 @@ Applies to : `compatible = "zmk,kscan-composite"` Definition file: [zmk/app/dts/bindings/zmk,kscan-composite.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk,kscan-composite.yaml) -| Property | Type | Description | Default | -| --------------- | ---- | ----------------------------------------------------- | ------- | -| `rows` | int | The number of rows in the composite matrix | | -| `columns` | int | The number of columns in the composite matrix | | -| `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | n | +| Property | Type | Description | Default | +| -------- | ------ | --------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `rows` | int | The number of rows in the composite matrix | | +| `cols` | int | The number of columns in the composite matrix | | The `zmk,kscan-composite` node should have one child node per keyboard scan driver that should be composited. Each child node can have the following properties: -| Property | Type | Description | Default | -| ------------ | ------- | ------------------------------------------------------------------------------ | ------- | -| `kscan` | phandle | Label of the kscan driver to include | | -| `row-offset` | int | Shifts row 0 of the included driver to a new row in the composite matrix | 0 | -| `col-offset` | int | Shifts column 0 of the included driver to a new column in the composite matrix | 0 | - -If you want one of the composited kscans to be able to wake up the keyboard, make sure to set the `wakeup-source` property in its own definition, in addition to setting it for the composite kscan node itself as listed above. +| Property | Type | Description | Default | +| --------------- | ------- | ------------------------------------------------------------------------------ | ------- | +| `label` | string | Unique label for the node | | +| `kscan` | phandle | Label of the kscan driver to include | | +| `row-offset` | int | Shifts row 0 of the included driver to a new row in the composite matrix | 0 | +| `column-offset` | int | Shifts column 0 of the included driver to a new column in the composite matrix | 0 | ### Example Configuration @@ -292,6 +237,7 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift kscan0: kscan_composite { compatible = "zmk,kscan-composite"; + label = "KSCAN0"; rows = <4>; columns = <3>; @@ -316,7 +262,7 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift compatible = "zmk,kscan-gpio-direct"; // define 2 direct GPIOs here... }; -}; +} ``` ## Mock Driver @@ -329,38 +275,138 @@ Applies to: `compatible = "zmk,kscan-mock"` Definition file: [zmk/app/dts/bindings/zmk,kscan-mock.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ckscan-mock.yaml) -| Property | Type | Description | Default | -| -------------- | ----- | --------------------------------------------- | ------- | -| `event-period` | int | Milliseconds between each generated event | | -| `events` | array | List of key events to simulate | | -| `rows` | int | The number of rows in the composite matrix | | -| `columns` | int | The number of columns in the composite matrix | | -| `exit-after` | bool | Exit the program after running all events | false | +| Property | Type | Description | Default | +| -------------- | ------ | --------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `event-period` | int | Milliseconds between each generated event | | +| `events` | array | List of key events to simulate | | +| `rows` | int | The number of rows in the composite matrix | | +| `cols` | int | The number of columns in the composite matrix | | +| `exit-after` | bool | Exit the program after running all events | false | The `events` array should be defined using the macros from [app/module/include/dt-bindings/zmk/kscan_mock.h](https://github.com/zmkfirmware/zmk/blob/main/app/module/include/dt-bindings/zmk/kscan_mock.h). -## Kscan Sideband Behavior Driver +## Matrix Transform -The Kscan sideband behaviors node can be used to assign behaviors to keys in a manner distinctly separate from the keymap. These assignments and definitions will not be affected by nor have any effect on the keymap. +Defines a mapping from keymap logical positions to physical matrix positions. + +Transforms should be used any time the physical layout of a keyboard's keys does not match the layout of its electrical matrix and/or when not all positions in the matrix are used. This applies to most non-ortholinear boards. + +Transforms can also be used for keyboards with multiple layouts. You can define multiple matrix transform nodes, one for each layout, and users can select which one they want from the `/chosen` node in their keymaps. + +See the [new shield guide](../development/new-shield.md#optional-matrix-transform) for more documentation on how to define a matrix transform. ### Devicetree -Applies to: `compatible = "zmk,kscan-sideband-behaviors"` +Applies to: `compatible = "zmk,matrix-transform"` -Definition file: [zmk/app/dts/bindings/kscan/zmk,matrix-transform.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/kscan/zmk%2Ckscan-sideband-behaviors.yaml) +Definition file: [zmk/app/dts/bindings/zmk,matrix-transform.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cmatrix-transform.yaml) -| Property | Type | Description | -| --------------- | ------- | --------------------------------------------------------- | -| `kscan` | phandle | Phandle to a kscan containing keys to assign behaviors to | -| `auto-enable` | bool | Enables the sideband instance on startup unconditionally | -| `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | +| Property | Type | Description | Default | +| ------------ | ----- | --------------------------------------------------------------------- | ------- | +| `rows` | int | Number of rows in the transformed matrix | | +| `columns` | int | Number of columns in the transformed matrix | | +| `row-offset` | int | Adds an offset to all rows before looking them up in the transform | 0 | +| `col-offset` | int | Adds an offset to all columns before looking them up in the transform | 0 | +| `map` | array | A list of position transforms | | -If `auto-enable` is not set, then the sideband behavior will wait for an external activation source before being enabled, e.g. being assigned as the chosen `zmk,kscan`. The `kscan` can contain additional keys, which will be used by the keymap if this node is set as the chosen `zmk,kscan` and has an appropriate matrix transformation defined. +The `map` array should be defined using the `RC()` macro from [dt-bindings/zmk/matrix_transform.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/matrix_transform.h). It should have one item per logical position in the keymap. Each item should list the physical row and column that should trigger the key in that position. -Each child node should have the following properties: +### Example: Skipping Unused Positions -| Property | Type | Description | Default | -| ---------- | ------------- | ------------------------------------------------------------------------------------- | ------- | -| `row` | int | The row index of the key in the `kscan` to intercept and trigger a behavior for | 0 | -| `column` | int | The column index of the key in the `kscan` to intercept and trigger a behavior for | | -| `bindings` | phandle-array | The behavior that should be triggered when the matching row and column event triggers | | +Any keyboard which is not a grid of 1 unit keys will likely have some unused positions in the matrix. A matrix transform can be used to skip the unused positions so users don't have to set them to `&none` in keymaps. + +```dts +// numpad.overlay +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + // define row-gpios with 5 elements and col-gpios with 4... + }; + + default_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <5>; + columns = <4>; + // ┌───┬───┬───┬───┐ + // │NUM│ / │ * │ - │ + // ├───┼───┼───┼───┤ + // │ 7 │ 8 │ 9 │ + │ + // ├───┼───┼───┤ │ + // │ 4 │ 5 │ 6 │ │ + // ├───┼───┼───┼───┤ + // │ 1 │ 2 │ 3 │RET│ + // ├───┴───┼───┤ │ + // │ 0 │ . │ │ + // └───────┴───┴───┘ + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) + RC(2,0) RC(2,1) RC(2,2) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) + RC(4,0) RC(4,1) + >; + }; +}; +``` + +```dts +// numpad.keymap +/ { + keymap { + compatible = "zmk,keymap"; + default { + bindings = < + &kp KP_NUM &kp KP_DIV &kp KP_MULT &kp KP_MINUS + &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS + &kp KP_N4 &kp KP_N5 &kp KP_N6 + &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER + &kp KP_N0 &kp KP_DOT + >; + }; + } +}; +``` + +### Example: Non-standard Matrix + +Consider a keyboard with a [duplex matrix](https://wiki.ai03.com/books/pcb-design/page/matrices-and-duplex-matrix), where the matrix has twice as many rows and half as many columns as the keyboard has keys. A matrix transform can be used to correct for this so that keymaps can match the layout of the keys, not the layout of the matrix. + +```dts +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + // define row-gpios with 12 elements and col-gpios with 8... + }; + + default_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <6>; + columns = <16>; + // ESC F1 F2 F3 ... + // ` 1 2 3 ... + // Tab Q W E ... + // Caps A S D ... + // Shift Z X C ... + // Ctrl Alt ... + map = < + RC(0,0) RC(1,0) RC(0,1) RC(1,1) // ... + RC(2,0) RC(3,0) RC(2,1) RC(3,1) // ... + RC(4,0) RC(5,0) RC(4,1) RC(5,1) // ... + RC(6,0) RC(7,0) RC(6,1) RC(7,1) // ... + RC(8,0) RC(8,1) RC(9,1) // ... + RC(10,0) RC(11,0) // ... + >; + }; +}; +``` diff --git a/docs/docs/config/layout.md b/docs/docs/config/layout.md deleted file mode 100644 index dafcb9cf..00000000 --- a/docs/docs/config/layout.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: Layout Configuration -sidebar_label: Layout ---- - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -## Matrix Transform - -Defines a mapping from keymap logical positions to physical [kscan](./kscan.md) positions. - -You can define multiple matrix transform nodes, one for each layout, and users can select which one they want from the `/chosen` node in their keymaps. - -See the [new shield guide](../hardware-integration/new-shield.mdx#matrix-transform) for more documentation on how to define a matrix transform. - -### Devicetree - -Applies to: `compatible = "zmk,matrix-transform"` - -Definition file: [zmk/app/dts/bindings/zmk,matrix-transform.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cmatrix-transform.yaml) - -| Property | Type | Description | Default | -| ------------ | ----- | --------------------------------------------------------------------- | ------- | -| `rows` | int | Number of rows in the transformed matrix | | -| `columns` | int | Number of columns in the transformed matrix | | -| `row-offset` | int | Adds an offset to all rows before looking them up in the transform | 0 | -| `col-offset` | int | Adds an offset to all columns before looking them up in the transform | 0 | -| `map` | array | A list of position transforms | | - -The `map` array should be defined using the `RC()` macro from [dt-bindings/zmk/matrix_transform.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/matrix_transform.h). It should have one item per logical position in the keymap. Each item should list the physical row and column that should trigger the key in that position. - -### Example: Skipping Unused Positions - -Any keyboard which is not a grid of 1 unit keys will likely have some unused positions in the matrix. A matrix transform can be used to skip the unused positions so users don't have to set them to `&none` in keymaps. - -```dts -// numpad.overlay -/ { - chosen { - zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - // define row-gpios with 5 elements and col-gpios with 4... - }; - - default_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <5>; - columns = <4>; - // ┌───┬───┬───┬───┐ - // │NUM│ / │ * │ - │ - // ├───┼───┼───┼───┤ - // │ 7 │ 8 │ 9 │ + │ - // ├───┼───┼───┤ │ - // │ 4 │ 5 │ 6 │ │ - // ├───┼───┼───┼───┤ - // │ 1 │ 2 │ 3 │RET│ - // ├───┴───┼───┤ │ - // │ 0 │ . │ │ - // └───────┴───┴───┘ - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) - >; - }; -}; -``` - -```dts -// numpad.keymap -/ { - keymap { - compatible = "zmk,keymap"; - default { - bindings = < - &kp KP_NUM &kp KP_DIV &kp KP_MULT &kp KP_MINUS - &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS - &kp KP_N4 &kp KP_N5 &kp KP_N6 - &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER - &kp KP_N0 &kp KP_DOT - >; - }; - } -}; -``` - -### Example: Non-standard Matrix - -Consider a keyboard with a [duplex matrix](https://wiki.ai03.com/books/pcb-design/page/matrices-and-duplex-matrix), where the matrix has twice as many rows and half as many columns as the keyboard has keys. A matrix transform can be used to correct for this so that keymaps can match the layout of the keys, not the layout of the matrix. - -```dts -/ { - chosen { - zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - // define row-gpios with 12 elements and col-gpios with 8... - }; - - default_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <6>; - columns = <16>; - // ESC F1 F2 F3 ... - // ` 1 2 3 ... - // Tab Q W E ... - // Caps A S D ... - // Shift Z X C ... - // Ctrl Alt ... - map = < - RC(0,0) RC(1,0) RC(0,1) RC(1,1) // ... - RC(2,0) RC(3,0) RC(2,1) RC(3,1) // ... - RC(4,0) RC(5,0) RC(4,1) RC(5,1) // ... - RC(6,0) RC(7,0) RC(6,1) RC(7,1) // ... - RC(8,0) RC(9,0) RC(8,1) RC(9,1) // ... - RC(10,0) RC(11,0) // ... - >; - }; -}; -``` - -### Example: Charlieplex - -Since a charlieplex driver will never align with a keyboard directly due to the un-addressable positions, a matrix transform should be used to map the pairs to the layout of the keys. -Note that the entire addressable space does not need to be mapped. - -```devicetree -/ { - chosen { - zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-charlieplex"; - wakeup-source; - - interrupt-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN) >; - gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 17 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; // addressable space is 5x5, (minus paired values) - }; - - default_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <5>; - // Q W E R - // A S D F - // Z X C V - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) - RC(1,0) RC(1,2) RC(1,3) RC(1,4) - RC(2,0) RC(2,1) RC(2,3) RC(2,4) - >; - }; -}; -``` - -## Physical Layout - -Defines a keyboard layout by joining together a [matrix transform](#matrix-transform), a [keyboard scan](./kscan.md), and a list of physical key properties. -Multiple physical layouts can be defined for keyboards with multiple physical key layouts. -Read through the [page on physical layouts](../hardware-integration/physical-layouts.md) for more information. - -### Devicetree - -Applies to: `compatible = zmk,physical-layout` - -Definition file: [zmk/app/dts/bindings/zmk,physical-layout.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cphysical-layout.yaml) - -| Property | Type | Description | Default | -| -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- | ------- | -| `display-name` | string | The name of this layout, for display purposes | | -| `transform` | phandle | The matrix transform to use along with this layout | | -| `kscan` | phandle | The kscan to use along with this layout. The `zmk,kscan` chosen will be used as a fallback if this property is omitted | | -| `keys` | phandle-array | Array of key physical attributes. | | - -Each element of the `keys` array has the shape `<&key_physical_attrs w h x y r rx ry>`, with the following properties: - -| Property | Type | Description | Unit | -| ---------- | -------- | ------------------------------------ | ------------------------------------------------------- | -| Width | int (>0) | Key(cap) width | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Height | int (>0) | Key(cap) height | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| X | uint | Key X position (top-left point) | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Y | uint | Key Y position (top-left point) | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Rotation | int | Key rotation (positive => clockwise) | [centi-](https://en.wikipedia.org/wiki/Centi-)degree | -| Rotation X | int | Rotation origin X position | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Rotation Y | int | Rotation origin Y position | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | - -The `key_physical_attrs` node is defined in [`dts/physical_layouts.dtsi`](https://github.com/zmkfirmware/zmk/blob/main/app/dts/physical_layouts.dtsi) and is mandatory. - -## Kconfig - -| Config | Type | Description | Default | -| ----------------------------------------- | ---- | ------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_PHYSICAL_LAYOUT_KEY_ROTATION` | bool | Whether to store/support key rotation information internally. | y | - -## Physical Layout Position Map - -Defines a mapping between [physical layouts](#physical-layout), allowing key mappings to be preserved in the same locations as previously when using [ZMK Studio](../features/studio.md). Read through the [page on physical layouts](../hardware-integration/physical-layouts.md) for more information. - -### Devicetree - -Applies to: `compatible = zmk,physical-layout-position-map` - -Definition file: [zmk/app/dts/bindings/zmk,physical-layout-position-map.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cphysical-layout-position-map.yaml) - -| Property | Type | Description | Default | -| ---------- | ------- | ------------------------------------------------------------------------------------------------ | ------- | -| `complete` | boolean | If the mapping complete describes the key mapping, and no position based mapping should be used. | | - -The `zmk,physical-layout-position-map` node should have one child node per physical layout. Each child node should have the following properties: - -| Property | Type | Description | Default | -| ----------------- | ------- | --------------------------------------------------------------------------------- | ------- | -| `physical-layout` | phandle | The physical layout that corresponds to this mapping entry | | -| `positions` | array | Array of key positions that match the same array entry in the other sibling nodes | | diff --git a/docs/docs/config/led-indicators.md b/docs/docs/config/led-indicators.md deleted file mode 100644 index e745c444..00000000 --- a/docs/docs/config/led-indicators.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: LED Indicators Configuration -sidebar_label: LED Indicators ---- - -See the [LED indicators feature page](../features/led-indicators.md) for more details. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -## Kconfig - -Definition files: - -- [zmk/app/src/indicators/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/indicators/Kconfig) - -| Config | Type | Description | Default | -| ----------------------------------------- | ---- | --------------------------------------------------- | ------- | -| `CONFIG_ZMK_INDICATOR_LEDS_INIT_PRIORITY` | int | Indicator LED device driver initialization priority | 91 | - -`CONFIG_ZMK_INDICATOR_LEDS_INIT_PRIORITY` must be set to a larger value than `CONFIG_LED_INIT_PRIORITY`. - -## Indicator LED Driver - -This driver maps HID indicator states to [LED API](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/led.html) devices. - -### Devicetree - -Applies to: `compatible = "zmk,indicator-leds"` - -Definition file: [zmk/app/dts/bindings/indicators/zmk,indicator-leds.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/indicators/zmk%2Cindicator-leds.yaml) - -| Property | Type | Description | Default | -| ------------------------- | -------- | --------------------------------------------------------------------- | ------- | -| `indicator` | int | The `HID_INDICATOR_*` value to indicate | | -| `leds` | phandles | One or more LED devices to control | | -| `active-brightness` | int | LED brightness in percent when the indicator is active | 100 | -| `inactive-brightness` | int | LED brightness in percent when the indicator is not active | 0 | -| `disconnected-brightness` | int | LED brightness in percent when the keyboard is not connected | 0 | -| `on-while-idle` | bool | Keep LEDs enabled even when the keyboard is idle and on battery power | false | - -The `indicator` property must be one of the `HID_INDICATOR_*` values defined in [zmk/app/include/dt-bindings/zmk/hid_indicators.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/hid_indicators.h). You may also combine values with `|` to make the LED be lit when any of the indicator states are active. diff --git a/docs/docs/config/lighting.md b/docs/docs/config/lighting.md deleted file mode 100644 index 07388b07..00000000 --- a/docs/docs/config/lighting.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Lighting Configuration -sidebar_label: Lighting ---- - -See the [Lighting feature page](../features/lighting.md) for an overview of the available lighting systems in ZMK. - -## RGB Underglow - -See the [RGB underglow section](../features/lighting.md#rgb-underglow) in the Lighting feature page for more details, and [hardware integration page](../hardware-integration/lighting/underglow.md) for adding underglow support to a board. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -### Kconfig - -RGB underglow depends on [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/main/drivers/led_strip), which provides additional Kconfig options. - -Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) - -| Config | Type | Description | Default | -| ---------------------------------------- | ---- | --------------------------------------------------------- | ------- | -| `CONFIG_ZMK_RGB_UNDERGLOW` | bool | Enable RGB underglow | n | -| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | bool | Underglow toggling also controls external power | y | -| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE` | bool | Turn off RGB underglow when keyboard goes into idle state | n | -| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB` | bool | Turn off RGB underglow when USB is disconnected | n | -| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP` | int | Hue step in degrees (0-359) used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_STEP` | int | Saturation step in percent used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | int | Brightness step in percent used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_START` | int | Default hue in degrees (0-359) | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_START` | int | Default saturation percent (0-100) | 100 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_START` | int | Default brightness in percent (0-100) | 100 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SPD_START` | int | Default effect speed (1-5) | 3 | -| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | int | Default effect index from the effect list (see below) | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | bool | Default on state | y | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN` | int | Minimum brightness in percent (0-100) | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX` | int | Maximum brightness in percent (0-100) | 100 | - -Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: - -| Value | Effect | -| ----- | ----------- | -| 0 | Solid color | -| 1 | Breathe | -| 2 | Spectrum | -| 3 | Swirl | - -:::note -The `*_START` settings only determine the initial underglow state. Any changes you make with the [underglow behavior](../keymaps/behaviors/underglow.md) are saved to flash after a one minute delay and will be used after that. -::: - -### Devicetree - -ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip drivers](https://github.com/zephyrproject-rtos/zephyr/tree/main/dts/bindings/led_strip). - -See the [RGB underglow hardware integration page](../hardware-integration/lighting/underglow.md) for examples of the properties that must be set to enable underglow. - -## Backlight - -See the [backlight section](../features/lighting.md#backlight) in Lighting feature page for more details, and [hardware integration page](../hardware-integration/lighting/backlight.mdx) for adding backlight support to a board. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -### Kconfig - -Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) - -| Option | Type | Description | Default | -| ------------------------------------ | ---- | ----------------------------------------------------- | ------- | -| `CONFIG_ZMK_BACKLIGHT` | bool | Enables LED backlight | n | -| `CONFIG_ZMK_BACKLIGHT_BRT_STEP` | int | Brightness step in percent | 20 | -| `CONFIG_ZMK_BACKLIGHT_BRT_START` | int | Default brightness in percent | 40 | -| `CONFIG_ZMK_BACKLIGHT_ON_START` | bool | Default backlight state | y | -| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE` | bool | Turn off backlight when keyboard goes into idle state | n | -| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB` | bool | Turn off backlight when USB is disconnected | n | - -:::note -The `*_START` settings only determine the initial backlight state. Any changes you make with the [backlight behavior](../keymaps/behaviors/backlight.md) are saved to flash after a one minute delay and will be used after that. -::: - -### Devicetree - -Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) - -| Property | Type | Description | -| --------------- | ---- | -------------------------------------------- | -| `zmk,backlight` | path | The node for the backlight LED driver to use | - -See the Zephyr devicetree bindings for LED drivers: - -- [gpio-leds](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/led/gpio-leds.html) -- [pwm-leds](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/led/pwm-leds.html) - -See the [backlight hardware integration page](../hardware-integration/lighting/backlight.mdx) for examples of the properties that must be set to enable backlighting. diff --git a/docs/docs/config/pointing.md b/docs/docs/config/pointing.md deleted file mode 100644 index 63565e4a..00000000 --- a/docs/docs/config/pointing.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Pointing Device Configuration -sidebar_label: Pointing ---- - -These are settings related to the pointing device/mouse support in ZMK. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -## Kconfig - -Definition file: [zmk/app/pointing/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/pointing/Kconfig) - -### General - -| Config | Type | Description | Default | -| -------------------------------------- | ---- | -------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_POINTING` | bool | Enable the general pointing/mouse functionality | n | -| `CONFIG_ZMK_POINTING_SMOOTH_SCROLLING` | bool | Enable smooth scrolling HID functionality (via HID Resolution Multipliers) | n | - -### Advanced Settings - -The following settings are from Zephyr and should be defaulted to sane values, but can be adjusted if you encounter problems. - -| Config | Type | Description | Default | -| -------------------------------- | ---- | ---------------------------------------------------------- | ------------------------------- | -| `CONFIG_INPUT_THREAD_STACK_SIZE` | int | Stack size for the dedicated input event processing thread | 512 (1024 on split peripherals) | - -## Input Listener - -The following documents settings related to [input listeners](../features/pointing.md#input-listeners). - -### Devicetree - -Applies to: `compatible = "zmk,input-listener"` - -Definition file: [zmk/app/dts/bindings/zmk,input-listener.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cinput-listener.yaml) - -| Property | Type | Description | -| ------------------ | ------------- | ------------------------------------------------------------------- | -| `device` | phandle | Input device handle | -| `input-processors` | phandle-array | List of input processors (with parameters) to apply to input events | - -#### Child Properties - -Additional properties can be set on child nodes, which allows changing the settings when certain layers are enabled: - -| Property | Type | Description | -| ------------------ | ------------- | ------------------------------------------------------------------------------------------ | -| `layers` | array | List of layer indexes. This config will apply if any layer in the list is active. | -| `input-processors` | phandle-array | List of input processors (with parameters) to apply to input events | -| `process-next` | bool | Whether to continue applying other input processors after this override if it takes effect | - -## Input Split - -Input splits are used for [pointing devices on split peripherals](../hardware-integration/pointing.mdx#listener-and-input-split-device). - -### Devicetree - -Applies to: `compatible = "zmk,input-split"` - -Definition file: [zmk/app/dts/bindings/zmk,input-split.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cinput-split.yaml) - -| Property | Type | Description | -| ------------------ | ------------- | ------------------------------------------------------------------- | -| `device` | handle | Input device handle | -| `input-processors` | phandle-array | List of input processors (with parameters) to apply to input events | diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md index df889ed3..e09045ed 100644 --- a/docs/docs/config/power.md +++ b/docs/docs/config/power.md @@ -6,24 +6,27 @@ sidebar_label: Power Management See [Configuration Overview](index.md) for instructions on how to change these settings. -## Low Power States +## Idle/Sleep -Configuration for entering [low power states](../features/low-power-states.md) when the keyboard is idle. +Configuration for entering low power modes when the keyboard is idle. + +In the idle state, peripherals such as displays and lighting are disabled, but the keyboard remains connected to Bluetooth so it can immediately respond when you press a key. + +In the deep sleep state, the keyboard additionally disconnects from Bluetooth and any external power output is disabled. This state uses very little power, but it may take a few seconds to reconnect after waking. ### Kconfig Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) -| Config | Type | Description | Default | -| ------------------------------- | ---- | ------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_IDLE_TIMEOUT` | int | Milliseconds of inactivity before entering idle state | 30000 | -| `CONFIG_ZMK_SLEEP` | bool | Enable deep sleep support | n | -| `CONFIG_ZMK_IDLE_SLEEP_TIMEOUT` | int | Milliseconds of inactivity before entering deep sleep | 900000 | -| `CONFIG_ZMK_PM_SOFT_OFF` | bool | Enable soft off functionality from the keymap or dedicated hardware | n | +| Config | Type | Description | Default | +| ------------------------------- | ---- | ----------------------------------------------------- | ------- | +| `CONFIG_ZMK_IDLE_TIMEOUT` | int | Milliseconds of inactivity before entering idle state | 30000 | +| `CONFIG_ZMK_SLEEP` | bool | Enable deep sleep support | n | +| `CONFIG_ZMK_IDLE_SLEEP_TIMEOUT` | int | Milliseconds of inactivity before entering deep sleep | 900000 | ## External Power Control -Driver for enabling or disabling power to peripherals such as displays and lighting. This driver must be configured to use [power management behaviors](../keymaps/behaviors/power.md). +Driver for enabling or disabling power to peripherals such as displays and lighting. This driver must be configured to use [power management behaviors](../behaviors/power.md). ### Kconfig @@ -39,35 +42,6 @@ Applies to: `compatible = "zmk,ext-power-generic"` | Property | Type | Description | | --------------- | ---------- | ------------------------------------------------------------- | +| `label` | string | Unique label for the node | | `control-gpios` | GPIO array | List of GPIOs which should be active to enable external power | | `init-delay-ms` | int | number of milliseconds to delay after initializing the driver | - -## GPIO Key Wakeup Trigger - -A device similar to a [kscan](./kscan.md) which will be enabled only when the keyboard is entering [soft off](../features/low-power-states.md#soft-off) state. This is used to configure a GPIO key to wake the keyboard from [soft off](../features/low-power-states.md#soft-off) once it is pressed. - -### Devicetree - -Applies to: `compatible = "zmk,gpio-key-wakeup-trigger"` - -Definition file: [zmk/app/dts/bindings/zmk,gpio-key-wakeup-trigger.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cgpio-key-wakeup-trigger.yaml) - -| Property | Type | Description | -| --------------- | ---------- | --------------------------------------------------------------------------------------------- | -| `trigger` | phandle | Phandle to a GPIO key to be used to wake from soft off | -| `wakeup-source` | bool | Mark this device as able to wake the keyboard | -| `extra-gpios` | GPIO array | list of GPIO pins (including the appropriate flags) to set active before going into power off | - -The `wakeup-source` property should always be present for this node to be useful. The `extra-gpios` property should be used to ensure the GPIO pin will trigger properly to wake the keyboard. For example, for a `col2row` matrix kscan, these are the column pins relevant for soft off. - -## Soft Off Wakeup Sources - -Selects a list of devices to enable during [soft off](../features/low-power-states.md#soft-off), allowing those with `wakeup-source` as a property to wake the keyboard. - -### Devicetree - -Applies to: `compatible = "zmk,soft-off-wakeup-sources"` - -| Property | Type | Description | -| ---------------- | ------------- | ------------------------------------------------------------------------------------------------- | -| `wakeup-sources` | phandle array | List of devices to enable during the shutdown process to be sure they can later wake the keyboard | diff --git a/docs/docs/config/settings.md b/docs/docs/config/settings.md deleted file mode 100644 index f7b4c7b3..00000000 --- a/docs/docs/config/settings.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Persistent Settings -sidebar_label: Settings ---- - -ZMK uses [Zephyr's settings subsystem](https://docs.zephyrproject.org/4.1.0/services/settings/index.html) to store certain runtime settings in the "storage" partition of the controller's flash memory. -These settings will be saved after certain events and loaded on boot. -For instance, bond information for [paired Bluetooth hosts](../features/bluetooth.md) are stored in this partition so that users do not need to pair to each device again after the controller loses power. - -Persisted settings are **not** cleared by flashing regular ZMK firmware: this is by design, since modifications like keymap changes should not cause users to lose their Bluetooth pairings. -They can only be cleared by setting a special Kconfig symbol or flashing a special firmware build as documented below. - -Below is a non-comprehensive list of ZMK features that utilize persisted settings. - -- [Bluetooth](../features/bluetooth.md): Stores pairing keys and MAC addresses associated with hosts, BT profile selected through the [keymap behavior](../keymaps/behaviors/bluetooth.md)[^1] -- [Split keyboards](../features/split-keyboards.md): Stores pairing keys and MAC addresses for wireless connection between parts -- [Output selection](../keymaps/behaviors/outputs.md): Stores last selected preferred endpoint changed through the keymap behavior[^1] -- [ZMK Studio](../features/studio.md): Stores any runtime keymap modifications and selected physical layouts after they are saved to the keyboard -- [Lighting](../features/lighting.md): Stores current brightness/color/effects for [underglow](../keymaps/behaviors/underglow.md) and [backlight](../keymaps/behaviors/backlight.md) features after being changed through their keymap behaviors[^1] -- [Power management](../keymaps/behaviors/power.md): Stores the state of the external power toggle as changed through the keymap behavior[^1] - -[^1]: These are not saved immediately, but after `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` milliseconds in order to reduce potential wear on the flash memory. - -## Kconfig - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) - -| Config | Type | Description | Default | -| ------------------------------------ | ---- | ----------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_SETTINGS_RESET_ON_START` | bool | Clears all persistent settings from the keyboard at startup | n | -| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | - -## Clearing Persisted Settings - -While regular ZMK builds will not cause any settings to be cleared upon flashing, flashing a build with `CONFIG_ZMK_SETTINGS_RESET_ON_START` enabled as documented above will cause the firmware to run a special procedure when the controller starts that clears the settings partition. - -For end users, it is recommended to use a special [shield](../hardware-integration/index.mdx#boards--shields) named `settings_reset` to build a new firmware file, then flash that firmware. -See example for building firmware using this shield in the [troubleshooting docs](../troubleshooting/connection-issues.mdx#building-a-reset-firmware). - -In both cases, regular, non-reset firmware will need to be flashed afterwards for normal operation. - -:::warning - -Since pairing information between split keyboards are also cleared with this process, you will need to clear settings on all parts of a split keyboard. -Please follow the full procedure described in [troubleshooting](../troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair) so that the parts can pair correctly after clearing. - -::: - -:::tip - -[ZMK Studio](../features/studio.md)-specific settings can be easily cleared using the "Restore Stock Settings" button in the header of the Studio client. - -::: diff --git a/docs/docs/config/split.md b/docs/docs/config/split.md deleted file mode 100644 index 9aab0b02..00000000 --- a/docs/docs/config/split.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Split Configuration -sidebar_label: Split ---- - -These are settings that control how split keyboards behave. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -## Kconfig - -Following [split keyboard](../features/split-keyboards.md) settings are defined in [zmk/app/src/split/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/Kconfig). - -| Config | Type | Description | Default | -| -------------------------------------------- | ---- | ------------------------------------------------------------------------ | ------- | -| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | -| `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | n | -| `CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS` | bool | Enable split keyboard support for passing indicator state to peripherals | n | - -### Bluetooth Splits - -Following bluetooth [split keyboard](../features/split-keyboards.md) settings are defined in [zmk/app/src/split/bluetooth/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/bluetooth/Kconfig). - -| Config | Type | Description | Default | -| ------------------------------------------------------- | ---- | -------------------------------------------------------------------------- | ------------------------------------------ | -| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS` | int | Number of peripherals that will connect to the central | 1 | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING` | bool | Enable fetching split peripheral battery levels to the central side | n | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_PROXY` | bool | Enable central reporting of split battery levels to hosts | n | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_QUEUE_SIZE` | int | Max number of battery level events to queue when received from peripherals | `CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS` | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 756 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | - -### Wired Splits - -Hardware UARTs have a few different modes/approaches to sending and receiving data, with different levels of complexity and performance. Not all hardware nor drivers support all modes, so ZMK has code to support different interaction modes with the UART as needed. The default mode should be properly selected based on the platform's report support, but you can choose to override the mode if needed. - -- Polling Mode - The least efficient mode, this requires the MCU to constantly poll the UART to see if more data has been received, taking time away from other processing. This is basic mode supported by all UART drivers. -- Interrupt Mode - This mode allows the MCU to do other processing until the UART raises an interrupt to signal new data has been received. On platforms where this is combined with a FIFO, there is even less superfluous processing, and high speeds can be achieved while allowing other processing to continue. Examples: - - RP2040 - - nRF52 -- Async (DMA) Mode - Similar to interrupt mode, data reception can occur without involving the MCU. Additionally, larger volumes can be copied directly into accessible memory without the use of the MCU, allowing even further efficiency/rates without tying up the MCU. Only some drivers support this mode (and the current Zephyr 3.5 version of the nRF52 UART has some bugs that prevent its use). Examples: - - SAM0 (e.g. SAMD21) - - STM32 (e.g. stm32f072) - -Following wired [split keyboard](../features/split-keyboards.md) settings are defined in [zmk/app/src/split/wired/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/wired/Kconfig). - -| Config | Type | Description | Default | -| -------------------------------------------- | ---- | ----------------------------------------------------------------- | ------------------------------------------------------------- | -| `CONFIG_ZMK_SPLIT_WIRED` | bool | Use wired connection to communicate between split keyboard halves | y (if devicetree is set appropriately) | -| `CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC` | bool | Async (DMA) mode | y if the driver supports it (excluding nRF52 with known bugs) | -| `CONFIG_ZMK_SPLIT_WIRED_UART_MODE_INTERRUPT` | bool | Interrupt mode | y if the hardware supports it | -| `CONFIG_ZMK_SPLIT_WIRED_UART_MODE_POLLING` | bool | Polling mode | y if neither other mode is supported | - -#### Async (DMA) Mode - -The following settings only apply when using wired split in async (DMA) mode: - -| Config | Type | Description | Default | -| ----------------------------------------- | ---- | ----------------------------------------------------------- | ------- | -| `CONFIG_ZMK_SPLIT_WIRED_ASYNC_RX_TIMEOUT` | int | RX Timeout (in microseconds) before reporting received data | 20 | - -#### Polling Mode - -The following settings only apply when using wired split in polling mode: - -| Config | Type | Description | Default | -| ------------------------------------------ | ---- | ---------------------------------------------------- | ------- | -| `CONFIG_ZMK_SPLIT_WIRED_POLLING_RX_PERIOD` | int | Number of ticks between calls to poll for split data | 10 | - -## Devicetree - -### Wired Split - -Wired splits require a properly configured UART to function. If writing a shield, you may be able to use the standard UART already provided by the board, e.g. `&pro_micro_serial`. See [predefined nodes](../hardware-integration/pinctrl.mdx#predefined-nodes) for details on the UART node labels provided by various interconnects. If you are creating your own board, or using custom pins for the UART, see the documentation on [pin control](../hardware-integration/pinctrl.mdx#additional-examples) to configure the pins for your UART. - -Once you have a properly configured UART device, it needs to be assigned in a new node with a compatible value of `"zmk,wired-split"`. For example: - -```dts -/ { - wired_split { - compatible = "zmk,wired-split"; - device = <&pro_micro_serial>; - }; -}; -``` diff --git a/docs/docs/config/studio.md b/docs/docs/config/studio.md deleted file mode 100644 index 7a65e37d..00000000 --- a/docs/docs/config/studio.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: ZMK Studio Configuration -sidebar_label: ZMK Studio ---- - -The following settings affect the ZMK Studio portions of ZMK. See the [ZMK Studio feature](../features/studio.md) for more information on enabling and building with ZMK Studio enabled. - -See [Configuration Overview](index.md) for instructions on how to change these settings. - -## Kconfig - -Definition file: [zmk/app/src/studio/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/studio/Kconfig) - -### Keymaps - -| Config | Type | Description | Default | -| -------------------------------------- | ---- | --------------------------------------- | ------- | -| `CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN` | int | Max allowable keymap layer display name | 20 | - -### Locking - -| Config | Type | Description | Default | -| ----------------------------------------- | ---- | ----------------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_STUDIO_LOCKING` | bool | Enable/disable locking for ZMK Studio | y | -| `CONFIG_ZMK_STUDIO_LOCK_IDLE_TIMEOUT_SEC` | int | Seconds of inactivity in ZMK Studio before automatically locking | 500 | -| `CONFIG_ZMK_STUDIO_LOCK_ON_DISCONNECT` | bool | Whether to automatically lock again whenever ZMK Studio disconnects from the device | y | - -### Transport/Protocol Details - -| Config | Type | Description | Default | -| ---------------------------------------------- | ---- | ----------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY` | int | Lower latency to request while ZMK Studio is active to improve responsiveness | 10 | -| `CONFIG_ZMK_STUDIO_RPC_THREAD_STACK_SIZE` | int | Stack size for the dedicated RPC thread | 1800 | -| `CONFIG_ZMK_STUDIO_RPC_RX_BUF_SIZE` | int | Number of bytes available for buffering incoming messages | 30 | -| `CONFIG_ZMK_STUDIO_RPC_TX_BUF_SIZE` | int | Number of bytes available for buffering outgoing messages | 64 | diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 1cf70a82..25d51940 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -13,33 +13,18 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ ### General -| Config | Type | Description | Default | -| --------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_BOARD_COMPAT` | bool | A special config for boards to enable. This helps check if users have accidentally used an upstream Zephyr board without ZMK additions applied | n | -| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | | -| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | -| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | - -:::info - -Because ZMK enables [the Zephyr setting](https://docs.zephyrproject.org/4.1.0/kconfig.html#CONFIG_BT_DEVICE_NAME_DYNAMIC) that allows for runtime modification of the device BT name, -changing `CONFIG_ZMK_KEYBOARD_NAME` requires [clearing the stored settings](./settings.md#clearing-persisted-settings) on the controller in order to take effect. - -::: +| Config | Type | Description | Default | +| ----------------------------------- | ------ | ----------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | | +| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | +| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | +| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | ### HID -:::warning[Refreshing the HID descriptor] - -Making changes to any of the settings in this section modifies the HID report descriptor and requires it to be [refreshed](../features/bluetooth.md#refreshing-the-hid-descriptor). - -::: - -| Config | Type | Description | Default | -| -------------------------------------------- | ---- | ---------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_HID_INDICATORS` | bool | Enable receipt of HID/LED indicator state from connected hosts | n | -| `CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE` | int | Number of consumer keys simultaneously reportable | 6 | -| `CONFIG_ZMK_HID_SEPARATE_MOD_RELEASE_REPORT` | bool | Send modifier release event **after** non-modifier release event | n | +| Config | Type | Description | Default | +| ------------------------------------- | ---- | ------------------------------------------------- | ------- | +| `CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE` | int | Number of consumer keys simultaneously reportable | 6 | Exactly zero or one of the following options may be set to `y`. The first is used if none are set. @@ -48,24 +33,12 @@ Exactly zero or one of the following options may be set to `y`. The first is use | `CONFIG_ZMK_HID_REPORT_TYPE_HKRO` | Enable `CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE` key roll over. | | `CONFIG_ZMK_HID_REPORT_TYPE_NKRO` | Enable full N-key roll over. This may prevent the keyboard from working with some BIOS/UEFI versions. | -:::note[NKRO usages] - -By default the NKRO max usage is set so as to maximize compatibility, however certain less frequently used keys (F13-F24 and INTL1-8) will not work with it. One solution is to set `CONFIG_ZMK_HID_KEYBOARD_NKRO_EXTENDED_REPORT=y`, however this is known to break compatibility with Android and thus not enabled by default. - -::: - If `CONFIG_ZMK_HID_REPORT_TYPE_HKRO` is enabled, it may be configured with the following options: | Config | Type | Description | Default | | ------------------------------------- | ---- | ------------------------------------------------- | ------- | | `CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE` | int | Number of keyboard keys simultaneously reportable | 6 | -If `CONFIG_ZMK_HID_REPORT_TYPE_NKRO` is enabled, it may be configured with the following options: - -| Config | Type | Description | Default | -| ---------------------------------------------- | ---- | -------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_HID_KEYBOARD_NKRO_EXTENDED_REPORT` | bool | Enable less frequently used key usages, at the cost of compatibility | n | - Exactly zero or one of the following options may be set to `y`. The first is used if none are set. | Config | Description | @@ -83,24 +56,16 @@ Exactly zero or one of the following options may be set to `y`. The first is use | `CONFIG_USB_DEVICE_MANUFACTURER` | string | The manufacturer name advertised to USB | `"ZMK Project"` | | `CONFIG_USB_HID_POLL_INTERVAL_MS` | int | USB polling interval in milliseconds | 1 | | `CONFIG_ZMK_USB` | bool | Enable ZMK as a USB keyboard | | -| `CONFIG_ZMK_USB_BOOT` | bool | Enable USB Boot protocol support | n | | `CONFIG_ZMK_USB_INIT_PRIORITY` | int | USB init priority | 50 | -:::note[USB Boot protocol support] - -By default USB Boot protocol support is disabled, however certain situations such as the input of Bitlocker pins or FileVault passwords may require it to be enabled. - -::: - ### Bluetooth -See [Zephyr's Bluetooth stack architecture documentation](https://docs.zephyrproject.org/4.1.0/connectivity/bluetooth/bluetooth-arch.html) +See [Zephyr's Bluetooth stack architecture documentation](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-arch.html) for more information on configuring Bluetooth. | Config | Type | Description | Default | | ------------------------------------------- | ---- | --------------------------------------------------------------------- | ------- | | `CONFIG_BT` | bool | Enable Bluetooth support | | -| `CONFIG_BT_BAS` | bool | Enable the Bluetooth BAS (battery reporting service) | y | | `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | | `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | | `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | @@ -109,7 +74,7 @@ for more information on configuring Bluetooth. | `CONFIG_ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE` | int | Max number of keyboard HID reports to queue for sending over BLE | 20 | | `CONFIG_ZMK_BLE_INIT_PRIORITY` | int | BLE init priority | 50 | | `CONFIG_ZMK_BLE_THREAD_PRIORITY` | int | Priority of the BLE notify thread | 5 | -| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 768 | +| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 512 | | `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Experimental: require typing passkey from host to pair BLE connection | n | Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the same value. On a split keyboard they should only be set for the central and must be set to one greater than the desired number of bluetooth profiles. @@ -121,51 +86,18 @@ Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the s | `CONFIG_ZMK_USB_LOGGING` | bool | Enable USB CDC ACM logging for debugging | n | | `CONFIG_ZMK_LOG_LEVEL` | int | Log level for ZMK debug messages | 4 | -## Snippets +### Split keyboards -:::danger -Using these snippets can erase the SoftDevice on your board. -Erasing the SoftDevice will prevent the board from using firmware built without these snippets. +Following split keyboard settings are defined in [zmk/app/src/split/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/Kconfig) (generic) and [zmk/app/src/split/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/bluetooth/Kconfig) (bluetooth). -Flashing such firmware **will** totally brick the board, disabling the USB flashing functionality. -The only way to restore functionality after that is to re-flash the bootloader. - -Re-flashing a bootloader built without the SoftDevice will require firmware built with these snippets. -::: - -[Snippets](https://docs.zephyrproject.org/4.1.0/build/snippets/index.html) are a way to save common configuration separately when it applies to multiple different applications. - -Enable snippets by adding `snippet: ` to your `build.yaml` for the appropriate board: - -```yaml -- board: nrfmicro@1.3.0/nrf52833 - snippet: nrf52833-nosd - shield: corne_left -``` - -For local builds, add `-S ` to your build command. For example: - -```sh -west build -b nrfmicro@1.3.0/nrf52833 -S nrf52833-nosd -- -DSHIELD=corne_left -``` - -ZMK implements the following system configuration snippets: - -### nrf52833-nosd - -Definition: [zmk/app/snippets/nrf52833-nosd](https://github.com/zmkfirmware/zmk/blob/main/app/snippets/nrf52833-nosd) - -On memory-constrained nRF52833 boards this snippet will extend the code partition to overwrite the Nordic SoftDevice. -This gives 428KB for the code partition as opposed to 280KB with the Nordic SoftDevice. - -The added memory allows the nRF52833 to fit displays and other memory-intensive features. - -### nrf52840-nosd - -Definition: [zmk/app/snippets/nrf52840-nosd](https://github.com/zmkfirmware/zmk/blob/main/app/snippets/nrf52840-nosd) - -On nRF52840 boards this snippet will overwrite the Nordic SoftDevice, extending both the code and storage partitions. -This gives 844KB/128KB for the code/storage partitions as opposed to 792KB/32KB with the Nordic SoftDevice. - -Firmware built with this snippet can work on boards after accidentally erasing the SoftDevice. -It can also be useful for especially memory-intensive applications. +| Config | Type | Description | Default | +| ----------------------------------------------------- | ---- | ----------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | +| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | +| `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | diff --git a/docs/docs/config/underglow.md b/docs/docs/config/underglow.md new file mode 100644 index 00000000..1209e60e --- /dev/null +++ b/docs/docs/config/underglow.md @@ -0,0 +1,49 @@ +--- +title: RGB Underglow Configuration +sidebar_label: RGB Underglow +--- + +See the [RGB Underglow feature page](../features/underglow.md) for more details, including instructions for adding underglow support to a board. + +See [Configuration Overview](index.md) for instructions on how to change these settings. + +## Kconfig + +RGB underglow depends on [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/main/drivers/led_strip), which provides additional Kconfig options. + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ---------------------------------------- | ---- | --------------------------------------------------------- | ------- | +| `CONFIG_ZMK_RGB_UNDERGLOW` | bool | Enable RGB underglow | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | bool | Underglow toggling also controls external power | y | +| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE` | bool | Turn off RGB underglow when keyboard goes into idle state | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB` | bool | Turn off RGB underglow when USB is disconnected | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP` | int | Hue step in degrees (0-359) used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_STEP` | int | Saturation step in percent used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | int | Brightness step in percent used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_START` | int | Default hue in degrees (0-359) | 0 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_START` | int | Default saturation percent (0-100) | 100 | +| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_START` | int | Default brightness in percent (0-100) | 100 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SPD_START` | int | Default effect speed (1-5) | 3 | +| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | int | Default effect index from the effect list (see below) | 0 | +| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | bool | Default on state | y | + +Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: + +| Value | Effect | +| ----- | ----------- | +| 0 | Solid color | +| 1 | Breathe | +| 2 | Spectrum | +| 3 | Swirl | + +:::note +The `*_START` settings only determine the initial underglow state. Any changes you make with the [underglow behavior](../behaviors/underglow.md) are saved to flash after a one minute delay and will be used after that. +::: + +## Devicetree + +ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip drivers](https://github.com/zephyrproject-rtos/zephyr/tree/main/dts/bindings/led_strip). + +See the [RGB underglow feature page](../features/underglow.md) for examples of the properties that must be set to enable underglow. diff --git a/docs/docs/customization.md b/docs/docs/customization.md index db7ea935..a68e8595 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -4,7 +4,7 @@ sidebar_label: Customizing ZMK --- After verifying you can successfully flash the default firmware, you will probably want to begin customizing your keymap and other keyboard options. -[In the initial setup tutorial](user-setup.mdx), you created a Github repository called `zmk-config`. This repository is a discrete filesystem which works +[In the initial setup tutorial](user-setup.md), you created a Github repository called `zmk-config`. This repository is a discrete filesystem which works with the main `zmk` firmware repository to build your desired firmware. The main advantage of a discrete configuration folder is ensuring that the working components of ZMK are kept separate from your personal keyboard settings, reducing the amount of file manipulation in the configuration process. This makes flashing ZMK to your keyboard much easier, especially because you don't need to keep an up-to-date copy of zmk on your computer at all times. @@ -28,7 +28,7 @@ Refer to the [Configuration](/docs/config) documentation for more details on thi ## Keymap Once you have the basic user config completed, you can find the keymap file in `config/.keymap` and customize from there. -Refer to the [Keymaps](keymaps/index.mdx) documentation to learn more. +Refer to the [Keymap](features/keymaps.md) documentation to learn more. ## Publishing @@ -40,31 +40,31 @@ If you need to, a review of [Learn The Basics Of Git In Under 10 Minutes](https: ::: :::note -It is also possible to build firmware locally on your computer by following the [toolchain setup](development/local-toolchain/setup/index.md) and -[building instructions](development/local-toolchain/build-flash.mdx), which includes pointers to -[building using your `zmk-config` folder](development/local-toolchain/build-flash.mdx#building-from-zmk-config-folder). +It is also possible to build firmware locally on your computer by following the [toolchain setup](development/setup.md) and +[building instructions](development/build-flash.md), which includes pointers to +[building using your `zmk-config` folder](development/build-flash.md#building-from-zmk-config-folder). ::: ## Flashing Your Changes For normal keyboards, follow the same flashing instructions as before to flash your updated firmware. -For [split keyboards](features/split-keyboards.md#building-and-flashing-firmware), only the central (left) side will need to be reflashed if you are just updating your keymap. -More troubleshooting information for split keyboards can be found [here](troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair). +For split keyboards, only the central (left) side will need to be reflashed if you are just updating your keymap. +More troubleshooting information for split keyboards can be found [here](troubleshooting.md#split-keyboard-halves-unable-to-pair). ## Building Additional Keyboards -You can build additional keyboards with GitHub actions by appending them to `build.yaml` in your `zmk-config` folder. For instance assume that we have set up a Corne shield with nice!nano during [initial setup](user-setup.mdx) and we want to add a Lily58 shield with nice!nano v2. The following is an example `build.yaml` file that would accomplish that: +You can build additional keyboards with GitHub actions by appending them to `build.yml` in your `zmk-config` folder. For instance assume that we have set up a Corne shield with nice!nano during [initial setup](user-setup.md) and we want to add a Lily58 shield with nice!nano v2. The following is an example `build.yaml` file that would accomplish that: ```yaml include: - - board: nice_nano@1 + - board: nice_nano shield: corne_left - - board: nice_nano@1 + - board: nice_nano shield: corne_right - - board: nice_nano + - board: nice_nano_v2 shield: lily58_left - - board: nice_nano + - board: nice_nano_v2 shield: lily58_right ``` diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md new file mode 100644 index 00000000..77d8361a --- /dev/null +++ b/docs/docs/development/boards-shields-keymaps.md @@ -0,0 +1,52 @@ +--- +title: Boards, Shields, and Keymaps +--- + +## Architecture Overview + +The foundational elements needed to get a specific keyboard working with ZMK can be broken down into: + +- A [KSCAN driver](https://docs.zephyrproject.org/2.5.0/reference/peripherals/kscan.html), which uses `compatible="zmk,kscan-gpio-matrix"` for GPIO matrix based keyboards, or uses `compatible="zmk,kscan-gpio-direct"` for small direct wires. +- An optional matrix transform, which defines how the KSCAN row/column events are translated into logical "key positions". This is required for non-rectangular keyboards/matrices, where the key positions don't naturally follow the row/columns from the GPIO matrix. +- A keymap, which binds each key position to a behavior, e.g. key press, mod-tap, momentary layer, in a set of layers. + +These three core architectural elements are defined per-keyboard, and _where_ they are defined depends on the specifics of how that +keyboard works. For an overview on the general concepts of boards and shields, please see the [FAQs on boards and shields](../faq.md#why-boards-and-shields--why-not-just-keyboard). + +## Self-Contained Keyboard + +For a self-contained keyboard that includes the microprocessor, all of the above architecture components are included in the Zephyr _board_ definition. You can see an example for the [Planck V6](https://github.com/zmkfirmware/zmk/tree/main/app/boards/arm/planck) board directory. + +With this type of keyboard, the full ZMK definition for the keyboard exists +in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck/`. In that directory, you'll have the following: + +- A `Kconfig.board` file that defines the toplevel Kconfig item for the board, including which SoC Kconfig setting it depends on. +- A `Kconfig.defconfig` file that sets some initial defaults when building this keyboard. This usually includes: + - Setting `ZMK_KEYBOARD_NAME` to a value, for the product name to be used for USB/BLE info. + - Setting `ZMK_USB` and/or `ZMK_BLE` for the default values for which HID transport(s) to enable by default +- A `${board_name}_defconfig` file that forces specific Kconfig settings that are specific to this hardware configuration. Mostly this is SoC settings around the specific hardware configuration. +- `${board_name}.dts` which contains all the devicetree definitions, including: + - An `#include` line that pulls in the specific microprocessor that is used, e.g. `#include `. + - A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,kscan` which references the configured KSCAN driver (usually a GPIO matrix) + - (Optional) A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,matrix_transform` that defines the mapping from KSCAN row/column values to the logical key position for the keyboard. +- A `board.cmake` file with CMake directives for how to flash to the device. +- A `${board_name}.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. + +## Pro Micro Compatible Keyboard + +![Labelled Pro Micro pins](../assets/interconnects/pro_micro/pinout.png) + +For keyboards that require a (usually Pro Micro compatible) add-on board to operate, the ZMK integration pieces are places +in the _shield_ definition for that keyboard, allowing users to +swap in different Pro Micro compatible boards (e.g. Proton-C, or nice!nano) and build a firmware the matches their actual +combination of physical components. + +With this type of keyboard, the partial definition for the keyboard exists +in the `app/boards/shields/${board_name}` directory, e.g. `app/boards/shields/clueboard_california/`. In that directory, you'll have the following: + +- A `Kconfig.shield` that defines the toplevel Kconfig value for the shield, which uses a supplied utility to function to default the value based on the shield list, e.g. `def_bool $(shields_list_contains,clueboard_california)`. +- A `Kconfig.defconfig` file to set default values for things like `ZMK_KEYBOARD_NAME` +- A `${shield_name}.overlay` file, which is a devicetree overlay file, that includes: + - A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,kscan` which references the configured KSCAN driver (usually a GPIO matrix). For these keyboards, to be compatible with any Pro Micro compatible boards, the KSCAN configuration should reference the [nexus node](https://docs.zephyrproject.org/2.5.0/guides/porting/shields.html#gpio-nexus-nodes) that ZMK has standardized on. In particular, the `&pro_micro` aliases can be used to reference the standard digital pins of a Pro Micro for shields. + - (Optional) A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,matrix_transform` that defines the mapping from KSCAN row/column values to the logical key position for the keyboard. +- A `keymap/keymap.overlay` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md new file mode 100644 index 00000000..0243983c --- /dev/null +++ b/docs/docs/development/build-flash.md @@ -0,0 +1,162 @@ +--- +title: Building and Flashing +sidebar_label: Building and Flashing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +export const OsTabs = (props) => ({props.children}); + +## Building + +From here on, building and flashing ZMK should all be done from the `app/` subdirectory of the ZMK checkout: + +```sh +cd app +``` + +To build for your particular keyboard, the behavior varies slightly depending on if you are building for a keyboard with +an onboard MCU, or one that uses an MCU board addon. + +### Keyboard (Shield) + MCU Board + +ZMK treats keyboards that take an MCU addon board as [shields](https://docs.zephyrproject.org/2.5.0/guides/porting/shields.html), and treats the smaller MCU board as the true [board](https://docs.zephyrproject.org/2.5.0/guides/porting/board_porting.html) + +Given the following: + +- MCU Board: Proton-C +- Keyboard PCB: kyria_left +- Keymap: default + +You can build ZMK with the following: + +```sh +west build -b proton_c -- -DSHIELD=kyria_left +``` + +### Keyboard With Onboard MCU + +Keyboards with onboard MCU chips are simply treated as the [board](https://docs.zephyrproject.org/2.5.0/guides/porting/board_porting.html) as far as Zephyr™ is concerned. + +Given the following: + +- Keyboard: Planck (rev6) +- Keymap: default + +you can build ZMK with the following: + +```sh +west build -b planck_rev6 +``` + +### Pristine Building + +When building for a new board and/or shield after having built one previously, you may need to enable the pristine build option. This option removes all existing files in the build directory before regenerating them, and can be enabled by adding either --pristine or -p to the command: + +```sh +west build -p -b nice_nano_v2 -- -DSHIELD=kyria_left +``` + +### Building For Split Keyboards + +:::note +For split keyboards, you will have to build and flash each side separately the first time you install ZMK. +::: + +By default, the `build` command outputs a single .uf2 file named `zmk.uf2` so building left and then right immediately after will overwrite your left firmware. In addition, you will need to pristine build each side to ensure the correct files are used. To avoid having to pristine build every time and separate the left and right build files, we recommend setting up separate build directories for each half. You can do this by using the `-d` parameter and first building left into `build/left`: + +```sh +west build -d build/left -b nice_nano_v2 -- -DSHIELD=kyria_left +``` + +and then building right into `build/right`: + +```sh +west build -d build/right -b nice_nano_v2 -- -DSHIELD=kyria_right +``` + +This produces `left` and `right` subfolders under the `build` directory and two separate .uf2 files. For future work on a specific half, use the `-d` parameter again to ensure you are building into the correct location. + +:::tip +Build times can be significantly reduced after the initial build by omitting all build arguments except the build directory, e.g. `west build -d build/left`. The additional options and intermediate build outputs from your initial build are cached and reused for unchanged files. +::: + +### Building from `zmk-config` Folder + +Instead of building .uf2 files using the default keymap and config files, you can build directly from your [`zmk-config` folder](../user-setup.md#github-repo) by adding +`-DZMK_CONFIG="C:/the/absolute/path/config"` to your `west build` command. **Notice that this path should point to the folder labelled `config` within your `zmk-config` folder.** + +For instance, building kyria firmware from a user `myUser`'s `zmk-config` folder on Windows 10 may look something like this: + +```sh +west build -b nice_nano -- -DSHIELD=kyria_left -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config" +``` + +:::caution +The above command must still be invoked from the `zmk/app` directory as noted above, rather than the config directory. Otherwise, you will encounter errors such as `ERROR: source directory "." does not contain a CMakeLists.txt; is this really what you want to build?`. Alternatively you can add the `-s /path/to/zmk/app` flag to your `west` command. +::: + +In order to make your `zmk-config` folder available when building within the VSCode Remote Container, you need to create a docker volume named `zmk-config` +by binding it to the full path of your config directory. If you have run the VSCode Remote Container before, it is likely that docker has created this +volume automatically -- we need to delete the default volume before binding it to the correct path. Follow the following steps: + +1. Stop the container by exiting VSCode. You can verify no container is running via the command `docker ps`. +1. Remove all the containers that are not running via the command `docker container prune`. We need to remove the ZMK container before we can delete the default `zmk-config` volume referenced by it. If you do not want to delete all the containers that are not running, you can find the id of the ZMK container and use `docker rm` to delete that one only. +1. Remove the default volume via the command `docker volume rm zmk-config`. + +Then you can bind the `zmk-config` volume to the correct path pointing to your local [zmk-config](customization.md) folder: + +```sh +docker volume create --driver local -o o=bind -o type=none -o \ + device="/full/path/to/your/zmk-config/" zmk-config +``` + +Now start VSCode and rebuild the container after being prompted. You should be able to see your zmk-config mounted to `/workspaces/zmk-config` inside the container. So you can build your custom firmware with `-DZMK_CONFIG="/workspaces/zmk-config/config"`. + +## Flashing + +The above build commands generate a UF2 file in `build/zephyr` (or +`build/left|right/zephyr` if you followed the instructions for splits) and is by +default named `zmk.uf2`. If your board supports USB Flashing Format (UF2), copy +that file onto the root of the USB mass storage device for your board. The +controller should flash your built firmware, unmount the USB storage device and +automatically restart once flashing is complete. + +Alternatively, if your board supports flashing and you're not developing from +within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on +your board and run the following command to flash: + +```sh +west flash +``` + +## Multi-CPU and Dual-Chip Bluetooth Boards + +Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/3.2.0/connectivity/bluetooth/bluetooth-arch.html) for more details. + +The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. + +### nRF5340 + +To build and flash the firmware for the nRF5340 development kit's network core, run the following command from the root of the ZMK repo: + +```sh +cd zephyr/samples/bluetooth/hci_rpmsg +west build -b nrf5340dk_nrf5340_cpunet +west flash +``` + +You can then build and flash ZMK firmware using the normal steps described above. The network core's firmware only needs to be updated whenever ZMK upgrades to a new version of Zephyr. + +For a custom nRF5340-based board, you will need to define two Zephyr boards: one for the application core and one for the network core. The [nRF5340 DK's board definition](https://github.com/zephyrproject-rtos/zephyr/tree/main/boards/arm/nrf5340dk_nrf5340) can be used as reference. Replace `nrf5340dk_nrf5340_cpunet` with the name of your network core board. diff --git a/docs/docs/development/contributing/clean-room.md b/docs/docs/development/clean-room.md similarity index 99% rename from docs/docs/development/contributing/clean-room.md rename to docs/docs/development/clean-room.md index 45fa324e..82db3a04 100644 --- a/docs/docs/development/contributing/clean-room.md +++ b/docs/docs/development/clean-room.md @@ -3,7 +3,7 @@ title: Clean Room Implementation sidebar_label: Clean Room --- -:::danger +:::warning Anyone wanting to contribute code to ZMK _MUST_ read this, and adhere to the steps outlines in order to not violate any licenses/copyright of other projects diff --git a/docs/docs/development/contributing/pull-requests.md b/docs/docs/development/contributing/pull-requests.md deleted file mode 100644 index a9585475..00000000 --- a/docs/docs/development/contributing/pull-requests.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Pull Requests ---- - -Changes to ZMK's `main` branch are all done through pull requests, even for core committers. The following will help ensure an easier PR/review process for all involved. - -## Clean Commit History - -Before opening a PR, ensure your branch has a clean commit history, which allows our release automation to generate clean changelogs, and allows easier understanding of our commit history when investigating regressions, etc. - -A "clean" commit history satisfies the following: - -- Commit messages follow our [commit message conventions](#commit-messages). -- The sequence of commits should be well organized, with discrete commits used to break any combined work into smaller, cohesive changes if the scope of a given PR/change is larger. This allows for easier code review. You can usually accomplish this by amending (e.g. `git add foo && git commit --amend`) or by interactive rebasing (e.g. `git rebase -i upstream/main`) and squashing/rewording commits. -- Do not use merge commits to catch up with ZMK `main`, instead using rebasing to address any issues with divergence (e.g. `git rebase upstream/main`). - -### Commit Messages - -The ZMK project uses [conventional commits](https://www.conventionalcommits.org/) for their commit messages. This not only provides consistency for our commits, but also allows for release/versioning automation to determine the next version to release, generating changelogs, etc. - -Commit messages will be checked as part of our CI process by GitHub Actions. - -#### Guidelines - -Commits should have the following: - -- A first line prefix that includes a [type](#types), as well as appropriate [scope](#scopes) in parentheses as needed. -- Following the prefix, a concise summary of the change, which documents the new behavior/feature/functionality in the positive (e.g. "wake from sleep now works with charlieplex kscan", not "fixed waked from sleep bug with charlieplex kscan driver"). -- A blank line following the first line. -- A body that provides more detail of the changes. This _may_ be a bulleted list or paragraph prose. -- An optional set of [git trailers](https://git-scm.com/docs/git-interpret-trailers#_description) for things like [GitHub keywords](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests) following a blank line. - -#### Example - -Here is an example of a good commit message: - -``` -feat(boards): Add numpad layouts - -Added physical layouts for the following variants of numpads: - -- With and without extra top row -- 2U plus key or 1U plus and backspace keys -- 2U 0 key or 1U 0 and 00 keys -- Full 1U grid/macropad layout - -Other layouts exist, such as "southpaw" horizontally mirrored layouts, -and layouts with a fifth column, but those seem to be much less common. -``` - -#### Pre-Commit - -To help make sure you don't need to wait for GitHub Actions to check your commits, you can [set up pre-commit](../local-toolchain/pre-commit.md) to check your commits as you create them. - -#### Types - -The following commit types are used by ZMK: - -- `blog:` -- changes to our documentation found in the `docs/blog` directory -- `docs:` -- changes to our documentation found in the `docs/` directory, except blogs -- `feat:` -- changes that add a new feature -- `fix:` -- changes that fix existing functionality -- `refactor:` -- changes that refactor existing functionality without adding any new features -- `feat!:`/`refactor!:`/`fix!:` -- same as above, but indicates a breaking change. Examples would be changes to the public C API, renaming a board/shield, editing a board or shield to rename devicetree labels that may be used in keymaps, etc. -- `ci:` -- changes to our continuous integration setup with GitHub Actions, usually only for the files in `.github/workflows/` -- `chore:` -- grab bag type for small changes that don't fall into any of the above categories, including dependency updates for development tools and docs. - -#### Scopes - -The following scopes are frequently used to further clarify the scope of the change: - -- `hid` -- changes to our general HID code -- `usb` -- changes specific to USB -- `ble` -- changes specific to BLE -- `power` -- changes to our power management code -- `split` -- changes to our split keyboard support -- `studio` -- changes to our ZMK Studio code -- `display` -- changes to to our display code -- `underglow` -- changes to to our RGB underglow support -- `backlight` -- changes to to our simple LED backlight support -- `behaviors` -- changes to to our core behavior code -- `core` -- changes to any other area of our core code -- `boards` -- changes to the in-tree boards -- `shields` -- changes to the in-tree shields - -## Opening a PR - -Create a PR by visiting https://github.com/zmkfirmware/zmk/pulls and clicking "New pull request" and selecting your branch. GitHub should auto-populate a start of a description/body to your PR, but please make sure to supplement that with additional details about the change and make sure the check-list is complete in the PR template. - -Once created, the PR should automatically have reviewers assigned. - -## Review - -Depending on the area of change, different ZMK team members will review the PR. The ZMK project is a small team, so please be patient with the review timeline. You are welcome to send a polite request/nudge on our Discord server to draw attention to your PR if it has not gotten a response after a reasonable amount of time. - -## Merging - -Maintainers merging PRs will perform the following steps: - -1. Verify that the expected tests have all run, and are passing -1. Inspect the commits in the PR to confirm the commit messages not only are proper conventional commits, but have accurate descriptions and are using the correct type for the set of files changed by the commit(s). -1. Merge the PR using a squash-merge. If the PR includes multiple commits, then the squash message will be fixed up manually to remove the `* ` prefixes from each message section to ensure [release-please](https://github.com/googleapis/release-please) properly will parse the compound commit message. -1. Confirm the new/existing release PR is updated properly with the expected version number and changelog. diff --git a/docs/docs/development/devicetree.md b/docs/docs/development/devicetree.md deleted file mode 100644 index f576b36e..00000000 --- a/docs/docs/development/devicetree.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -title: Devicetree Overview -sidebar_label: Devicetree Overview ---- - -ZMK makes heavy usage of a type of [tree data structure]() known as _devicetree_. -Devicetree is a _declarative_ way of describing almost everything about a Zephyr device, from the definition of keymaps and configuration of behaviors all the way to the internal storage partitions and architecture of the board's MCU. - -This page is an introduction to devicetree for ZMK users and designers. -For further reading, refer to the [devicetree spec](https://github.com/devicetree-org/devicetree-specification/releases) and [Zephyr's documentation](https://docs.zephyrproject.org/latest/build/dts/index.html#devicetree-guide). - -## Running Example - -The following segment taken from a keymap will be used as a running example: - -```dts -#include -#include - -/ { - behaviors { - spc_ul: space_underscore { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp SPACE>, <&kp UNDERSCORE>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = <&spc_ul &kp Z &kp M &kp K>; - }; - }; -}; -``` - -It may be helpful to open this page twice and leave one copy open at this example. -Note also that Devicetree uses C-style comments, i.e. `// ...` for line comments and `/* ... */` for block comments. - -## Structure - -A devicetree node has the general structure (parts within `[]` being optional) - -```dts -[label:] name { - [properties] - [child nodes] -}; -``` - -The root node of the devicetree always has the name `/`, i.e. is written as - -```dts - / { - [child nodes] - }; -``` - -It is also the _only_ node which has the `/` character as a name. See the devicetree spec for permitted characters for node names. - -After various preprocessing steps, all contents of the devicetree will be found within/under the root node. -If one node is found within another node, we say that the first node is a _child node_ of the second one. Similarly, one can also refer to a _grandchild node_, etc. - -In the running example, `behaviors` and `keymap` are child nodes of the root node. `space_underscore` and `default_layer` are child nodes of `behaviors` and `keymap` respectively, making them both grandchild nodes of the root node. - -### Properties - -What properties a node may have varies drastically. Of the standard properties, there are two which are of particularly relevant to users and designers: `compatible` and `status`. Additional standard properties may be found in the [devicetree spec](https://github.com/devicetree-org/devicetree-specification/releases). - -#### Property types - -These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/4.1.0/build/dts/bindings.html) provides more detailed information and a full list of types. - -##### bool - -True or false. To set the property to true, list it with no value. To set it to false, do not list it. - -Example: `property;` - -If a property has already been set to true and you need to override it to false, use the following command to delete the existing property: - -```dts -/delete-property/ the-property-name; -``` - -##### int - -A single integer surrounded by angle brackets. Also supports mathematical expressions. - -Example: `property = <42>;` - -##### string - -Text surrounded by double quotes. - -Example: `property = "foo";` - -##### array - -A list of integers surrounded by angle brackets and separated with spaces. Mathematical expressions can be used but must be surrounded by parenthesis. - -Example: `property = <1 2 3 4>;` - -Values can also be split into multiple blocks, e.g. `property = <1 2>, <3 4>;` - -##### phandle - -A single node reference surrounded by angle brackets. Phandles will be explained in more detail in a [later section](#labels-and-phandles). - -Example: `property = <&label>` - -##### phandles - -A list of node references surrounded by angle brackets. Phandles will be explained in more detail in a [later section](#labels-and-phandles). - -Example: `property = <&label1 &label2 &label3>` - -##### phandle array - -A list of node references and possibly numbers to associate with the node. Mathematical expressions can be used but must be surrounded by parenthesis. Phandles will be explained in more detail in a [later section](#labels-and-phandles). - -Example: `property = <&none &mo 1>;` - -Values can also be split into multiple blocks, e.g. `property = <&none>, <&mo 1>;` - -See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/4.1.0/build/dts/bindings.html) -for more details on how parameters are associated with nodes. - -##### GPIO array - -This is just a phandle array. The documentation lists this as a different type to make it clear which properties expect an array of GPIOs. - -Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/gpio.html) for a full list of flags. Phandles and labels will be explained in more detail in a [later section](#labels-and-phandles). - -Example: - -```dts -some-gpios = - <&gpio0 0 GPIO_ACTIVE_HIGH>, - <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; -``` - -##### path - -A path to a node, either as a node reference or as a string. This will be explained in more detail in a [later section](#labels-and-phandles). - -Examples: - -```dts -property = &label; -property = "/path/to/some/node"; -``` - -#### Compatible - -The most important property that a node has is generally the `compatible` property. This property is used to map code to nodes. There are some special cases, such as the node named `chosen`, where the node name is used rather than a `compatible` property. - -In the running example, `space_underscore` has the property `compatible = "zmk,behavior-mod-morph";`. The [ZMK's mod-morph behavior code](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_mod_morph.c#L7) acts on all nodes with `compatible` set to this value. The [ZMK keymap code](https://github.com/zmkfirmware/zmk/blob/main/app/src/keymap.c#L29) acts similarly for `compatible = "zmk,keymap";`. - -The `compatible` property is also used to identify what additional properties a node may have. Any properties which are not one of the standard properties must be listed in a "devicetree bindings" file. These files will sometimes also include some additional information on the usage of the node. - -ZMK keeps all of its devicetree bindings under the [`app/dts/bindings` directory](https://github.com/zmkfirmware/zmk/tree/main/app/dts/bindings). - -The bindings file for `compatible = "zmk,behavior-mod-morph";` is [`app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml`](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-mod-morph.yaml). - -```dts title="zmk,behavior-mod-morph.yaml" -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Mod Morph Behavior - -compatible: "zmk,behavior-mod-morph" - -include: zero_param.yaml - -properties: - bindings: - type: phandle-array - required: true - mods: - type: int - required: true - keep-mods: - type: int - required: false -``` - -The properties the node can have are listed under `properties`. Some additional properties are imported from [zero_param.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zero_param.yaml). Bindings files are **the authority** on node properties, with our [documentation of said properties](https://zmk.dev/docs/config/behaviors#devicetree-7) sometimes omitting things like the `#binding-cells` property (imported from the previously mentioned file, describing the number of parameters that the behavior accepts). A full description of the bindings file syntax can be found in [Zephyr's documentation](https://docs.zephyrproject.org/4.1.0/build/dts/bindings-syntax.html). - -Note that binding files can also specify properties for children, like the [`zmk,keymap.yaml` bindings file](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ckeymap.yaml) specifying properties for layers in the keymap. - -#### Status - -The `status` property simply describes the status of a node. For ZMK users and designers, there are only two relevant values that this could be set to: - -- `status = "disabled";` The node is disabled. Code should not take effect or make use of the node, but it can still be referenced by other parts of the devicetree. -- `status = "okay";` The default setting when not explicitly stated. The node is treated as "active". This property is generally only explicitly stated when overwriting a `status = "disabled";`. - -How this property is used in practice will become more clear after the [devicetree preprocessing](#devicetree-preprocessing) section later on. - -### Labels and Phandles - -In addition to _names_, nodes can also have _labels_. For the ZMK user/designer, labels are arguably more important than node names. Whereas node names are used within code to access individual nodes, labels are used to reference other nodes from within devicetree itself. Such a reference is called a _phandle_, and can be thought of as similar to a pointer in C. - -In the running example, `spc_ul` is the label given to the node `space_underscore`. The `bindings` property of the `default_layer` node is a "phandle-array" - an array of references to other nodes[^1]. Its first element is `&spc_ul` - a phandle to the node with label `spc_ul`, i.e. `space_underscore`. `&kp` is another example of a phandle. It points to a node [defined as below](https://github.com/zmkfirmware/zmk/blob/main/app/dts/behaviors/key_press.dtsi): - -```dts -/ { - behaviors { - kp: key_press { - compatible = "zmk,behavior-key-press"; - #binding-cells = <1>; - display-name = "Key Press"; - }; - }; -}; -``` - -This node is imported from a different file -- imports will be discussed later on. The `&kp` phandles found in the running example also show the concept of _parameters_ being passed to phandles. In this case, `Z`, `M`, and `K` are passed as parameters. - -When ZMK needs to trigger a behavior found at a location in the keymap's `binding` property, it uses the phandle to identify the behavior node which needs to be called. It then executes the code determined by the `compatible` property of said node, passing in parameters while doing so[^2]. Depending on the behavior, another behavior phandle may need to be triggered, in which case the same process is used to identify the node and thus the parts of code which need to be executed. - -Essentially, each layer in a keymap consists of an array of phandles pointing to various behaviors (alongside parameters) that were defined elsewhere. If you do not need to define the behavior node yourself, that just means ZMK has already defined it for you. - -[^1]: A phandle array by definition also includes metadata, i.e. parameters. Strictly speaking, a list of phandles without metadata has type `phandles` rather than `phandle-array`. A property with a single phandle has type `phandle`. - -[^2]: The number of parameters passed to the behavior code (and skipped over to find the next behavior phandle) is determined by the `#binding-cells` property mentioned above. - -## Devicetree Preprocessing - -Much of the complexity in `dts` files comes from preprocessing. The resulting devicetree after all preprocessing has finished [can be inspected](../troubleshooting/building-issues.md#devicetree-related-issues) for both GitHub Actions and local builds. For reasons that will make more sense later, your keymap and most of your customisations will be found near the bottom of the file. - -Preprocessing comes from two sources: - -1. The [C preprocessor](https://gcc.gnu.org/onlinedocs/cpp/) can be used within Devicetree Source (`dts`) files. -2. Devicetree has its own system for merging together, overwriting, and even deleting nodes and properties. - -### C Preprocessor - -An introduction to the C preprocessor is beyond the scope of this page. There are plenty of resources online for the unfamiliar reader to refer to. - -However, some specific methods of how the C preprocessor is used in ZMK's devicetree files can be useful, to better understand how everything fits together. - -The C preprocessor is used to import some nodes and other preprocessor definitions from other files. The lines - -```dts -#include -#include -``` - -which are found at the top of the running example import the default behavior node definitions for ZMK, along with a list of preprocessor definitions. The parameters `Z`, `M`, and `K` (passed to the `&kp` phandle in the running example) are actually C preprocessor defines. For example, during preprocessing references to `Z` get turned into the number `0x07001D`, which is the number that gets passed to the ZMK host device (e.g. your computer) for it to then re-interpret as the letter "z". - -The C preprocessor often gets leveraged by ZMK power users to reduce repetition in their keymap files. An example of this is the [macro-behavior convenience macro](../keymaps/behaviors/macros.md#convenience-c-macro). ZMK designers will also come across the `RC` macro used for matrix transformations, and make use of convenience defines such as `GPIO_ACTIVE_HIGH`. - -### Devicetree Processing - -A devicetree is almost always constructed from multiple files. These files are generally speaking: - -- `.dtsi` files, which exist exclusively to be included via the C preprocessor (their contents get "pasted" at the location of the `#include` command) and are not used by the build sytem otherwise. -- A `.dts` file, which forms the "base" of the devicetree. A single one of these is always present when a devicetree is constructed. For ZMK, the `.dts` file contains the sections of the devicetree describing the [_board_](hardware-integration/index.mdx#what-is-a-board). This includes importing a number of `.dtsi` files describing the specific SoC that the board uses. -- Any number of `.overlay` files. These files can come from various sources, such as [shields](hardware-integration/index.mdx#what-is-a-shield) or [snippets](https://docs.zephyrproject.org/4.1.0/build/snippets/index.html). An overlay is applied to a `.dts` file by appending its contents to the end of the `.dts` file, i.e. it is placed at the bottom of the file. Multiple overlays are applied by doing so repeatedly in a particular order. Without going into the details of the exact order in which overlays are applied, it is enough to know that if you specify e.g. `shield: corne_left nice_view_adapter nice_view` in your `build.yaml`, then the overlays are applied left to right. -- A single `.keymap` file. This file being included is ZMK-specific, and is treated as the "final" `.overlay` file, appended after all other overlays. - -#### Merging and overwriting nodes - -When a node appears multiple times in the devicetree (after the files are imported and merged together), it gets merged into a single node as a preprocessing step. For example: - -```dts -/ { - mn_ex: my_example_node { - property1 = <0>; - property2 = <2>; - }; -}; - -/ { - my_example_node { - property2 = <1>; - property3 = <4>; - }; - - example2 { - property; - }; -}; -``` - -The second appearance of `my_example_node` has priority, thus its `property2` value will overwrite the first appearance. The two root nodes also get merged in the process. The resulting tree after processing would be - -```dts -/ { - mn_ex: my_example_node { - property1 = <0>; - property2 = <1>; - property3 = <4>; - }; - - example2 { - property; - }; -}; -``` - -Labels do not get overwritten; a node can have multiple labels. Phandles can also be used to overwrite or add properties: - -```dts -&mn_ex { - property4 = <2>; -}; -``` - -The phandle approach is the recommended one, as one does not need to know the exact names of all the parent nodes with this approach. Crucially, when using phandles to overwrite or add properties, **the phandle must not be located within the root node**. It is instead placed outside of the tree entirely. - -#### Special devicetree directives - -Devicetree has some special directives that affect the tree. Relevant ones are: - -- Nodes can be deleted with the /delete-node/ directive: `/delete-node/ &node_label;` outside of the root node. -- Properties can be deleted with the /delete-property/ directive: `/delete-property/ node-property;` inside the relevant node. -- `/omit-if-no-ref/` causes a node to be omitted from the resulting devicetree if there are no references/phandles to the node: `/omit-if-no-ref/ &node_label;` diff --git a/docs/docs/development/contributing/documentation.md b/docs/docs/development/documentation.md similarity index 72% rename from docs/docs/development/contributing/documentation.md rename to docs/docs/development/documentation.md index 26ba14fe..ff45d80a 100644 --- a/docs/docs/development/contributing/documentation.md +++ b/docs/docs/development/documentation.md @@ -3,15 +3,9 @@ title: Documentation sidebar_label: Documentation --- -:::danger -Before reading this section, it is **vital** that you read through our [clean room policy](clean-room.md). -::: - This document outlines how to test your documentation changes locally and prepare the changes for a pull request. -The documentation is written with [Docusaurus](https://docusaurus.io/). The ZMK source code has all of the necessary Docusaurus dependencies included, but referencing their documentation can be helpful at times. - -The website is built using the latest LTS version of node, which is available at . +The documentation is written with [Docusaurus](https://docusaurus.io/). The ZMK source code has all of the necessary Docusaurus dependencies included but referencing their documentation can be helpful at times. The general process for updating the ZMK documentation is: @@ -20,6 +14,14 @@ The general process for updating the ZMK documentation is: 3. Ensure the sources are formatted properly and linted 4. Create a Pull Request for review and inclusion into the ZMK sources +:::note +If you are working with the documentation from within VS Code+Docker please be aware the documentation will not be auto-generated when making changes while the server is running. You'll need to restart the server when saving changes to the documentation. +::: + +:::note +You will need `Node.js` and `npm` installed to update the documentation. If you're using the ZMK dev container (Docker) the necessary dependencies are already installed. Otherwise, you must install these dependencies yourself. Since `Node.js` packages in Linux distributions tend to be outdated, it's recommended to install the current version from a repository like [NodeSource](https://github.com/nodesource/distributions) to avoid build errors. +::: + ## Testing Documentation Updates Locally To verify documentation updates locally, follow the following procedure. The `npm` commands and first step will need to be run from a terminal. @@ -46,9 +48,9 @@ The check commands can be run with the following procedure in a terminal that's 3. Run `npm run lint` 4. Run `npm run build` +:::warning If any of the above steps throw an error, they need to be addressed and all of the checks re-run prior to submitting a pull request. - -The documentation uses American English spelling and grammar conventions. Title case is used for the first three heading levels, with sentence case used beyond that. Please make sure your changes conform to these conventions. +::: ## Submitting a Pull Request diff --git a/docs/docs/development/events.md b/docs/docs/development/events.md deleted file mode 100644 index e7de85f5..00000000 --- a/docs/docs/development/events.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: ZMK Events -sidebar_label: ZMK Events ---- - -ZMK makes use of events to decouple individual components such as behaviors and peripherals from the core functionality. For this purpose, ZMK has implemented its own event manager. This page is a (brief) overview of the functionality and methods exposed by the event manager, documenting its API. Its purpose is to aid module developers and contributors, such as for the development of [new behaviors](./new-behavior.mdx) or [new features](./module-creation.md). There is no value in reading this page as an end-user. - -To see what events exist and what data they contain, it is best to view the corresponding [event header files](https://github.com/zmkfirmware/zmk/tree/main/app/include/zmk/events) directly. Including the event_manager header via `#include ` is required for any interaction with the event system. - -## Generic Events - -The generic event type is `struct zmk_event_t`. This struct looks like this: - -```c -typedef struct { - const struct zmk_event_type *event; - uint8_t last_listener_index; -} zmk_event_t; -``` - -In memory, the struct for a specific raised event `struct zmk_specific_thing_happened_event` **always** consists of a `zmk_event_t` struct **followed immediately afterwards** by the struct containing the data for the actual event. - -```c -struct zmk_specific_thing_happened_event { - zmk_event_t header; - struct zmk_specific_thing_happened data; -}; -``` - -The contents of `header.event` allows us to identify which type a particular event actually is, so that we may safely access its data in `data`. This is handled by the following function, which allows us to obtain the underlying data from a generic event: - -```c -struct zmk_specific_thing_happened *as_specific_thing_happened(const zmk_event_t *eh); -``` - -This method takes in a pointer to a `zmk_event_t` (which is actually a pointer to a specific event, such as `zmk_specific_thing_happened_event`), and will return the underlying `zmk_specific_thing_happened` data struct if the `zmk_event_t` header indicates that the generic event pointer is indeed a pointer to a `zmk_specific_thing_happened_event`. If the type of the event does not match the function, then the function will return `NULL`. By convention, `zmk_event_t` pointer arguments are named `eh`, short for "event header". - -This method will exist for every type of event, so for `zmk_layer_state_changed` we have `as_zmk_layer_state_changed`, etc. It is generated by a macro as part of the event declaration. - -## Subscribing To Events - -### Subscription and Listener - -To subscribe to any events, you will first need to inform the event manager that you wish to add a new listener. -This is done by calling the `ZMK_LISTENER` macro: - -```c -ZMK_LISTENER(combo, behavior_combo_listener); -``` - -This macro takes two parameters: - -1. (`combo` in the example) This gives a name to the listener, for the event manager to refer back to it. -2. (`behavior_combo_listener` in the example) This is a [callback]() that will be called whenever **any** event that the listener subscribes to occurs (if it is not handled by another listener with a higher priority). By convention, the callback should have the suffix `_listener`. - -Once you have a listener set up, you can subscribe to individual events by calling the `ZMK_SUBSCRIPTION` macro: - -```c -ZMK_SUBSCRIPTION(combo, zmk_keycode_state_changed); -``` - -The first parameter is the name of the listener created with `ZMK_LISTENER`, while the second is the name of the _struct_ that defines the event's data, which was declared in the corresponding header file. By convention the header file for an event will be named `specific_thing_happened`, with the struct named `zmk_specific_thing_happened`. - -Of course, you will also need to import the corresponding event header at the top of your file. - -### Listener Callback - -The listener will be passed a raised `zmk_event_t` pointer (as described previously) as an argument, and should have `int` as its return type. - -The listener should return one of three values (which are of type `int`) back to the event manager: - -- `ZMK_EV_EVENT_BUBBLE`: Keep propagating the event `struct` to the next listener. -- `ZMK_EV_EVENT_HANDLED`: Stop propagating the event `struct` to the next listener. The event manager still owns the `struct`'s memory, so it will be `free`d automatically. Do **not** free the memory in this function. -- `ZMK_EV_EVENT_CAPTURED`: Stop propagating the event `struct` to the next listener. The event `struct`'s memory is now owned by your code, so the event manager will not free the event `struct` memory. Make sure your code will release or free the event at some point in the future. (Use the `ZMK_EVENT_*` macros described [below](#raising-events).) - -If an error occurs during the listener call, it should return a negative value indicating the appropriate error code. - -As mentioned previously, the same callback will be called when any event that is subscribed to occurs. To obtain the underlying event from the generic event passed to the listener, the previously described `as_zmk_specific_thing_happened` function should be used: - -```c -int behavior_hold_tap_listener(const zmk_event_t *eh) { - if (as_zmk_position_state_changed(eh) != NULL) { - // it is a position_state_changed event, handle it with my_position_state_handler - return my_position_state_handler(eh); - } else if (as_zmk_keycode_state_changed(eh) != NULL) { - // it is a keycode_state_changed event, handle it with my_keycode_state_handler - return my_keycode_state_handler(eh); - } - return ZMK_EV_EVENT_BUBBLE; -} -``` - -The priority of the listeners is determined by the order in which the linker links the files. Within ZMK, this is the order of the corresponding files in `CMakeLists.txt`. External modules targeting `app` are linked prior to any files within ZMK itself, making them the highest priority. It is thus the module maintainer's responsibility to both ensure that their module does not cause issues by being first in the listener queue. For example, [hold-tap](../keymaps/behaviors/hold-tap.mdx) is the first listener to `position_state_changed`, and may behave inconsistently if a behavior defined in a module listens to `position_state_changed` and invokes a `hold-tap` (e.g. by calling `zmk_behavior_invoke_event` with a `hold-tap` as the binding). - -In addition, because modules listen to the events first, they should _never_ capture/handle an event defined in ZMK without releasing it later. Unless it is unavoidable, it is recommended to bubble events whenever possible. - -When considering multiple modules, priority is determined by the order in which the modules are present in the user's `west.yml`. Hence there should be no order dependencies between modules, only within a module. - -## Raising Events - -There are several different ways to raise events, with slight differences between them. - -- `int raise_zmk_specific_thing_happened(struct zmk_specific_thing_happened event)`: This function will take an event data structure, add a header to it, and then start handling the event with the first registered event listener. - -The following macros can also be used for advanced use cases. These will each take in an event `ev` which already consists of the header & data combination, i.e. `ev` has the type `struct zmk_specific_thing_happened_event`. - -- `ZMK_EVENT_RAISE(ev)`: Start handling this event (`ev`) with the first registered event listener. -- `ZMK_EVENT_RAISE_AFTER(ev, mod)`: Start handling this event (`ev`) after the event is captured by the named [event listener](#subscription-and-listener) (`mod`). The named event listener will be skipped as well. -- `ZMK_EVENT_RAISE_AT(ev, mod)`: Start handling this event (`ev`) at the named [event listener](#subscription-and-listener) (`mod`). The named event listener is the first handler to be invoked. -- `ZMK_EVENT_RELEASE(ev)`: Continue handling this event (`ev`) at the next registered event listener. -- `ZMK_EVENT_FREE(ev)`: Free the memory associated with the event (`ev`). - -Optionally, some events may also declare an extra function similar to `raise_zmk_specific_thing_happened` named `raise_specific_thing_happened`. This function will take in some or all of the components of the `zmk_specific_thing_happened` struct, and then create the struct (perhaps with some additional data obtained from elsewhere) before calling `raise_zmk_specific_thing_happened`. For example: - -```c -static inline int raise_layer_state_changed(uint8_t layer, bool state) { - return raise_zmk_layer_state_changed( - (struct zmk_layer_state_changed){ - .layer = layer, - .state = state, - .timestamp = k_uptime_get() - } - ); -} -``` - -## Creating New Events - -### Header File - -Your event's header file should have four things: - -- A copyright comment -- Any required header includes (along with `#pragma once`) -- The event's data struct -- The macro `ZMK_EVENT_DECLARE`, called with the name of your event's data struct. - -For example: - -```c -/* -- Copyright (c) 2021 The ZMK Contributors -- -- SPDX-License-Identifier: MIT -*/ - -#pragma once - -#include - -#include -#include - -struct zmk_endpoint_changed { - struct zmk_endpoint_instance endpoint; -}; - -ZMK_EVENT_DECLARE(zmk_endpoint_changed); -``` - -### Code File - -Your event's code file merely needs three things: - -- A copyright comment -- Any required header files (including that of your event) -- The macro `ZMK_EVENT_IMPL`, called with the name of your event's data struct. - -```c -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include - -ZMK_EVENT_IMPL(zmk_endpoint_changed); -``` diff --git a/docs/docs/hardware-integration/hardware-metadata-files.md b/docs/docs/development/hardware-metadata-files.md similarity index 96% rename from docs/docs/hardware-integration/hardware-metadata-files.md rename to docs/docs/development/hardware-metadata-files.md index 62fdb348..46fad411 100644 --- a/docs/docs/hardware-integration/hardware-metadata-files.md +++ b/docs/docs/development/hardware-metadata-files.md @@ -6,7 +6,7 @@ title: Hardware Metadata Files ZMK makes use of an additional metadata YAML file for all boards and shields to provide high level information about the hardware to be incorporated into setup scripts/utilities, website hardware list, etc. -The naming convention for metadata files is `{item_id}.zmk.yml`, where the `item_id` is the board/shield identifier, including version information but excluding any optional split `_left`/`_right` suffix, e.g. `corne.zmk.yml` or `nrfmicro_nrf52840.zmk.yml`. +The naming convention for metadata files is `{item_id}.zmk.yml`, where the `item_id` is the board/shield identifier, including version information but excluding any optional split `_left`/`_right` suffix, e.g. `corne.zmk.yml` or `nrfmicro_11.zmk.yml`. ## Example File @@ -95,7 +95,6 @@ Boards and shields should document the sets of hardware features found on them u - `encoder` - Indicates the hardware contains one or more rotary encoders. - `underglow` - Indicates the hardware includes underglow LEDs. - `backlight` - Indicates the hardware includes backlight LEDs. -- `studio` - Indicates the keyboard is ready to use with [ZMK Studio](../features/studio.md). - `pointer` (future) - Used to indicate the hardware includes one or more pointer inputs, e.g. joystick, touchpad, or trackpoint. ### Siblings diff --git a/docs/docs/development/local-toolchain/ide-integration.mdx b/docs/docs/development/ide-integration.md similarity index 87% rename from docs/docs/development/local-toolchain/ide-integration.mdx rename to docs/docs/development/ide-integration.md index cee12f4b..f0403dbb 100644 --- a/docs/docs/development/local-toolchain/ide-integration.mdx +++ b/docs/docs/development/ide-integration.md @@ -3,6 +3,22 @@ title: IDE Integration sidebar_label: IDE Integration --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +export const OsTabs = (props) => ({props.children}); + ## Visual Studio Code Visual Studio Code needs to know some things about the project such as include @@ -19,7 +35,7 @@ terminal to the ZMK repository and run the following command: west config build.cmake-args -- -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ``` -Every [build](build-flash.mdx#building) will now update the database. You will +Every [build](build-flash.md#building) will now update the database. You will need to build once to create the database before code completion will work. We'll tell Visual Studio Code where to find the database in the next step. @@ -51,7 +67,7 @@ Change these options: If you are developing inside a Docker container, set the IntelliSense mode to `linux-gcc-arm` regardless of the host operating system. -#### Compiler path +#### Compiler Path Open VS Code's integrated terminal and run the following command: @@ -79,7 +95,7 @@ If you are building for an platform other than ARM, replace `/arm-zephyr-eabi/bi /home/marvin/.local/zephyr-sdk-0.15.2/riscv64-zephyr-elf/bin/riscv64-zephyr-elf-gcc ``` -#### Compiler commands path +#### Compiler Commands Path When building with all default options, the path to the compilation database file is `${workspaceFolder}/app/build/compile_commands.json` as shown in the table above, diff --git a/docs/docs/development/local-toolchain/build-flash.mdx b/docs/docs/development/local-toolchain/build-flash.mdx deleted file mode 100644 index a9572feb..00000000 --- a/docs/docs/development/local-toolchain/build-flash.mdx +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: Building and Flashing -sidebar_label: Building and Flashing ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -From here on, building and flashing ZMK should all be done from the `app/` -subdirectory of the ZMK checkout: - -```sh -cd app -``` - -:::warning -If this is not done, you will encounter errors such as: `ERROR: source directory -"." does not contain a CMakeLists.txt; is this really what you want to build?` -::: - -## Building - -Building a particular keyboard is done using the -[`west build`](https://docs.zephyrproject.org/4.1.0/develop/west/build-flash-debug.html#building-west-build) -command. Its usage slightly changes depending on if your build is for a keyboard -with an onboard MCU or one that uses an MCU board add-on. - - - - Keyboards with onboard MCU chips are simply treated as the - [board](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html) - as far as Zephyr™ is concerned. - - Given the following: - - - Keyboard: Planck (rev6) - - Keymap: default - - you can build ZMK with the following: - - ```sh - west build -b planck_rev6 - ``` - - - - ZMK treats keyboards that take an MCU addon board as - [shields](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html), - and treats the smaller MCU board as the true - [board](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html). - - Given the following: - - - MCU Board: Proton-C - - Keyboard PCB: kyria_left - - Keymap: default - - You can build ZMK with the following: - - ```sh - west build -b proton_c -- -DSHIELD=kyria_left - ``` - - - - -### CMake Arguments - -For creating a build system, the `west build` command uses -[CMake](https://cmake.org/). This allows for additional arguments to be added to -its invocations. - -This is done by adding `--` after the `west build` command and listing the CMake -arguments afterward. The previous section shows one example of this with -`-DSHIELD=kyria_left`. Another example use case is passing Kconfig flags: - -```sh -west build -b planck_rev6 -- -DCONFIG_ZMK_SLEEP=y -``` - -:::tip -Once the first generation of the build directory using one-time CMake arguments -is done, you can omit the CMake arguments and board selection, instead building -with the command: - -```sh -west build -d -``` - -::: - -You can also add permanent CMake arguments to `west build` by using the -[`west config`](https://docs.zephyrproject.org/4.1.0/develop/west/config.html#west-config-cmd) -command. These are invoked whenever a new build system is generated. To add -permanent arguments, set the `build.cmake-args` configuration option. - -```sh -west config build.cmake-args -- -DSHIELD=kyria_left -``` - -Multiple arguments are added by assigning a string to the configuration option: - -```sh -west config build.cmake-args \ - -- "-DSHIELD=kyria_left -DZMK_CONFIG=/absolute/path/to/zmk-config" -``` - -### Pristine Building - -When building for a new board and/or shield after having built one previously, you may need to enable the pristine build option. This option removes all existing files in the build directory before regenerating them, and can be enabled by adding either --pristine or -p to the command: - -```sh -west build -p -b nice_nano -- -DSHIELD=kyria_left -``` - -### Building For Split Keyboards - -:::note -For split keyboards, you will have to build and flash each side separately the first time you install ZMK. -::: - -By default, the `build` command outputs a single .uf2 file named `zmk.uf2` so building left and then right immediately after will overwrite your left firmware. In addition, you will need to pristine build each side to ensure the correct files are used. To avoid having to pristine build every time and separate the left and right build files, we recommend setting up separate build directories for each half. You can do this by using the `-d` parameter and first building left into `build/left`: - -```sh -west build -d build/left -b nice_nano -- -DSHIELD=kyria_left -``` - -and then building right into `build/right`: - -```sh -west build -d build/right -b nice_nano -- -DSHIELD=kyria_right -``` - -This produces `left` and `right` subfolders under the `build` directory and two separate .uf2 files. For future work on a specific half, use the `-d` parameter again to ensure you are building into the correct location. - -:::tip -Build times can be significantly reduced after the initial build by omitting all build arguments except the build directory, e.g. `west build -d build/left`. The additional options and intermediate build outputs from your initial build are cached and reused for unchanged files. -::: - -### Building With External Modules - -ZMK supports loading additional boards, shields, code, etc. from [external ZMK modules](../../features/modules.mdx), facilitating out-of-tree management and versioning independent of the ZMK repository. To build with any additional modules, use the `ZMK_EXTRA_MODULES` define added to your `west build` command. - -For instance, building with the `my-vendor-keebs-module` checked out to your documents directory, you would build like: - -``` -west build -b nice_nano -- -DSHIELD=vendor_shield -DZMK_EXTRA_MODULES="C:/Users/myUser/Documents/my-vendor-keebs-module" -``` - -When adding multiple modules, make sure they are separated by a semicolon, e.g.: - -``` -west build -b nice_nano -- -DSHIELD=vendor_shield -DZMK_EXTRA_MODULES="C:/Users/myUser/Documents/my-vendor-keebs-module;C:/Users/myUser/Documents/my-other-keebs-module" -``` - -### Building from `zmk-config` Folder - -Instead of building .uf2 files using the default keymap and config files, you -can build using files from your [`zmk-config` folder](../../user-setup.mdx#config-repo-setup) -by adding `-DZMK_CONFIG="C:/the/absolute/path/config"` to your `west build` -command. **Notice that this path should point to the folder labeled `config` -within your `zmk-config` folder.** - -For instance, building kyria firmware from a user `myUser`'s `zmk-config` folder -on Windows may look something like this: - -```sh -west build -b nice_nano -- -DSHIELD=kyria_left \ - -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config" -``` - -:::warning -If your config is also a [module](../../features/modules.mdx), then you should -also add the root (the folder in which the `zephyr` folder is found) of your -`zmk-config` as an [external module to build with](#building-with-external-modules). -::: - -## Flashing - -The above build commands generate a UF2 file in `build/zephyr` (or -`build/left|right/zephyr` if you followed the instructions for splits) and is by -default named `zmk.uf2`. If your board supports USB Flashing Format (UF2), copy -that file onto the root of the USB mass storage device for your board. The -controller should flash your built firmware, unmount the USB storage device and -automatically restart once flashing is complete. - -Alternatively, if your board supports flashing and you're not developing from -within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on -your board and run the following command to flash: - -```sh -west flash -``` - -## Multi-CPU and Dual-Chip Bluetooth Boards - -Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/4.1.0/connectivity/bluetooth/bluetooth-arch.html) for more details. - -The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. - -### nRF5340 - -To build and flash the firmware for the nRF5340 development kit's network core, run the following command from the root of the ZMK repo: - -```sh -cd zephyr/samples/bluetooth/hci_rpmsg -west build -b nrf5340dk_nrf5340_cpunet -west flash -``` - -You can then build and flash ZMK firmware using the normal steps described above. The network core's firmware only needs to be updated whenever ZMK upgrades to a new version of Zephyr. - -For a custom nRF5340-based board, you will need to define two Zephyr boards: one for the application core and one for the network core. The [nRF5340 DK's board definition](https://github.com/zephyrproject-rtos/zephyr/tree/main/boards/arm/nrf5340dk_nrf5340) can be used as reference. Replace `nrf5340dk_nrf5340_cpunet` with the name of your network core board. diff --git a/docs/docs/development/local-toolchain/setup/container.mdx b/docs/docs/development/local-toolchain/setup/container.mdx deleted file mode 100644 index 11b04a32..00000000 --- a/docs/docs/development/local-toolchain/setup/container.mdx +++ /dev/null @@ -1,268 +0,0 @@ ---- -title: Container -sidebar_label: Container ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -## Source Code - -First, you'll need to clone the ZMK source repository into your local file system if you haven't already. -Open a terminal and navigate to the folder on your local machine where you would like to place your `zmk` -directory, then run the following command: - -```sh -git clone https://github.com/zmkfirmware/zmk.git -``` - -## Installing Development Tools - - - - :::note - This approach is documented for - [VS Code](https://github.com/microsoft/vscode) not - [Code OSS](https://github.com/microsoft/vscode/wiki/Differences-between-the-repository-and-Visual-Studio-Code). - ::: - - 1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) - for your operating system. - 2. Install [VS Code](https://code.visualstudio.com/). - 3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers). - - - - 1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) - for your operating system. - 2. Install the [Dev Container CLI](https://github.com/devcontainers/cli). - - - 1. Install Podman for your operating system: - - [Podman CLI](https://podman.io/docs/installation) - - [Podman Desktop](https://podman-desktop.io/docs/installation) - - :::warning - Please follow the installation instructions carefully. If you do not have - a working **Podman machine**, executing the commands below won't be - possible. - ::: - - - - -## Creating Volumes - -To build from a `zmk-config` or with additional modules, it is necessary to -first make them available by creating volumes. - - - - When setting up the container, either using - [VS Code](https://code.visualstudio.com/) or the - [Dev Container CLI](https://github.com/devcontainers/cli), the volumes will - automatically be mounted. - - #### Zmk-Config - ```sh - docker volume create --driver local -o o=bind -o type=none \ - -o device="/absolute/path/to/zmk-config/" zmk-config - ``` - - #### Modules - ```sh - docker volume create --driver local -o o=bind -o type=none \ - -o device="/absolute/path/to/zmk-modules/parent/" zmk-modules - ``` - - - - #### Zmk-Config - ```sh - podman volume create --driver local -o o=bind -o type=none \ - -o device="/absolute/path/to/zmk-config/" zmk-config - ``` - - #### Modules - ```sh - podman volume create --driver local -o o=bind -o type=none \ - -o device="/absolute/path/to/zmk-modules/parent/" zmk-modules - ``` - - - - -Once this is done, you can refer to the `zmk-config` with -`/workspaces/zmk-config` and `/workspaces/zmk-modules` to the modules instead of -using their full path like it is shown in the -[build commands](../build-flash.mdx), since these are the locations they were -mounted to in the container. - -:::note -When changing the configuration or modules directory, new volumes have to be -created and mounted. Accordingly, you first have to remove the old ones. - - - - - ```sh - docker ps # List containers - docker stop "" # Stop the container - docker rm "" # Remove the container - - docker volume ls # List volumes - docker volume rm "" # Remove volume - ``` - - - - - ```sh - podman ps # List containers - podman stop "" # Stop the container - podman rm "" # Remove the container - - podman volume ls # List volumes - podman volume rm "" # Remove volume - ``` - - - -::: - -## Initialize Container - - - - Open the `zmk` checkout directory in VS Code. The repository includes a - configuration for containerized development. Therefore, an alert will pop - up: - - ![VS Code Dev Container Configuration Alert](../../../assets/dev-setup/vscode_devcontainer.png) - - Click `Reopen in Container` to reopen the VS Code with the running - container. If the alert fails to pop up or you accidentally close it, you - can perform the same action by pressing the following keys based on your - operating system and selecting `Remote: Show Remote Menu`: - - - **Windows/Linux**: `Ctrl + Shift + P` - - **MacOs**: `Cmd + Shift + P` - - The first time you do this on your machine, it will pull down the Docker - image from the registry and build the container. **Subsequent launches are - much faster!** - - - - First, make sure that the - [Dev Container CLI](https://github.com/devcontainers/cli) is installed by - running: - - ```sh - devcontainer --version - ``` - - To be able to start the [Dev Container](https://containers.dev/), the - [Dev Container CLI](https://github.com/devcontainers/cli) has to know where - the `devcontainer.json` is located. This can be done using the - `--workspace-folder` option: - - ```sh - devcontainer up --workspace-folder "/absolute/path/to/zmk" - ``` - - The first time you do this on your machine, it will pull down the Docker - image from the registry and build the container. **Subsequent launches are - much faster!** - - Once the container is running, you can connect to it by using its container - ID. This allows you to execute commands inside the container: - - ```sh - docker ps # List containers - docker exec -w /workspaces/zmk -it /bin/bash # Connect - ``` - - - - First, make sure that Podman is installed by running: - - ```sh - podman --version - ``` - - Since Podman is largely compatible with Docker, it is possible to use the - Dockerfile provided for use with Dev Containers for building a container - image. - - ```sh - podman build -t -f Dockerfile - ``` - - Once this is done, the container can be started with the `podman run` - command. Depending on which volumes you are using, you might have to remove - mounting options. - - ```sh - podman run -it --rm \ - --security-opt label=disable \ - --workdir /workspaces/zmk \ - -v /path/to/zmk:/workspaces/zmk \ - -v /path/to/zmk-config:/workspaces/zmk-config \ # Removeable - -v /path/to/zmk-modules:/workspaces/zmk-modules \ # Removeable - -p 3000:3000 \ - /bin/bash - ``` - - - - -## Configure Zephyr Workspace - -:::caution -The following step and any future [build commands](../build-flash.mdx) must be -executed from the command line _inside_ the container. -::: - -```sh -west init -l app/ # Initialization -west update # Update modules -``` - -If you are using a Docker-based approach, you have to restart the container at -this point. Stopping it is possible with these commands. - -```sh -docker ps # List containers -docker stop "" # Stop the container -``` diff --git a/docs/docs/development/local-toolchain/setup/index.md b/docs/docs/development/local-toolchain/setup/index.md deleted file mode 100644 index f56a0f82..00000000 --- a/docs/docs/development/local-toolchain/setup/index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Getting Started -sidebar_label: Getting Started ---- - -:::tip -We recommend reading through the setup process before following it step by step, -to ensure that you are happy with installing the required dependencies. -::: - -## Environment Setup - -There are two ways to set up the ZMK development environment: - -- [Docker or Podman](container.mdx): \ - A self-contained development environment. It uses the same - [Docker image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) - for local development. Beyond the benefits of - [dev/prod parity](https://12factor.net/dev-prod-parity), this approach may be - easier to set up for some operating systems. No toolchain or dependencies are - necessary when using a container; the image has the toolchain installed and - set up to use. - -- [Native](native.mdx): \ - This uses your operating system directly. Usually runs slightly faster than - the container approach, and can be preferable for users who already have the - dependencies on their system. - -Please see the [container](container.mdx) or [native](native.mdx) instructions -to continue the setup. diff --git a/docs/docs/development/local-toolchain/setup/native.mdx b/docs/docs/development/local-toolchain/setup/native.mdx deleted file mode 100644 index 3c82a60e..00000000 --- a/docs/docs/development/local-toolchain/setup/native.mdx +++ /dev/null @@ -1,361 +0,0 @@ ---- -title: Native Setup -sidebar_label: Native ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -export const OsTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -export const OsNoteTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -export const EnvTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -export const WinTermTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -## 1. Install Zephyr Dependencies - -Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html) and follow the instructions under these sections: - -- [Select and Update OS](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#select-and-update-os) -- [Install Dependencies](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#install-dependencies) - -:::info -Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/4.1.0/develop/getting_started/installation_linux.html) page may be of use for users of Linux distributions which are not based on Ubuntu. -::: - -:::warning -Some optional Zephyr modules, like `libmetal`, are not compatible with CMake v4, so we recommend installing the latest CMake v3 release when installing the Zephyr dependencies. -::: - -## 2. Source Code - -Next, you'll need to clone the ZMK source repository if you haven't already. Open a terminal and navigate to the folder you would like to place your `zmk` directory in, then run the following command: - -```sh -git clone https://github.com/zmkfirmware/zmk.git -``` - -Then step into the repository. - -```sh -cd zmk -``` - -## 3. Get Zephyr and install Python dependencies - -:::note -These steps are very similar to Zephyr's [Get Zephyr and install Python dependencies](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#get-zephyr-and-install-python-dependencies) instructions, but specialized for ZMK. -::: - - - - - - -1. Use `apt` to install Python `venv` package: - -```sh -sudo apt install python3-venv -``` - -2. Create a new virtual environment and activate it: - -```sh -python3 -m venv .venv -source .venv/bin/activate -``` - - - - -1. Create a new virtual environment: - -```sh -python -m venv .venv -``` - -2. Activate the virtual environment: - - - - -```sh -.venv\Scripts\activate.bat -``` - - - - - -```powershell -.venv\Scripts\Activate.ps1 -``` - - - - - - - - -1. Create a new virtual environment: - -```sh -python3 -m venv .venv -``` - -2. Activate the virtual environment: - -```sh -source .venv/bin/activate -``` - - - - -Once activated your shell will be prefixed with `(.venv)`. The virtual environment can be deactivated at any time by running `deactivate`. - -:::note -Remember to activate the virtual environment every time you start working. -::: - -4. Install west: - -```sh -pip install west -``` - -5. Initialize the application and update to fetch modules, including Zephyr: - -```sh -west init -l app/ -west update -``` - -:::tip -This step pulls down quite a bit of tooling, be patient! -::: - -6. Export a [Zephyr CMake package](https://docs.zephyrproject.org/4.1.0/build/zephyr_cmake_package.html#cmake-pkg). This allows CMake to automatically load boilerplate code required for building Zephyr applications. - -```sh -west zephyr-export -``` - -7. Install the additional Zephyr dependencies using `west`: - -```sh -west packages pip --install -``` - - - - - -1. Install `west`: - -```sh -pip3 install --user -U west -``` - -:::note -You need `~/.local/bin` to be on your `PATH` environment variable; verify that it is by running - -```sh -west --version -``` - -If this prints an error rather than a `west` version number, then add `~/.local/bin` to your `PATH`: - -```sh -echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc -source ~/.bashrc -``` - -::: - - - - -1. Install `west`: - -```sh -pip install -U west -``` - -:::note -You need the Python scripts directory to be on your PATH environment variable; verify that it is by running - -```sh -west --version -``` - -If this prints an error rather than a `west` version number, then add said directory to your `PATH` with PowerShell: - -```powershell -$Scripts = python -c "import sysconfig; print(sysconfig.get_path('scripts'))" -$Path = [Environment]::GetEnvironmentVariable('PATH', 'User') -[Environment]::SetEnvironmentVariable('PATH', "$Path;$Scripts", 'User') -$env:PATH += ";$Scripts" -``` - -::: - - - - - -1. Install `west`: - -```sh -pip3 install -U west -``` - - - - -2. Initialize the application and update to fetch modules, including Zephyr: - -```sh -west init -l app/ -west update -``` - -:::tip -This step pulls down quite a bit of tooling, be patient! -::: - -3. Export a [Zephyr CMake package](https://docs.zephyrproject.org/4.1.0/build/zephyr_cmake_package.html#cmake-pkg). This allows CMake to automatically load boilerplate code required for building Zephyr applications. - -```sh -west zephyr-export -``` - - - - -4. Install the additional Zephyr dependencies using `west`: - -```sh -west packages pip --install -``` - - - - - -4. Install the additional Zephyr dependencies using `west`: - -```sh -west packages pip --install -``` - - - - -4. Install the additional Zephyr dependencies using `west`: - -```sh -west packages pip --install -``` - - - - - - -## 4. Install Zephyr SDK - -Return to Zephyr's Getting Started Guide and [Install Zephyr SDK](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#install-zephyr-sdk). - -### OS-Specific Notes - - - - `dfu-util` is required to flash devices that use DFU, but there is currently - no maintained package for it on Chocolatey. [QMK - Toolbox](https://github.com/qmk/qmk_toolbox) contains a working version of it - though. - - - -#### Install cross-compile toolchain - -Because Raspberry OS runs on the same architecture (but different ABI) as ARM keyboard MCUs, the operating system's installed [cross compilers](https://docs.zephyrproject.org/4.1.0/develop/toolchains/other_x_compilers.html) can be used to target the different ABI. Building for non-ARM MCUs has not been tested. - -First, the cross compiler should be installed: - -```sh -sudo apt install gcc-arm-none-eabi -``` - -Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/4.1.0/develop/env_vars.html#env-vars) needed to find the cross compiler. Create a file named `~/.zephyrrc` if it doesn't exist, and add these lines to it: - -```sh -export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile -export CROSS_COMPILE=/usr/bin/arm-none-eabi- -``` - - - - -Your setup is now complete. diff --git a/docs/docs/development/module-creation.md b/docs/docs/development/module-creation.md deleted file mode 100644 index f3d351d7..00000000 --- a/docs/docs/development/module-creation.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Module Creation -sidebar_label: ZMK Module Creation ---- - -[ZMK modules](../features/modules.mdx) are the recommended method of adding content to ZMK, whenever it is possible. This page will guide you through creating a module for ZMK. Distinction is made between modules used for different purposes: - -- Modules containing one or more keyboard-related definitions (boards, shields, interconnects, etc.) -- Modules containing behaviors & features -- Modules containing drivers -- Modules containing other features, such as visual effects - -See also Zephyr's [page on modules](https://docs.zephyrproject.org/4.1.0/develop/modules.html). - -For open source hardware designs, it's recommended to **not** include the hardware design files in the ZMK module itself, since the module will be fetched by users during build and having design files in the module would likely make the module unnecessarily large and slow to fetch. - -## Module Setup - -ZMK has a template to make creating a module easier. Navigate to [the ZMK module template repository](https://github.com/zmkfirmware/zmk-module-template) and select "Use this template" followed by "Create a new repository" in the top right. - -The rest of this page will go through the contents of the template step by step, guiding you through the configuration of the module. - -:::tip -The [Unified ZMK Config Template](https://github.com/zmkfirmware/unified-zmk-config-template) is also a module, albeit one focused on keyboards. If you are making a module for a keyboard, you may find it useful to base the module off of the template and use GHA to help troubleshoot any errors. Later, you can extract the keyboard to a dedicated module or remove superfluous parts from your module with the help of the information on this page. -::: - -### Zephyr Module File - -This is the file that defines your module. Only when this file is configured correctly will your module function as expected. - -#### Name - -First, you will need to name your module. ZMK has a naming convention that you should follow: - -``` -zmk-- -``` - -Valid options for type are: - -| Type | Description | -| ----------- | --------------------------------------------------------------------------------------------------------------------- | -| `keyboard` | The module contains definitions for one or multiple keyboards, be they boards or shields. | -| `component` | The module contains definitions for one or multiple components, such as boards for shields to use. | -| `behavior` | The module contains a single behavior. | -| `driver` | The module contains a single driver. | -| `feature` | The module contains a single feature which doesn't fall under the other categories. | -| `vfx` | The module contains definitions for one or multiple visual effects, such as display customisations or RGB animations. | - -For each of these, you can use the singular or plural, i.e. `keyboard` and `keyboards` are both acceptable. Use your judgement to decide between the two. - -`` is your choice of name to describe the module. - -Note that your _module name_ does not have to be the same as your _repository name_. For example, if you have named your module `zmk-keyboards-corne`, you may for your own organisational purposes want to name the repository e.g. `zmk-corne-module`. - -Your module name goes in the `zephyr/module.yml` file: - -```yaml title="zephyr/module.yaml" -name: -``` - -#### Build options - -Next, you need to define the options to build your module. These also go into `zephyr/module.yml`, as children of the `build` property. Commonly used options are: - -- The `depends` child property is used to specify a list of modules which the module depends on. The dependencies are referred to by their [module name](#name). -- The `cmake` child property is used to identify a folder containing a `CMakeLists.txt` file that lists the CMake commands used to build source files. -- The `kconfig` child property is used to identify the `Kconfig` file that defines configuration settings used by the module. -- `settings` is a child property containing additional child properties, two of which are particularly relevant: - - `board_root` points to the parent directory of a `boards` directory, which contains additional board/shield definitions. - - `dts_root` points to the parent directory of a `dts` directory, which contains additional devicetree bindings. - - `snippet_root` points to the parent directory of a `snippets` directory, which contains [snippets](https://docs.zephyrproject.org/4.1.0/build/snippets/index.html). - -See the `zephyr/module.yml` found in the template for a usage example. - -### Dependencies - -If `zephyr/module.yml` has anything listed under `depends`, then you should also define a [west manifest](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html) file. While the `zephyr/module.yml` file defines _which_ modules your module depends on, the west manifest file defines _where_ said modules are found. This then allows automatic tooling to fetch the modules when building firmware. If `depends` is not present in `zephyr/module.yml`, then this file (named `west.yml` in the template) should be removed. - -It is recommended that you place the manifest file at the root of your module, though you can place it elsewhere. Be sure to note in your `README.md` that your module uses dependencies, so that users import these correctly. -Below is an example `west.yml` file for a user that would be using your module, with the necessary `import` field if the module has dependencies: - -```yaml title="west.yml" -manifest: - remotes: - - name: remote-name - url-base: https://github.com/remote-name - projects: - # Together with the above defined remote, this refers to a module located at - # https://github.com/remote-name/repository-name - - name: repository-name - remote: remote-name - # This points to a west manifest file in the remote module for further imports - import: west.yml -``` - -See the [modules feature page](../features/modules.mdx) for additional information on using west manifest files. - -### Informational Files - -Make sure to include a `README.md` file and a `LICENSE` file in your repository. - -### Predefined Files and Folders - -The repository comes with a number of files and folders already positioned for you to edit. The below table describes which files are most likely kept and which are most likely deleted, based on your module's type. Note that these aren't hard rules, merely the most common use case. - -| | `keyboard` | `component` | `behavior` | `driver` | `feature` | `vfx` | -| ---------------- | ---------- | ----------- | ---------- | -------- | --------- | ----- | -| `boards/` | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | -| `dts/` | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | -| `CMakeLists.txt` | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | -| `Kconfig` | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | -| `include/` | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | -| `src/` | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | -| `snippets/` | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | - -The below table reminds of the purpose of each of these files and folders, if you are not already familiar with them: - -| File or Folder | Description | -| ---------------- | ------------------------------------------------------------------------------------- | -| `boards/` | Folder containing definitions for boards, shields and interconnects | -| `dts/` | Folder containing devicetree bindings and includes with devicetree nodes (.dtsi) | -| `CMakeLists.txt` | CMake configuration to specify source files to build | -| `Kconfig` | Kconfig file for the module | -| `include/` | Folder for C header files | -| `src/` | Folder for C source files | -| `snippets/` | Folder for [snippets](https://docs.zephyrproject.org/4.1.0/build/snippets/index.html) | - -Note that the `include` and `src` folders are not mandated by the module system, and all of these can be positioned anywhere in your module's filetree if you adjust the `zephyr/module.yml` accordingly. The `west.yml` file is not commonly present in any of the types. - -Modules should expose all provided header files with an include path name beginning with the module-name, for example at `include/zmk__/
.h`. - -:::info -If your module requires adding drivers to existing subsystems in modules, you will need to use the `zephyr_library_amend()` CMake command, which requires you to have a specific directory structure. See [`zephyr/cmake/modules/extensions.cmake`](https://github.com/zephyrproject-rtos/zephyr/blob/main@%7B2025-Feb-15%7D/cmake/modules/extensions.cmake#L492) for the definition and some documentation in the comments, with an example in [`petejohanson/ec-support-zmk-module`](https://github.com/petejohanson/ec-support-zmk-module/tree/main/drivers/kscan). -::: - -## Examples - -Below are some examples of modules for different types. Unless under the `zmkfirmware` project, these are not endorsed officially and may not follow our conventions perfectly. For such reason, the modules chosen to be presented here may change with time. - -- Keyboard: -- Behavior: -- Driver: -- Feature: -- VFX: diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md new file mode 100644 index 00000000..aab056c1 --- /dev/null +++ b/docs/docs/development/new-behavior.md @@ -0,0 +1,479 @@ +--- +title: New Behavior +sidebar_label: New Behavior +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## Overview + +This document outlines how to develop a behavior for ZMK and prepare the changes for a pull request. + +Behaviors are assigned to key positions and determine what happens when they are pressed and released. They are implemented in Zephyr as "devices": they consist of a devicetree binding file, which specifies the properties of the behavior, and a driver written in C code. This allows for the ability to create unique instances of these behaviors in [keymaps](../features/keymaps.md) or devicetree-source-include files (`.dtsi`). While instances of behaviors stored in keymaps are created by end-users for their personal needs, the instances that live in the .dtsi files are stored and documented in ZMK directly, which removes the need for end-users to set up common use-cases of these behaviors in their personal keymaps. + +The general process for developing behaviors is: + +1. [Create the behavior](#creating-the-behavior) + 1. [Create the devicetree binding (`.yaml`)](#creating-the-devicetree-binding-yaml) + 1. [Create the driver (`.c`)](#creating-the-driver-c) + 1. [Update `app/CmakeLists.txt` to include the new driver](#updating-appcmakeliststxt-to-include-the-new-driver) + 1. [Define common use-cases for the behavior (`.dtsi`) (Optional)](#defining-common-use-cases-for-the-behavior-dtsi-optional) +1. [Test changes locally](#testing-changes-locally) +1. [Document behavior functionality](#documenting-behavior-functionality) +1. [Create a pull request for review and inclusion into the ZMK sources](#submitting-a-pull-request) + +:::info +Before developing new behaviors, developers should have a working knowledge of the Embedded Linux Devicetree. +The following resources are provided for those seeking further understanding: + +- [Embedded Linux Wiki - Device Tree Usage](https://elinux.org/Device_Tree_Usage) +- [Zephyr Devicetree API](https://docs.zephyrproject.org/latest/build/dts/api/api.html) +- [Zephyr Device Driver Model](https://docs.zephyrproject.org/latest/kernel/drivers/index.html) + +::: + +## Creating the Behavior + +### Creating the devicetree binding (`.yaml`) + +The properties of the behavior are listed in the behavior's devicetree binding, which comes in the form of a `.yaml` file. Devicetree bindings are stored in the directory `app/dts/bindings/behaviors/` and are labelled in lowercase, beginning with the prefix `zmk,behavior-`, and ending with the behavior's name, using dashes to separate multiple words. For example, the directory for the hold-tap's devicetree binding would be located at `app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml`, which is shown below as a reference: + +```yaml title="app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml" +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +// highlight-next-line +description: Hold or Tap behavior + +// highlight-next-line +compatible: "zmk,behavior-hold-tap" + +// highlight-next-line +include: two_param.yaml + +// highlight-next-line +properties: + bindings: + type: phandles + required: true + tapping-term-ms: + type: int + tapping_term_ms: # deprecated + type: int + quick-tap-ms: + type: int + default: -1 + quick_tap_ms: # deprecated + type: int + flavor: + type: string + required: false + default: "hold-preferred" + enum: + - "hold-preferred" + - "balanced" + - "tap-preferred" + - "tap-unless-interrupted" + retro-tap: + type: boolean + hold-trigger-key-positions: + type: array + required: false + default: [] +``` + +We see that the `.yaml` files used for new behaviors' devicetree bindings consist of the following properties: + +#### `description` + +A brief statement of what the behavior is. The value of this property is not seen by end-users; as such, the `description` value should be kept less than a sentence long, leaving explanations for end-users of how the behavior works for its documentation. + +#### `compatible` + +Allows ZMK to assign the correct driver to the behavior extracted from the keymap or `.dtsi`. The value of the `compatible` property is equal to the name of the [devicetree binding file](#creating-the-devicetree-binding-yaml) as a `string`. + +As shown in the example above, `compatible: "zmk,behavior-hold-tap"` is the value of the `compatible` property of `zmk,behavior-hold-tap.yaml`. + +#### `include` + +Choose between `zero_param.yaml`, `one_param.yaml`, or `two_param.yaml` depending on how many additional parameters are required to complete the behavior's binding in a keymap. For example, we `include: two_param.yaml` in `zmk,behavior-hold-tap.yaml` because any user-defined or pre-defined instances of the hold-tap behavior take in two cells as inputs: one for the hold behavior and one for the tap behavior. + +#### `properties` (Optional) + +These are additional variables required to configure a particular instance of a behavior. `properties` can be of the following types: + +- `path` +- `compound` +- `array` +- `string` +- `string-array` +- `boolean` +- `int` +- `uint8-array` +- `phandle`. +- `phandle-array` +- `phandles` + +:::info +For more information on additional `properties`, refer to [Zephyr's documentation on Devicetree bindings](https://docs.zephyrproject.org/latest/build/dts/bindings.html#properties). +::: + +### Creating the driver (`.c`) + +:::info +Developing drivers for behaviors in ZMK makes extensive use of the Zephyr Devicetree API and Device Driver Model. Links to the Zephyr Project Documentation for both of these concepts can be found below: + +- [Zephyr Devicetree API](https://docs.zephyrproject.org/latest/build/dts/api/api.html) +- [Zephyr Device Driver Model](https://docs.zephyrproject.org/latest/kernel/drivers/index.html) + +::: + +Driver files are stored in `app/src/behaviors/` and are labelled in lowercase, beginning with the prefix `behavior_`, and ending with the behavior's name, using underscores to separate multiple words. For example, the directory for the hold-tap's driver would be located at `app/src/behaviors/behavior_hold_tap.c`. + +The code snippet below shows the essential components of a new driver. + +```c +#define DT_DRV_COMPAT zmk_ + +// Dependencies +#include +#include +#include + +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) + +// Instance-Unique Data Struct (Optional) +struct behavior__data { + bool example_data_param1; + bool example_data_param2; + bool example_data_param3; +}; + +// Instance-Unique Config Struct (Optional) +struct behavior__config { + bool example_config_param1; + bool example_config_param2; + bool example_config_param3; +}; + +// Initialization Function +static int _init(const struct device *dev) { + return 0; +}; + +// API Structure +static const struct behavior_driver_api _driver_api = { + +}; + +DEVICE_DT_INST_DEFINE(0, // Instance Number (Equal to 0 for behaviors that don't require multiple instances, + // Equal to n for behaviors that do make use of multiple instances) + _init, NULL, // Initialization Function, Power Management Device Pointer + &_data, &_config, // Behavior Data Pointer, Behavior Configuration Pointer (Both Optional) + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, // Initialization Level, Device Priority + &_driver_api); // API Structure + +#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ + +``` + +#### `DT_DRV_COMPAT` + +Replace `zmk_` in the `#define DT_DRV_COMPAT` statement with the name of your behavior. (e.g. `zmk_behavior_caps_word`) + +#### Dependencies + +The dependencies required for any ZMK behavior are: + +- `device.h`: [Zephyr Device APIs](https://docs.zephyrproject.org/apidoc/latest/group__device__model.html) +- `drivers/behavior.h`: ZMK Behavior Functions (e.g. [`locality`](#api-structure), `behavior_keymap_binding_pressed`, `behavior_keymap_binding_released`, `behavior_sensor_keymap_binding_triggered`) +- `logging/log.h`: [Zephyr Logging APIs](https://docs.zephyrproject.org/latest/services/logging/index.html) (for more information on USB Logging in ZMK, see [USB Logging](usb-logging.md)). +- `zmk/behavior.h`: ZMK Behavior Information (e.g. parameters, position and timestamp of events) + - `return` values: + - `ZMK_BEHAVIOR_OPAQUE`: Used to terminate `on__binding_pressed` and `on__binding_released` functions that accept `(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event)` as parameters + - `ZMK_BEHAVIOR_TRANSPARENT`: Used in the `binding_pressed` and `binding_released` functions for the transparent (`&trans`) behavior + - `struct`s: + - `zmk_behavior_binding`: Stores the name of the behavior device (`char *behavior_dev`) as a `string` and up to two additional parameters (`uint32_t param1`, `uint32_t param2`) + - `zmk_behavior_binding_event`: Contains layer, position, and timestamp data for an active `zmk_behavior_binding` + +Other common dependencies include `zmk/keymap.h`, which allows behaviors to access layer information and extract behavior bindings from keymaps, and `zmk/event_manager.h` which is detailed below. + +##### ZMK Event Manager + +Including `zmk/event_manager.h` is required for the following dependencies to function properly. + +- `zmk/events/position_state_changed.h`: Position events' state (on/off), source, position, and timestamps +- `zmk/events/keycode_state_changed.h`: Keycode events' state (on/off), usage page, keycode value, modifiers, and timestamps +- `zmk/events/modifiers_state_changed.h`: Modifier events' state (on/off) and modifier value + +Events can be used similarly to hardware interrupts, through the use of [listeners](#listeners-and-subscriptions). + +###### Listeners and Subscriptions + +The condensed form of lines 192-225 of the tap-dance driver, shown below, does an excellent job of showcasing the function of listeners and subscriptions with respect to the [ZMK Event Manager](#zmk-event-manager). + +```c title="app/src/behaviors/behavior_tap_dance.c (Lines 192-197, 225)" +static int tap_dance_position_state_changed_listener(const zmk_event_t *eh); + +ZMK_LISTENER(behavior_tap_dance, tap_dance_position_state_changed_listener); +ZMK_SUBSCRIPTION(behavior_tap_dance, zmk_position_state_changed); + +static int tap_dance_position_state_changed_listener(const zmk_event_t *eh){ + // Do stuff... +} +``` + +Listeners, defined by the `ZMK_LISTENER(mod, cb)` function, take in a listener name (`mod`) and a callback function (`cb`) as their parameters. On the other hand subscriptions are defined by the `ZMK_SUBSCRIPTION(mod, ev_type)`, and determine what kind of event (`ev_type`) should invoke the callback function from the listener. In the tap-dance example, this listener executes code depending on a `zmk_position_state_changed` event, or simply, a change in key position. Other types of ZMK events can be found as the name of the `struct` inside each of the files located at `app/include/zmk/events/.h`. All control paths in a listener should `return` one of the [`ZMK_EV_EVENT_*` values](#return-values), which are shown below. + +###### `return` values: + +- `ZMK_EV_EVENT_BUBBLE`: Keep propagating the event `struct` to the next listener. +- `ZMK_EV_EVENT_HANDLED`: Stop propagating the event `struct` to the next listener. The event manager still owns the `struct`'s memory, so it will be `free`d automatically. Do **not** free the memory in this function. +- `ZMK_EV_EVENT_CAPTURED`: Stop propagating the event `struct` to the next listener. The event `struct`'s memory is now owned by your code, so the event manager will not free the event `struct` memory. Make sure your code will release or free the event at some point in the future. (Use the [`ZMK_EVENT_*` macros](#macros) described below.) + +###### Macros: + +- `ZMK_EVENT_RAISE(ev)`: Start handling this event (`ev`) with the first registered event listener. +- `ZMK_EVENT_RAISE_AFTER(ev, mod)`: Start handling this event (`ev`) after the event is captured by the named [event listener](#listeners-and-subscriptions) (`mod`). The named event listener will be skipped as well. +- `ZMK_EVENT_RAISE_AT(ev, mod)`: Start handling this event (`ev`) at the named [event listener](#listeners-and-subscriptions) (`mod`). The named event listener is the first handler to be invoked. +- `ZMK_EVENT_RELEASE(ev)`: Continue handling this event (`ev`) at the next registered event listener. +- `ZMK_EVENT_FREE(ev)`: Free the memory associated with the event (`ev`). + +#### `DEVICE_DT_INST_DEFINE` + +:::info +For more information on this function, refer to [Zephyr's documentation on the Device Driver Model](https://docs.zephyrproject.org/latest/kernel/drivers/index.html#c.DEVICE_DT_INST_DEFINE). +::: + +The example `DEVICE_DT_INST_DEFINE` call can be left as is with the first parameter, the instance number, equal to `0` for behaviors that only require a single instance (e.g. external power, backlighting, accessing layers). For behaviors that can have multiple instances (e.g. hold-taps, tap-dances, sticky-keys), `DEVICE_DT_INST_DEFINE` can be placed inside a `#define` statement, usually formatted as `#define _INST(n)`, that sets up any [data pointers](#data-pointers-optional) and/or [configuration pointers](#configuration-pointers-optional) that are unique to each instance. + +An example of this can be seen below, taking the `#define KP_INST(n)` from the hold-tap driver. + +```c +#define KP_INST(n) \ + static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ + .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ + .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ + .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ + .retro_tap = DT_INST_PROP(n, retro_tap), \ + .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ + .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ + }; \ + DEVICE_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, NULL, &behavior_hold_tap_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_hold_tap_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(KP_INST) +``` + +Note that in the hold-tap example, the instance number, `0`, has been replaced by `n`, signifying the unique `node_id` of each instance of a behavior. Furthermore, the DT_INST_FOREACH_STATUS_OKAY(KP_INST) macro iterates through each compatible, non-disabled devicetree node, creating and applying the proper values to any instance-specific configurations or data by invoking the KP_INST macro for each instance of the new behavior. + +Behaviors also require the following parameters of `DEVICE_DT_INST_DEFINE` to be changed: + +##### Initialization Function + +Comes in the form `static int _init(const struct device *dev)`. Initialization functions preconfigure any data, like resetting timers and position for hold-taps and tap-dances. All initialization functions `return 0;` once complete. + +##### API Structure + +Comes in the form `static const struct behavior_driver_api _driver_api)`. Common items to include in the API Structure are: + +- `.binding_pressed`: Used for behaviors that invoke an action on its keybind press. Set `.binding_pressed` equal to the function typically named [`on__binding_pressed`](#dependencies). +- `.binding_released`: Same as above, except for activating on keybind release events. Set `.binding_released` equal to the function typically named [`on__binding_released`](#dependencies). +- `.locality`: Defined in ``. Describes how the behavior affects parts of a _split_ keyboard. + - `BEHAVIOR_LOCALITY_CENTRAL`: Behavior only affects the central half, which is the case for most keymap-related behavior. + - `BEHAVIOR_LOCALITY_EVENT_SOURCE`: Behavior affects only the central _or_ peripheral half depending on which side invoked the behavior binding, such as [reset behaviors](../behaviors/reset.md). + - `BEHAVIOR_LOCALITY_GLOBAL`: Behavior affects the entire keyboard, such as [external power](../behaviors/power.md) and lighting-related behaviors that need to be synchronized across halves. + :::note + For unibody keyboards, all locality values perform the same as `BEHAVIOR_LOCALITY_GLOBAL`. + ::: + +##### Data Pointers (Optional) + +The data `struct` stores additional data required for **each new instance** of the behavior. Regardless of the instance number, `n`, `behavior__data_##n` is typically initialized as an empty `struct`. The data respective to each instance of the behavior can be accessed in functions like [`on__binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event)`](#dependencies) by extracting the behavior device from the keybind like so: + +```c +const struct device *dev = device_get_binding(binding->behavior_dev); +struct behavior__data *data = dev->data; +``` + +The variables stored inside the data `struct`, `data`, can be then modified as necessary. + +The fourth cell of `DEVICE_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific data is not required. + +##### Configuration Pointers (Optional) + +The configuration `struct` stores the properties declared from the behavior's `.yaml` for **each new instance** of the behavior. As seen in the `#define KP_INST(n)` of the hold-tap example, the configuration `struct`, `behavior__config_##n`, for each instance number, `n`, can be initialized using the [Zephyr Devicetree Instance-based APIs](https://docs.zephyrproject.org/latest/build/dts/api/api.html#instance-based-apis), which extract the values from the `properties` of each instance of the [devicetree binding](#creating-the-devicetree-binding-yaml) from a user's keymap or [predefined use-case `.dtsi` files](#defining-common-use-cases-for-the-behavior-dtsi-optional) stored in `app/dts/behaviors/`. We illustrate this further by comparing the [`#define KP_INST(n)` from the hold-tap driver](#device_dt_inst_define) and the [`properties` of the hold-tap devicetree binding.](#creating-the-devicetree-binding-yaml) + +The fifth cell of `DEVICE_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific configurations are not required. + +:::caution +Remember that `.c` files should be formatted according to `clang-format` to ensure that checks run smoothly once the pull request is submitted. +::: + +### Updating `app/CmakeLists.txt` to include the new driver + +Most behavior drivers' are invoked according to the central half's [locality](#api-structure), and are therefore stored after the line `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` in the form, `target_sources(app PRIVATE src/behaviors/.c)`, as shown below. + +```txt title="app/CmakeLists.txt" +if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + target_sources(app PRIVATE src/behaviors/behavior_key_press.c) + target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c) + target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) + target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) + target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c) + target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) + target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c) + target_sources(app PRIVATE src/behaviors/behavior_outputs.c) + target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) + target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c) + target_sources(app PRIVATE src/behaviors/behavior_to_layer.c) + target_sources(app PRIVATE src/behaviors/behavior_transparent.c) + target_sources(app PRIVATE src/behaviors/behavior_none.c) + target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) + target_sources(app PRIVATE src/combo.c) + target_sources(app PRIVATE src/conditional_layer.c) + target_sources(app PRIVATE src/keymap.c) +endif() +``` + +For behaviors that do not require central locality, the following options for updating `app/CmakeLists.txt` also exist: + +- Behavior applies to unibody, or central or peripheral half of keyboard: place `target_sources(app PRIVATE .c)` line _before_ `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` +- Behavior applies to _only_ central half of split keyboard: place `target_sources(app PRIVATE .c)` after `if (CONFIG_ZMK_SPLIT AND CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` +- Behavior applies to _only_ peripheral half of split keyboard: place `target_sources(app PRIVATE .c)` after `if (CONFIG_ZMK_SPLIT AND (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL))` +- Behavior requires certain condition in a keyboard's `.conf` file to be met: use `target_sources_ifdef(CONFIG_ app PRIVATE .c)` instead of `target_sources(.c)` + +### Defining common use-cases for the behavior (`.dtsi`) (Optional) + +`.dtsi` files, found in the directory `app/dts/behaviors/`, are only necessary for behaviors with more common use-cases. A common example is the mod-tap (`&mt`), which is a predefined type of hold-tap that takes a modifier key as the hold parameter and another key as the tap parameter. + +For the purpose of this section, we will discuss the structure of `app/dts/behaviors/gresc.dtsi` below. + +```dts title="app/dts/behaviors/gresc.dtsi" +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; + mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; + }; + }; +}; +``` + +The format of a behavior's `.dtsi` file is identical to declaring an instance of the behavior in a user's keymap. The only major difference is that the value `/omit-if-no-ref/` should be placed adjacent to the name of the behavior, as seen in line 11 of the `gresc` example. + +After creating the `.dtsi` from above, update `app/dts/behaviors.dtsi` to include your newly predefined behavior instance, making it accessible by the devicetree. + +```dts title="app/dts/behaviors.dtsi" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// highlight-next-line +#include +``` + +## Testing changes locally + +Create a new folder in `app/tests/` to develop virtual test sets for all common use cases of the behavior. Behaviors should be tested thoroughly on both virtual testing environments using `west test` and real hardware. + +:::note +Zephyr currently does not support logging over Bluetooth, so any use of the serial monitor for hardware testing must be done over hardware UART or USB virtual UART. +::: + +:::info + +- See [Tests](tests.md) for more information on how to create virtual test sets. +- For hardware-based testing, see [USB Logging](usb-logging.md). + +::: + +## Documenting behavior functionality + +Consider the following prompts when writing documentation for new behaviors: + +- What does it do? Describe some general use-cases for the behavior. +- Which properties included in the [devicetree binding](#creating-the-devicetree-binding-yaml) should be configured manually by the user? What do they do, and if applicable, what are their default values? +- What does an example implementation in a keymap look like? Include a code-snippet of the example implementation in the keymap file's `behaviors` node. + - Are there any [common use-cases of the behavior](#defining-common-use-cases-for-the-behavior-dtsi-optional)? Consider making a separate documentation page for these predefined variations, like how the [mod-tap](../behaviors/mod-tap.md) has a separate page from the [hold-tap](../behaviors/hold-tap.md). +- How does the behavior perform in edge cases? For example, tap-dances invoke the last binding in its list of `bindings` once the maximum number of keypresses has been reached. + +Consider also including visual aids alongside written documentation if it adds clarity. + +:::info +See [Documentation](documentation.md) for more information on writing, testing, and formatting ZMK documentation. +::: + +## Submitting a pull request + +Once the above sections are complete, the behavior is almost ready to submit as a pull request. New [devicetree bindings](#creating-the-devicetree-binding-yaml), new [drivers](#creating-the-driver-c), and [predefined use-cases](#defining-common-use-cases-for-the-behavior-dtsi-optional) of the new behavior must contain the appropriate copyright headers, which can be copied and pasted from the tabs below. + + + + +```yaml +// highlight-next-line +# Copyright (c) XXXX The ZMK Contributors +# SPDX-License-Identifier: MIT +``` + + + + +```c +/* +// highlight-next-line + * Copyright (c) XXXX The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ +``` + + + + +:::caution +Remember to change the copyright year (`XXXX`) to the current year when adding the copyright headers to your newly created files. +::: + +While you wait for your PR to become approved and merged into the main repository, please stay up to date for any code reviews and check in with users testing your new behavior. For more detailed information on contributing to ZMK, it is recommended to thoroughly review the [documentation for contributors](https://github.com/zmkfirmware/zmk/blob/main/CONTRIBUTING.md). diff --git a/docs/docs/development/new-behavior.mdx b/docs/docs/development/new-behavior.mdx deleted file mode 100644 index 9eb66581..00000000 --- a/docs/docs/development/new-behavior.mdx +++ /dev/null @@ -1,943 +0,0 @@ ---- -title: New Behavior -sidebar_label: New Behavior Guide ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -:::danger -Before reading this section, it is **vital** that you read through our [clean room policy](./contributing/clean-room.md). -::: - -## Overview - -[Behaviors](../keymaps/behaviors/index.mdx) refer to the actions that are invoked when a key is pressed or released. -This guide outlines how to create a [ZMK module](../development/module-creation.md) that contains a new [behavior](../keymaps/behaviors/index.mdx). - -:::info -If an out-of-tree behavior's use-case is deemed widespread enough to be merged into upstream ZMK, a new pull request may be issued instead. -While this page describes practices that maximize compatibility between module-focused development and pull-request-based workflows, we also note specific modifications required for the latter to work properly. -::: - -In the context of the Zephyr RTOS, behaviors are implemented as "devices", which consist of: - -- A devicetree binding file, which declares the behavior's properties -- A device driver written in C code -- Optionally, devicetree-source-include files (`.dtsi`), which contain predefined instances of the behavior that may be included directly in keymaps - -The general process for developing behaviors is: - -1. [Create a new behavior repository](#creating-a-new-behavior-repository) -1. [Develop the behavior functionality](#developing-the-behavior-functionality) -1. [Test changes locally](#testing-changes-locally) -1. [Document behavior functionality](#documenting-behavior-functionality) -1. [Provide licensing information](#licensing-information) - -:::info -Before developing new behaviors, developers should have a working knowledge of the Embedded Linux Devicetree. -The following resources are provided for those seeking further understanding: - -- [Embedded Linux Wiki - Device Tree Usage](https://elinux.org/Device_Tree_Usage) -- [Zephyr Devicetree API](https://docs.zephyrproject.org/4.1.0/build/dts/api/api.html) -- [Zephyr Device Driver Model](https://docs.zephyrproject.org/4.1.0/kernel/drivers/index.html) - -::: - -## Creating a new Behavior Repository - -### Initializing a new Behavior Module - -1. Navigate to [the ZMK module template repository](https://github.com/zmkfirmware/zmk-module-template) -1. Select **"Use this template"** in the upper right corner, followed by **"Create a new repository"** -1. Choose an appropriate name for your new repository. - ZMK behavior modules should follow the naming convention, **`zmk-behavior-`**, using all lowercase letters and dashes to separate words -1. Complete the module's creation by selecting the repository's visibility, before clicking **"Create repository"** -1. Clone a copy of your module to your development environment. - The cloned repository should be easily accessible when [building and testing firmware using a local toolchain](./local-toolchain/build-flash.mdx#building-with-external-modules). - -Files unrelated to behavior development should be removed from your copy of the ZMK module template. -The minimum viable filesystem for a behavior follows the following structure: - -``` -zmk-behavior-/ -├── CMakeLists.txt -├── Kconfig -├── LICENSE -├── README.md -├── dts -│ ├── behaviors -// highlight-next-line -│ │ └── .dtsi (optional) -│ └── bindings -│ └── behaviors -// highlight-next-line -│ └── zmk,behavior-.yaml -├── include -│ └── dt-bindings -│ └── zmk -// highlight-next-line -│ └── .h (optional) -├── src -│ └── behaviors -// highlight-next-line -│ └── behavior_.c -// highlight-start -├── tests -│ └── -│ ├── behavior_keymap.dtsi -│ └── normal -│ ├── events.patterns -│ ├── keycode_events.snapshot -│ ├── native_posix.keymap -│ └── native_posix_64.keymap -// highlight-end -// highlight-next-line -├── west.yml (optional) -└── zephyr - └── module.yml -``` - -For more information on module preparation, such as details on the contents of `west.yml` and `zephyr/module.yml`, refer to the page on [module creation](./module-creation.md). - -Once the module's tree has been organized properly, the relevant files are now ready to be populated. -We will explain the purpose of the files listed in the tree above in order of increasing complexity. - -### Devicetree Bindings (`.yaml`) - -Devicetree bindings use `.yaml` files to declare their properties. - -They are stored in `dts/bindings/behaviors/` and follow the same naming convention as the repository itself. - -The [mod-morph](../keymaps/behaviors/mod-morph.md)'s devicetree binding is presented below as a simple example. - -```yaml title="zmk/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml" -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -// highlight-next-line -description: Mod Morph Behavior - -// highlight-next-line -compatible: "zmk,behavior-mod-morph" - -// highlight-next-line -include: zero_param.yaml # Additional parameters - -// highlight-next-line -properties: - bindings: - type: phandle-array - required: true - mods: - type: int - required: true - keep-mods: - type: int - required: false - -``` - -It can be seen that the `.yaml` files used for new behaviors' devicetree bindings consist of the following fields: - -#### `description` - -A brief statement of what the behavior is. -The `description` should be kept less than a sentence long because it is not a property seen by end-users. -Instead, detailed explanations of how the behavior works should be shared in the behavior's documentation. - -#### `compatible` - -Allows Zephyr to assign the correct devicetree node to the behavior extracted from the keymap or `.dtsi`, which is then connected to the proper driver. -The value of the `compatible` property is same as the name of the [devicetree binding file](#devicetree-bindings-yaml). - -In the example above, `zmk,behavior-mod-morph.yaml` lists `compatible: "zmk,behavior-mod-morph"`. - -#### `include` additional parameters - -Choose between `zero_param.yaml`, `one_param.yaml`, or `two_param.yaml` depending on how many additional parameters are required to complete the behavior's binding in a keymap. - -| `include` | Example keymap binding | -| ----------------- | ---------------------- | -| `zero_param.yaml` | `&sys_reset` | -| `one_param.yaml` | `&kp A` | -| `two_param.yaml` | `&mt LSHFT Z` | - -:::info -Some behaviors, like the [Bluetooth behavior](../keymaps/behaviors/bluetooth.md), use `two_param.yaml` despite their keymap usage _appearing_ to only use one extra parameter, e.g., `&bt BT_NXT` or `&bt BT_PRV`. -Expanding their C preprocessor definitions reveals the following definitions: `#define BT_NXT BT_NXT_CMD 0` and `#define BT_PRV BT_PRV_CMD 0`, respecting the use of `two_param.yaml`. -This is useful for creating behaviors that may have a primary "command", followed by a secondary parameter. - -See [Behavior Metadata](#behavior-metadata) for more information. -::: - -#### `properties` (Optional) - -These are additional variables required to configure a particular instance of a behavior. -More information can be found in [ZMK's Devicetree primer](./devicetree.md) or [Zephyr's own documentation on Devicetree bindings](https://docs.zephyrproject.org/4.1.0/build/dts/bindings-syntax.html#properties). - -### Behavior Source Files (`.c`) - -Behavior source files are stored in in `src/behaviors/`. -They are labelled in lowercase, beginning with the prefix `behavior_`, and ending with the behavior's name, using underscores to separate multiple words. - -The developer may decide that there is a single global instance of a behavior, or multiple instances that act independently of one another. -Some examples of the former are layer behaviors, backlight control, or endpoint selection. -The latter includes keypresses, hold-taps, or tap-dances. - -The code templates below show the differences between these categories, along with the essential components of a behavior source file. - - - - -```c title="src/behaviors/behavior_.c" -/* - * Copyright (c) XXXX The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_ - -// Dependencies -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -// Instance-specific Data struct (Optional) -struct behavior__data { - bool data_param1; - bool data_param2; - bool data_param3; -}; - -// Instance-specific Config struct (Optional) -struct behavior__config { - bool config_param1; - bool config_param2; - bool config_param3; -}; - -// Initialization Function (Optional) -static int _init(const struct device *dev) { - return 0; -}; - -static int on__binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return ZMK_BEHAVIOR_OPAQUE; -} - -static int on__binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return ZMK_BEHAVIOR_OPAQUE; -} - -// API struct -static const struct behavior_driver_api _driver_api = { - .binding_pressed = on__binding_pressed, - .binding_released = on__binding_released, -}; - -BEHAVIOR_DT_INST_DEFINE(0, // Instance Number (0) - _init, // Initialization Function - NULL, // Power Management Device Pointer - &_data, // Behavior Data Pointer - &_config, // Behavior Configuration Pointer - POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT // Initialization Level, Device Priority - &_driver_api); // API struct - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ - -``` - - - - - -```c title="src/behaviors/behavior_.c" -/* - * Copyright (c) XXXX The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_ - -// Dependencies -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -// Instance-specific Data struct (Optional) -struct behavior__data { - bool data_param1; - bool data_param2; - bool data_param3; -}; - -// Instance-specific Config struct (Optional) -struct behavior__config { - bool config_param1; - bool config_param2; - bool config_param3; -}; - -// Initialization Function (Optional) -static int _init(const struct device *dev) { - return 0; -}; - -static int on__binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return ZMK_BEHAVIOR_OPAQUE; -} - -static int on__binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - return ZMK_BEHAVIOR_OPAQUE; -} - -// API struct -static const struct behavior_driver_api _driver_api = { - .binding_pressed = on__binding_pressed, - .binding_released = on__binding_released, -}; - -#define _INST(n) \ - static struct behavior__data_##n { \ - .data_param1 = foo1, \ - .data_param2 = foo2, \ - .data_param3 = foo3, \ - }; \ - \ - static struct behavior__config_##n { \ - .config_param1 = bar1, \ - .config_param2 = bar2, \ - .config_param3 = bar3, \ - }; \ - \ - BEHAVIOR_DT_INST_DEFINE(n, /* Instance Number (Automatically populated by macro) */ \ - _init, /* Initialization Function */ \ - NULL, /* Power Management Device Pointer */ \ - &_data_##n, /* Behavior Data Pointer */ \ - &_config_##n, /* Behavior Configuration Pointer */ \ - POST_KERNEL, /* Initialization Level */ \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT /* Device Priority */ \ - &_driver_api); /* API struct */ \ - -DT_INST_FOREACH_STATUS_OKAY(_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ - -``` - - - - -A more thorough explanation of the contents of a behavior source file can be [found below](#developing-the-behavior-functionality). - -Other source files may be created as well, as is often the case when creating new features or [events](events.md) from scratch. -For parity with upstream ZMK, these files will generally be placed in the root `src/` directory, or `src/events/`. - -### Updating `Kconfig` - -Kconfig files are used to configure the system firmware at compile time. -Behaviors specifically will generally use the `DT_HAS_ZMK_BEHAVIOR__ENABLED` macro, which checks if the behavior is defined in the devicetree. -This ensures that behavior-specific properties may be accessed without explicitly enabling the behavior in a keyboard's `.conf` or `defconfig` files. - -```Kconfig title="Kconfig" -config ZMK_BEHAVIOR_ - bool - default y - depends on DT_HAS_ZMK_BEHAVIOR__ENABLED - -if ZMK_BEHAVIOR_ - -config ZMK_BEHAVIOR__PROPERTY1 - - help - -config ZMK_BEHAVIOR__PROPERTY2 - - help - -config ZMK_BEHAVIOR__PROPERTY3 - - help - -endif #ZMK_BEHAVIOR_ -``` - -:::info -For an overview on Kconfig files, see [Configuration](../config/index.md#kconfig-files). - -For more examples of behavior-specific Kconfig settings, see [Behavior Configuration](../config/behaviors.md). -::: - -### Updating `CMakeLists.txt` - -`CMakeLists.txt` files are used in Zephyr's [configuration stage](https://docs.zephyrproject.org/3.5.0/build/cmake/index.html) when building firmware. -These specify which source files are included in the build, and may depend on the Kconfig settings shown previously. - -At this point the developer should consider the behavior's [locality](../features/split-keyboards.md#behaviors-with-locality). - -Most behaviors are processed on a unibody keyboard, or the central half of a split board. -An example is shown below. - -```txt title="CMakeLists.txt" -# Copyright (c) XXXX The ZMK Contributors -# SPDX-License-Identifier: MIT - -target_include_directories(app PRIVATE include) - -if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - target_sources(app PRIVATE src/behaviors/behavior_.c) -endif() # ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -``` - -Other common ways of enabling/blocking the inclusion of sources via `CMakeLists.txt` include: - -| Condition | CMakeLists.txt entry | -| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| Locality is unibody, or the central part of a split keyboard | `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` | -| Locality is **only** on the central part of a split keyboard | `if (CONFIG_ZMK_SPLIT AND CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` | -| Locality is **only** on the peripheral part of a split keyboard | `if (CONFIG_ZMK_SPLIT AND (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL))` | -| Kconfig Requirement must be met | Use `target_sources_ifdef(CONFIG_ app PRIVATE .c)` instead of `target_sources(.c)` | - -:::info -If submitting a pull request to upstream ZMK, the `target_sources` invocation would go inside `zmk/app/CMakeLists.txt` instead. -::: - -### Optional: Defining Common Use-Cases for the Behavior (`.dtsi`) - -`.dtsi` files, stored in the directory `dts/behaviors/`, are encouraged for behaviors with more common use-cases. -One such example is the mod-tap (`&mt`), which is a predefined type of hold-tap that takes a modifier key as the hold parameter and another key as the tap parameter. - -For the purpose of this section, we will discuss the structure of `zmk/app/dts/behaviors/gresc.dtsi` below. - -```dts title="zmk/app/dts/behaviors/gresc.dtsi" -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - - -#include -#include - -/ { - behaviors { -// highlight-start -#if ZMK_BEHAVIOR_OMIT(GRESC) - /omit-if-no-ref/ -#endif -// highlight-end - gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; - mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - display-name = "Grave/Escape"; - }; - }; -}; - -``` - -The format of a behavior's `.dtsi` file is identical to declaring an instance of the behavior in a user's keymap. -However, a major difference is that the value `/omit-if-no-ref/` should be placed adjacent to the label and name of the behavior, as highlighted in the example. -This enables the behavior to only be compiled if it is used in the keymap. - -:::warning - -If your behavior has its [`locality`](#zmk-api-struct) property set to anything other than `BEHAVIOR_LOCALITY_CENTRAL`, then the name of the node must be at most 8 characters long. -Otherwise, it will fail to be invoked on the peripheral half of a split keyboard. - -In the above example, `grave_escape` is too long, so it would need to be shortened, e.g. - -```dts -// Behavior can be invoked on peripherals, so name must be <= 8 characters. -/omit-if-no-ref/ gresc: gresc { ... }; -``` - -::: - -After creating the `.dtsi` from above, you may `#include ` at the top of your keymap to access the new behavior definition. - -:::info -If submitting a pull request to upstream ZMK, this `#include` statement would go inside `zmk/app/dts/behaviors.dtsi`, instead of the keymap. -::: - -## Developing the Behavior Functionality - -### Overview - -This section elaborates on the contents of behavior sources that interact with ZMK directly. -We will review the components from the [behavior source templates](#behavior-source-files-c) in the order they appear and introduce new concepts that are commonly used in the development process. - -:::info -Developing drivers for behaviors in ZMK makes extensive use of the Zephyr Devicetree API and Device Driver Model. -Links to the Zephyr Project Documentation for both of these concepts can be found below: - -- [Zephyr Devicetree API](https://docs.zephyrproject.org/4.1.0/build/dts/api/api.html) -- [Zephyr Device Driver Model](https://docs.zephyrproject.org/4.1.0/kernel/drivers/index.html) - -::: - -:::warning -If submitting a pull request, any `.c` files should be formatted according to `clang-format` to ensure that automated checks run smoothly. -::: - -### Compatible: `#define DT_DRV_COMPAT` - -This field should match the [`compatible` field of your devicetree binding](#compatible), using all lowercase letters and underscores to separate words, instead of hyphens and commas. - -For example, the Caps Word behavior's devicetree binding lists `compatible: "zmk,behavior-caps-word"`, so the `DT_DRV_COMPAT` is `zmk_behavior_caps_word`. - -### Dependencies - -The dependencies required for any ZMK behavior are: - -- `zephyr/device.h`: [Zephyr Device APIs](https://docs.zephyrproject.org/apidoc/3.5.0/group__device__model.html) -- `drivers/behavior.h`: ZMK Behavior Functions (e.g. [locality](#zmk-api-struct), `behavior_keymap_binding_pressed`, `behavior_keymap_binding_released`, `behavior_sensor_keymap_binding_triggered`) -- `zephyr/logging/log.h`: [Zephyr Logging APIs](https://docs.zephyrproject.org/3.5.0/services/logging/index.html) (for more information on USB Logging in ZMK, see [USB Logging](usb-logging.mdx)). -- `zmk/behavior.h`: ZMK Behavior Information (e.g. parameters, position and timestamp of events) - - `return` values: - - `ZMK_BEHAVIOR_OPAQUE`: Used to terminate `on__binding_pressed` and `on__binding_released` functions that accept `(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event)` as parameters - - `ZMK_BEHAVIOR_TRANSPARENT`: Used in the `binding_pressed` and `binding_released` functions for the transparent (`&trans`) behavior - - `struct`s: - - `zmk_behavior_binding`: Stores the name of the behavior device (`char *behavior_dev`) as a `string` and up to two additional parameters (`uint32_t param1`, `uint32_t param2`) - - `zmk_behavior_binding_event`: Contains layer, position, and timestamp data for an active `zmk_behavior_binding` - -Other common dependencies include `zmk/keymap.h`, which allows behaviors to access layer information and extract behavior bindings from keymaps, and `zmk/event_manager.h` which is detailed below. - -### Behavior metadata - -Behavior metadata documents the possible combinations of parameters that can be used with the behavior when added to your keymap. -The metadata structure allows flexibility to specify different kinds of well known parameter types, such as a HID usage, different second parameters passed on the selected first parameter, etc. - -You can see a few examples of how the metadata is implemented in practice for the following behaviors: - -- [Key press](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_key_press.c#L21) -- [RGB underglow](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_rgb_underglow.c#L23) -- [Hold-tap](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_hold_tap.c#L680), which is dynamic based on what behaviors are set up in the hold-tap bindings - -Behavior metadata consists of one or more metadata sets, where each metadata set has a set of values for the parameter(s) used with the behavior. - -For example, a common approach for behaviors is to have a set of possible first parameters that identify the "command" to invoke for the behavior, and the second parameter is a detail/sub-parameter to the action. -You can see an example of this with the `&bt` behavior. -In that scenario, all `&bt` "commands" that take a BT profile as a second parameter are grouped into one set, and all commands that take no arguments are grouped into another. - -This allows the ZMK Studio UI to properly show a input for a profile only when the appropriate first "command" selection is made in the UI. -Here is a snippet of that setup from the [behavior_bt.c](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_bt.c#L25) code: - -```c - -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -// Set up the values for commands that take no additional parameter. -static const struct behavior_parameter_value_metadata no_arg_values[] = { - { - .display_name = "Next Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_NXT_CMD, - }, - { - .display_name = "Previous Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_PRV_CMD, - }, - { - .display_name = "Clear All Profiles", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_CLR_ALL_CMD, - }, - { - .display_name = "Clear Selected Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_CLR_CMD, - }, -}; - -// Set up the "no arg" metadata set. -static const struct behavior_parameter_metadata_set no_args_set = { - .param1_values = no_arg_values, - .param1_values_len = ARRAY_SIZE(no_arg_values), -}; - -// Set up the possible param1 values for commands that take a profile index for param2 -static const struct behavior_parameter_value_metadata prof_index_param1_values[] = { - { - .display_name = "Select Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_SEL_CMD, - }, - { - .display_name = "Disconnect Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_VALUE, - .value = BT_DISC_CMD, - }, -}; - -// Set up the param2 value metadata for the valid range of possible profiles to pick from. -static const struct behavior_parameter_value_metadata prof_index_param2_values[] = { - { - .display_name = "Profile", - .type = BEHAVIOR_PARAMETER_VALUE_TYPE_RANGE, - .range = {.min = 0, .max = ZMK_BLE_PROFILE_COUNT}, - }, -}; - -// Set up the metadata set for the commands that take a profile for the second parameter. -static const struct behavior_parameter_metadata_set profile_index_metadata_set = { - .param1_values = prof_index_param1_values, - .param1_values_len = ARRAY_SIZE(prof_index_param1_values), - .param2_values = prof_index_param2_values, - .param2_values_len = ARRAY_SIZE(prof_index_param2_values), -}; - -// Finally, expose all the sets in the top level aggregate structure. -static const struct behavior_parameter_metadata_set metadata_sets[] = {no_args_set, - profile_index_metadata_set}; - -static const struct behavior_parameter_metadata metadata = { - .sets_len = ARRAY_SIZE(metadata_sets), - .sets = metadata_sets, -}; - -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - -... Rest of the behavior implementation - -// Add the metadata to the driver API conditionally: - -static const struct behavior_driver_api behavior_bt_driver_api = { - .binding_pressed = on_keymap_binding_pressed, - .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; -``` - -### ZMK API struct - -Comes in the form `static const struct behavior_driver_api _driver_api`. -The most relevant fields of `struct behavior_driver_api`, defined in `drivers/behavior.h`, are shown below. - -| Field | Description | -| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| .binding_pressed | The function called when the key is pressed. Typically reserved for a function named [`on__binding_pressed`](#dependencies) | -| .binding_released | The function called when the key is pressed. Typically reserved for a function named [`on__binding_released`](#dependencies) | -| .locality | Describes how the behavior affects parts of a _split_ keyboard. | - -Locality has been discussed previously at compile-time. -Locality in the context of the API struct refers to runtime locality. -The `.locality` field may take the following values. - -- `BEHAVIOR_LOCALITY_CENTRAL`: Behavior only affects the central half, which is the case for most keymap-related behavior. -- `BEHAVIOR_LOCALITY_EVENT_SOURCE`: Behavior affects only the central _or_ peripheral half depending on which side invoked the behavior binding, such as [reset behaviors](../keymaps/behaviors/reset.md). -- `BEHAVIOR_LOCALITY_GLOBAL`: Behavior affects the entire keyboard, such as [external power](../keymaps/behaviors/power.md) and lighting-related behaviors that need to be synchronized across halves. - -:::note -For unibody keyboards, all locality values perform the same as `BEHAVIOR_LOCALITY_GLOBAL`. -::: - -The API struct's metadata-specific fields are shown below. - -| Field | Description | -| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| .get_parameter_metadata | Callback function that can dynamically provide/populate the metadata describing the parameters to use with the behavior so the behavior may be used with [ZMK Studio](../features/studio.md). | -| .parameter_metadata | Pointer to metadata describing the parameters to use with the behavior so the behavior may be used with [ZMK Studio](../features/studio.md). | - -### Invoking `BEHAVIOR_DT_INST_DEFINE` - -`BEHAVIOR_DT_INST_DEFINE` is a special ZMK macro which uses Zephyr's `DEVICE_DT_INST_DEFINE` macro to define the driver instance, before adding it to a list of ZMK behaviors so that can be found by the function `zmk_behavior_get_binding()`. - -:::info -For more information on this function, refer to [Zephyr's documentation on the Device Driver Model](https://docs.zephyrproject.org/4.1.0/kernel/drivers/index.html#c.DEVICE_DT_INST_DEFINE). -::: - -The example `BEHAVIOR_DT_INST_DEFINE` call can be left as is with the first parameter, the instance number, equal to `0` for behaviors that only require a single instance (e.g. external power, backlighting, accessing layers). -For behaviors that can have multiple instances (e.g. hold-taps, tap-dances, sticky-keys), `BEHAVIOR_DT_INST_DEFINE` can be placed inside a `#define` statement, usually formatted as `#define _INST(n)`, that sets up any [data pointers](#optional-data-pointers) and/or [configuration pointers](#optional-configuration-pointers) that are unique to each instance. - -An example of this can be seen below, taking the `#define KP_INST(n)` from the hold-tap driver. - -```c -#define KP_INST(n) \ - static const struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ - .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ - .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ - .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ - .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ - .retro_tap = DT_INST_PROP(n, retro_tap), \ - .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ - .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ - }; \ - BEHAVIOR_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, NULL, &behavior_hold_tap_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_hold_tap_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(KP_INST) -``` - -Note that in the hold-tap example, the instance number, `0`, has been replaced by `n`, signifying the unique `node_id` of each instance of a behavior. -Furthermore, the DT_INST_FOREACH_STATUS_OKAY(KP_INST) macro iterates through each compatible, non-disabled devicetree node, creating and applying the proper values to any instance-specific configurations or data by invoking the KP_INST macro for each instance of the new behavior. - -Behaviors also require the following parameters of `BEHAVIOR_DT_INST_DEFINE` to be changed: - -#### Optional: Initialization function - -Comes in the form `static int _init(const struct device *dev)`. -Initialization functions preconfigure any data, like resetting timers and position for hold-taps and tap-dances. -All initialization functions `return 0;` once complete. - -The **second** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if an initialization function is not required. - -#### Optional: Data pointers - -The data `struct` stores additional data required for **each new instance** of the behavior. -Regardless of the instance number, `n`, `behavior__data_##n` is typically initialized as an empty `struct`. -The data respective to each instance of the behavior can be accessed in functions like [`on__binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event)`](#dependencies) by extracting the behavior device from the keybind like so: - -```c -const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); -struct behavior__data *data = dev->data; -``` - -The variables stored inside the data `struct`, `data`, can be then modified as necessary. - -The **fourth** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific data is not required. - -#### Optional: Configuration pointers - -The configuration `struct` stores the properties declared from the behavior's `.yaml` for **each new instance** of the behavior. -As seen in the `#define KP_INST(n)` of the hold-tap example, the configuration `struct`, `behavior__config_##n`, for each instance number, `n`, can be initialized using the [Zephyr Devicetree Instance-based APIs](https://docs.zephyrproject.org/4.1.0/build/dts/api/api.html#instance-based-apis), -which extract the values from the `properties` of each instance of the [devicetree binding](#devicetree-bindings-yaml) from a user's keymap or [predefined use-case `.dtsi` files](#optional-defining-common-use-cases-for-the-behavior-dtsi) stored in `app/dts/behaviors/`. -We illustrate this further by comparing the [`#define KP_INST(n)` from the hold-tap driver](#invoking-behavior_dt_inst_define) and the [`properties` of the hold-tap devicetree binding](#devicetree-bindings-yaml). -The config structure instances should always be declared `const` -so they are placed into flash, not RAM, by the linker. - -The **fifth** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific configurations are not required. - -### Keycodes - -Let us examine one of the simplest behavior actions: sending and releasing keycodes. - -The core of the [key press behavior](../keymaps/behaviors/key-press.md) is `raise_zmk_keycode_state_changed_from_encoded()`, found in `keycode_state_changed.h`. -This function takes in three arguments: an HID usage, a boolean value to determine if the keycode is pressed or released, and a timestamp. -We present a snippet from the key press behavior source, where it is seen that the HID usage of each keycode is extracted from the keymap, before it is determined to be pressed or released. - -```c -static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp); -} - -static int on_keymap_binding_released(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) { - LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - return raise_zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp); -} - -static const struct behavior_driver_api behavior_key_press_driver_api = { - .binding_pressed = on_keymap_binding_pressed, - .binding_released = on_keymap_binding_released, -#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) - .parameter_metadata = &metadata, -#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) -}; -``` - -### Layers - -All functions that interact with layers can be found in `keymap.h`. - -Layers can be identified in two ways: an "order-independent" `zmk_keymap_layer_id_t`, and an "order-dependent" `zmk_keymap_layer_index_t`. - -| Function | Description | -| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | -| `zmk_keymap_layer_default(void)` | Returns a `zmk_keymap_layer_id_t` of the default layer. | -| `zmk_keymap_layer_state(void)` | Returns the current keyboard's layer state: a bitmask where each bit represents the state of the corresponding order-independent ID. | -| `zmk_keymap_layer_active(zmk_keymap_layer_id_t layer)` | Returns a `bool` representing if the layer with the chosen `zmk_keymap_layer_id_t` is active. | -| `zmk_keymap_highest_layer_active(void)` | Returns a `zmk_keymap_layer_index_t` the ordered layer index of the highest active layer. | -| `zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer)` | Activates the chosen layer. Returns 0 if successful. Returns values < 0 if an error occurs. | -| `zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer)` | Deactivates the chosen layer. Returns 0 if successful. Returns values < 0 if an error occurs. | -| `zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer)` | Toggles the chosen layer. Returns 0 if successful. Returns values < 0 if an error occurs. | -| `zmk_keymap_layer_to(zmk_keymap_layer_id_t layer)` | Deactivates every layer, before activating the chosen layer. Returns 0 if successful. Returns values < 0 if an error occurs. | -| `zmk_keymap_layer_name(zmk_keymap_layer_id_t layer)` | Returns a C-string containing the layer's name. | -| `zmk_keymap_layer_index_to_id(zmk_keymap_layer_index_t layer_index)` | Returns the order-independent ID for a given order-dependent layer index. | - -### ZMK Events - -The event manager is a queue-based system that can be leveraged by behaviors to check for significant changes in the system's state. -Some common examples of this are determining if one or more key positions have been pressed or released, to check if a specific keycode has been sent, or registering changes between keymap layers. -All events can be found in their headers, stored in `zmk/app/include/zmk/events/`. - -To use the event manager, we `#include ` at the top of our behavior source file. - -Some examples of events that are the most relevant to behavior development can be seen below. - -| Event | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------- | -| `hid_indicators_changed.h` | The current HID indicators (Num Lock, Caps Lock, Scroll Lock, Compose, Kana) as a bitmask | -| `keycode_state_changed.h` | [Keycode events' state (on/off)](#keycodes), usage page, keycode value, modifiers, and timestamps | -| `layer_state_changed.h` | [Layer events' state (bitmask)](#layers), layer index, and timestamps | -| `position_state_changed.h` | Position events' state (on/off), source, position, and timestamps | - -:::info -See the [`events` directory](https://github.com/zmkfirmware/zmk/tree/main/app/include/zmk/events) for other examples of events. -For more information on how to interact with events and the event manager, see [Events](./events.md). -::: - -### Interacting with other behaviors and the ZMK Behavior Queue - -This section will refer to features found in `behavior.h` and `behavior_queue.h`. - -#### `#include ` - -These functions work with behaviors at a **device** level. -They are used to retrieve the device associated with a keymap binding, or invoke other behaviors, such as ones provided as a parameter to the current behavior. - -| Function | Description | -| ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `struct zmk_behavior_binding` | A `struct` containing the behavior binding's name stored as a C-string, and its parameters. | -| `struct zmk_behavior_binding_event` | A `struct` describing where and when a behavior binding is invoked based on its the layer, key position, and timestamp. For split keyboards, this also includes which part of the keyboard invoked the binding. | -| `zmk_behavior_get_binding(const char *name)` | Get a `const struct device*` for a behavior from its name field. | -| `zmk_behavior_invoke_binding(const struct zmk_behavior_binding *src_binding, struct zmk_behavior_binding_event event, bool pressed)` | Invoke a behavior given its binding and invoking event details. | - -#### `#include ` - -The behavior queue is leveraged by [macros](../keymaps/behaviors/macros.md) and [sensor rotation](../keymaps/behaviors/sensor-rotate.md) behaviors. -This queue ensures that behaviors may be invoked sequentially using specific time-based triggers without blocking the rest of the keyboard functionality. - -| Function | Description | -| ------------------------ | ---------------------------------------- | -| `zmk_behavior_queue_add` | Adds the behavior to the behavior queue. | - -## Testing Changes Locally - -Create a new folder in `tests/` (or `app/tests/` if submitting a pull request) to develop virtual test sets for all common use cases of the behavior. -For pull requests, behaviors should be tested thoroughly on both virtual testing environments using `west test` and real hardware. - -:::note -Zephyr currently does not support logging over Bluetooth, so any use of the serial monitor for hardware testing must be done over hardware UART or USB virtual UART. -::: - -:::info - -- See [Tests](local-toolchain/tests.md) for more information on how to create virtual test sets. -- For hardware-based testing, see [USB Logging](usb-logging.mdx). - -::: - -## Documenting Behavior Functionality - -Consider the following prompts when writing documentation for new behaviors: - -- What does it do? Describe some general use-cases for the behavior. -- Which properties included in the [devicetree binding](#devicetree-bindings-yaml) should be configured manually by the user? What do they do, and if applicable, what are their default values? -- What does an example implementation in a keymap look like? Include a code-snippet of the example implementation in the keymap file's `behaviors` node. -- How does the behavior perform in edge cases? For example, tap-dances invoke the last binding in its list of `bindings` once the maximum number of keypresses has been reached. - -Including visual aids alongside written documentation for additional clarity may be helpful. - -:::info -If submitting a pull request, see [Documentation](contributing/documentation.md) for more information on writing, testing, and formatting ZMK documentation. -::: - -## Licensing Information - -:::danger -The ZMK Project and its contributors do not claim to be legal representatives, and any material below should not considered official legal advice. -When distributing your work, please review the terms and conditions associated with any relevant licenses thoroughly. -::: - -Developers may wish to share their work with the public, which is often done by sharing a link to a GitHub repository. -However, making a repository public does **not** automatically qualify the repository as open source, or permit others to use the works as they see fit. -To qualify a codebase as open source, authors must provide a license that in addition to their source code, satisfy criteria that includes but is not limited to: - -- The source code and license must be freely accessible and redistributable -- The source code may be freely modified, which may result in the creation of derivative works under the conditions of the included license -- The license must not discriminate against any person, group of persons, or specific fields of endeavor - -:::info -For more information, consider looking at the following resources: - -- [GitHub Open Source Guides](https://opensource.guide/legal/) -- [The System Package Data Exchange (SPDX)](https://spdx.dev/learn/handling-license-info/) -- [List of licenses approved by the Open Source Initiative (OSI)](https://opensource.org/licenses) -- [The OSI Open Source Definition](https://opensource.org/osd) - -::: - -### Contributing to ZMK (MIT License) - -The [MIT License](https://github.com/zmkfirmware/zmk/blob/main/LICENSE) is used for developers submitting a pull request or those wish to make their work usable, modifiable, and distributable in its entirety to the ZMK community. -If the author's intent is to contribute their work to ZMK in these manners, especially when submitting pull requests, they should be aware of the constraints specified in our [clean room policy](./contributing/clean-room.md). - -[SPDX copyright headers](https://spdx.dev/learn/handling-license-info/) for each of the files outlined in this document can be copied and pasted from the tabs below. - - - - -```yaml -// highlight-next-line -# Copyright (c) XXXX The ZMK Contributors -# SPDX-License-Identifier: MIT -``` - - - - -```c -/* -// highlight-next-line - * Copyright (c) XXXX The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ -``` - - - - -:::warning -Remember to change the copyright year (`XXXX`) to the current year when adding the copyright headers to your newly created files. -This also applies to the **`LICENSE`** file at the repository's root. -::: - -### Other licenses - -Developers may also use other licenses with their work. -Some common example are [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) or [GNU Public Licenses (GPL)](https://www.gnu.org/licenses/licenses.html). -However, software licenses are generally treated as "one-way" compatible. -This means that code registered under a more permissive license may be used in a project with a more restrictive license, but not the other way around. - -For example, as noted in ZMK's [clean room policy](./contributing/clean-room.md), projects like QMK and TMK use GPL licenses, which are more restrictive than ZMK's MIT license. -Code from ZMK may be used as a reference when developing work for QMK/TMK, but code from QMK/TMK may **not** be used as source material when working on ZMK. diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md new file mode 100644 index 00000000..7f6a8644 --- /dev/null +++ b/docs/docs/development/new-shield.md @@ -0,0 +1,518 @@ +--- +title: New Keyboard Shield +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import KeymapExampleFile from '../keymap-example-file.md'; + +import InterconnectTabs from "@site/src/components/interconnect-tabs"; +import Metadata from "@site/src/data/hardware-metadata.json"; + +## Overview + +This guide will walk through the steps necessary to add ZMK support for a keyboard the uses a (Pro Micro compatible) addon MCU board to provide the microprocessor. +The high level steps are: + +- Create a new shield directory. +- Add the base Kconfig files. +- Add the shield overlay file to define the KSCAN driver for detecting key press/release. +- (Optional) Add the matrix transform for mapping KSCAN row/column values to sane key positions. This is needed for non-rectangular keyboards, or where the underlying row/column pin arrangement does not map one to one with logical locations on the keyboard. +- Add a default keymap, which users can override in their own configs as needed. +- Add support for features such as encoders, OLED displays, or RGB underglow. + +It may be helpful to review the upstream [shields documentation](https://docs.zephyrproject.org/2.5.0/guides/porting/shields.html#shields) to get a proper understanding of the underlying system before continuing. + +:::note +ZMK support for split keyboards requires a few more files than single boards to ensure proper connectivity between the central and peripheral units. Check the following guides thoroughly to ensure that all the files are in place. +::: + +## New Shield Directory + +:::note +This guide describes how to add shield to the ZMK main repository. If you are building firmware for your +own prototype or handwired keyboard, it is recommended to use your own user config repository. Follow the +[user setup guide](user-setup.md) to create your user config repository first. When following the rest +of this guide, replace the `app/` directory in the ZMK main repository with the `config/` directory in your +user config repository. For example, `app/boards/shields/` should now be +`config/boards/shields/`. +::: + +Shields for Zephyr applications go into the `boards/shields/` directory; since ZMK's Zephyr application lives in the `app/` subdirectory of the repository, that means the new shield directory should be: + +```bash +mkdir app/boards/shields/ +``` + +## Base Kconfig Files + +There are two required Kconfig files that need to be created for your new keyboard +shield to get it picked up for ZMK, `Kconfig.shield` and `Kconfig.defconfig`. + +### Kconfig.shield + +The `Kconfig.shield` file defines any additional Kconfig settings that may be relevant when using this keyboard. For most keyboards, there is just one additional configuration value for the shield itself. + +```kconfig +config SHIELD_MY_BOARD + def_bool $(shields_list_contains,my_board) +``` + +This will make sure that a new configuration value named `SHIELD_MY_BOARD` is set to true whenever `my_board` is used as the shield name, either as the `SHIELD` variable [in a local build](build-flash.md) or in your `build.yaml` file [when using Github Actions](../customization). Note that this configuration value will be used in `Kconfig.defconfig` to set other properties about your shield, so make sure that they match. + +**For split boards**, you will need to add configurations for the left and right sides. For example, if your split halves are named `my_board_left` and `my_board_right`, it would look like this: + +```kconfig +config SHIELD_MY_BOARD_LEFT + def_bool $(shields_list_contains,my_board_left) + +config SHIELD_MY_BOARD_RIGHT + def_bool $(shields_list_contains,my_board_right) +``` + +### Kconfig.defconfig + +The `Kconfig.defconfig` file is where overrides for various configuration settings +that make sense to have different defaults when this shield is used. One main item +that usually has a new default value set here is the `ZMK_KEYBOARD_NAME` value, +which controls the display name of the device over USB and BLE. + +The updated new default values should always be wrapped inside a conditional on the shield config name defined in the `Kconfig.shield` file. Here's the simplest example file. + +:::warning +The keyboard name must be less than or equal to 16 characters in length, otherwise the bluetooth advertising might fail and you will not be able to find your keyboard from your device. +::: + +```kconfig +if SHIELD_MY_BOARD + +config ZMK_KEYBOARD_NAME + default "My Board" + +endif +``` + +Similarly to defining the halves of a split board in `Kconfig.shield` it is important to set the `ZMK_KEYBOARD_NAME` for each half of a split keyboard. +You'll also want to set which half is the central side. Most boards set it to the left. +Then on the peripheral half, you'll want to turn USB on so that it shows USB status on displays properly. +Finally, you'll want to turn on the split option for both sides. This can all be seen below. + +```kconfig +if SHIELD_MY_BOARD_LEFT + +config ZMK_KEYBOARD_NAME + default "My Board" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_MY_BOARD_LEFT || SHIELD_MY_BOARD_RIGHT + +config ZMK_SPLIT + default y + +endif +``` + +## Shield Overlays + + + +To use GPIO pins that are not part of the interconnects as described above, you can use the GPIO labels that are specific to each controller type. +For instance, pins numbered `PX.Y` in nRF52840-based boards can be referred to via `&gpioX Y` labels. +An example is `&gpio1 7` for the `P1.07` pin that the nice!nano exposes in the middle of the board. + + + + + +The `.overlay` is the devicetree description of the keyboard shield that is merged with the primary board devicetree description before the build. For ZMK, this file at a minimum should include the chosen node named `zmk,kscan` that references a KSCAN driver instance. For a simple 3x3 macropad matrix, +this might look something like: + +```dts +/ { + chosen { + zmk,kscan = &kscan0; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; +}; +``` + +See the [Keyboard Scan configuration documentation](../config/kscan.md) for details on configuring the KSCAN driver. + + + + + +### .dtsi files and Shield Overlays (Split Shields) + +Unlike unibody keyboards, split keyboards have a core .dtsi file with shield overlays for each half of the keyboard. +It is preferred to define only the `col-gpios` or `row-gpios` in the common shield .dtsi, depending on the `diode-direction` value. +For `col2row` directed boards like the iris, the shared .dtsi file may look like this: + +```dts +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | +// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | +// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | +// | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file + ; + + }; +}; +``` + +:::note +Notice that in addition to the common `row-gpios` that are declared in the kscan, the [matrix transform](#optional-matrix-transform) is defined in the .dtsi. +::: + +The missing `col-gpios` would be defined in your `_left.overlay` and `_right.overlay` files. +Keep in mind that the mirrored position of the GPIOs means that the `col-gpios` will appear reversed when the .overlay files are compared to one another. +Furthermore, the column offset for the [matrix transform](#optional-matrix-transform) should be added to the right half of the keyboard's overlay +because the keyboard's switch matrix is read from left to right, top to bottom. +This is exemplified with the iris .overlay files. + +```dts title=iris_left.overlay +#include "iris.dtsi" // Notice that the main dtsi files are included in the overlay. + +&kscan0 { + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + ; +}; +``` + +```dts title=iris_right.overlay +#include "iris.dtsi" + +&default_transform { // The matrix transform for this board is 6 columns over because the left half is 6 columns wide according to the matrix. + col-offset = <6>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + ; +}; + +``` + +See the [Keyboard Scan configuration documentation](../config/kscan.md) for details on configuring the KSCAN driver. + +### .conf files (Split Shields) + +While unibody boards only have one .conf file that applies configuration characteristics to the entire keyboard, +split keyboards are unique in that they contain multiple .conf files with different scopes. +For example, a split board called `my_awesome_split_board` would have the following files: + +- `my_awesome_split_board.conf` - Configuration elements affect both halves +- `my_awesome_split_board_left.conf` - Configuration elements only affect left half +- `my_awesome_split_board_right.conf` - Configuration elements only affect right half + +In most case you'll only need to use the .conf file that affects both halves of a split board. It's used for adding features like deep-sleep or rotary encoders. + +```ini title=my_awesome_split_board.conf +CONFIG_ZMK_SLEEP=y +``` + +:::note +The shared configuration in `my_awesome_split_board.conf` is only applied when you are building with a [`zmk-config` folder](build-flash#building-from-zmk-config-folder) and when it is present at `config/my_awesome_split_board.conf`. If you are not using a `zmk-config` folder, you will need to include the shared configuration in both `my_awesome_split_board_left.conf` and `my_awesome_split_board_right.conf` files. +::: + + + + +## (Optional) Matrix Transform + +Internally ZMK translates all row/column events into "key position" events to maintain a consistent model that works no matter what any possible GPIO matrix may look like for a certain keyboard. This is particularly helpful when: + +1. To reduce the used pins, an "efficient" number of rows/columns for the GPIO matrix is used, that does _not_ match the physical layout of rows/columns of the actual key switches. +1. For non rectangular keyboards with thumb clusters, non `1u` locations, etc. + +A "key position" is the numeric index (zero-based) of a given key, which identifies +the logical key location as perceived by the end user. All _keymap_ mappings actually bind behaviors to _key positions_, not to row/column values. + +_Without_ a matrix transform, that intentionally map each key position to the row/column pair that position corresponds to, the default equation to determine that is: + +```c +($row * NUMBER_OF_COLUMNS) + $column +``` + +Which effectively amounts to numbering the key positions by traversing each row from top to bottom and assigning numerically incrementing key positions. + +Whenever that default key position mapping is insufficient, the `.overlay` file should _also_ include a matrix transform. + +Here is an example for the [nice60](https://github.com/Nicell/nice60), which uses an efficient 8x8 GPIO matrix, and uses a transform: + +```dts +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; +// | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | +// | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX34 | MX25 | MX26 | MX27 | MX28 | +// | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | +// | MX42 | MX43 | MX44 | MX45 | MX46 | MX47 | MX48 | MX49 | MX50 | MX51 | MX52 | MX53 | +// | MX54 | MX55 | MX56 | MX57 | MX58 | MX59 | MX60 | MX61 | + map = < +RC(3,0) RC(2,0) RC(1,0) RC(0,0) RC(1,1) RC(0,1) RC(0,2) RC(1,3) RC(0,3) RC(1,4) RC(0,4) RC(0,5) RC(1,6) RC(1,7) +RC(4,0) RC(4,1) RC(3,1) RC(2,1) RC(2,2) RC(1,2) RC(2,3) RC(3,4) RC(2,4) RC(2,5) RC(1,5) RC(2,6) RC(2,7) RC(3,7) +RC(5,0) RC(5,1) RC(5,2) RC(4,2) RC(3,2) RC(4,3) RC(3,3) RC(4,4) RC(4,5) RC(3,5) RC(4,6) RC(3,6) RC(4,7) +RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(5,3) RC(6,4) RC(5,4) RC(6,5) RC(5,5) RC(6,6) RC(5,6) RC(5,7) +RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,5) RC(7,6) RC(6,7) RC(7,7) + >; + }; +``` + +Some important things to note: + +- The `#include ` is critical. The `RC` macro is used to generate the internal storage in the matrix transform, and is actually replaced by a C preprocessor before the final devicetree is compiled into ZMK. +- `RC(row, column)` is placed sequentially to define what row and column values that position corresponds to. +- If you have a keyboard with options for `2u` keys in certain positions, or break away portions, it is a good idea to set the chosen `zmk,matrix_transform` to the default arrangement, and include _other_ possible matrix transform nodes in the devicetree that users can select in their user config by overriding the chosen node. + +See the [matrix transform section](../config/kscan.md#matrix-transform) in the Keyboard Scan configuration documentation for details and more examples of matrix transforms. + +## Default Keymap + +Each keyboard should provide an OOTB default keymap to be used when building the firmware, which can be overridden and customized by user configs. For "shield keyboards", this should be placed in the `app/boards/shields//.keymap` file. The keymap is configured as an additional devicetree overlay that includes the following: + +- A node with `compatible="zmk,keymap"` where each child node is a layer with a `bindings` array that binds each key position to a given behavior (e.g. key press, momentarily layer, etc). + +Here is an example simple keymap for the Kyria, with only one layer: + + + +:::note +The two `#include` lines at the top of the keymap are required in order to bring in the default set of behaviors to make them available to bind, and to import a set of defines for the key codes, so keymaps can use parameters like `N2` or `K` instead of the raw keycode numeric values. +::: + +### Keymap Behaviors + +Further documentation on behaviors and bindings is forthcoming, but a summary of the current behaviors you can bind to key positions is as follows: + +- `kp` is the "key press" behavior, and takes a single binding argument of the key code from the 'keyboard/keypad" HID usage table. +- `mo` is the "momentary layer" behavior, and takes a single binding argument of the numeric ID of the layer to momentarily enable when that key is held. +- `trans` is the "transparent" behavior, useful to be place in higher layers above `mo` bindings to be sure the key release is handled by the lower layer. No binding arguments are required. +- `mt` is the "mod-tap" behavior, and takes two binding arguments, the modifier to use if held, and the keycode to send if tapped. + +## Metadata + +ZMK makes use of an additional metadata YAML file for all boards and shields to provide high level information about the hardware to be incorporated into setup scripts/utilities, website hardware list, etc. + +The naming convention for metadata files is `{item_id}.zmk.yml`, where the `item_id` is the board/shield identifier, including version information but excluding any optional split `_left`/`_right` suffix, e.g. `corne.zmk.yml` or `nrfmicro_11.zmk.yml`. + +Here is a sample `corne.zmk.yml` file from the repository: + +```yaml +file_format: "1" +id: corne +name: Corne +type: shield +url: https://github.com/foostan/crkbd/ +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display +siblings: + - corne_left + - corne_right +``` + +You should place a properly named `foo.zmk.yml` file in the directory next to your other shield values, and fill it out completely and accurately. See [Hardware Metadata Files](/docs/development/hardware-metadata-files) for the full details. + +## Adding Features + +### Encoders + +EC11 encoder support can be added to your board or shield by adding the appropriate lines to your board/shield's configuration (.conf), device tree (.dtsi), overlay (.overlay), and keymap (.keymap) files. + + + + +In your configuration file you will need to add the following lines so that the encoders can be enabled/disabled: + +```ini +# Uncomment to enable encoder +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y +``` + +These should be commented by default for encoders that are optional/can be swapped with switches, but can be uncommented if encoders are part of the default design. + +:::note +If building locally for split boards, you may need to add these lines to the specific half's configuration file as well as the combined configuration file. +::: + + + +In your device tree file you will need to add the following lines to define the encoder sensor: + +```dts + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = ; + b-gpios = ; + steps = <80>; + status = "disabled"; + }; +``` + +Here you need to replace `PIN_A` and `PIN_B` with the appropriate pins that your PCB utilizes for the encoder(s). See [shield overlays section above](#shield-overlays) on the appropriate node label and pin number to use for GPIOs. + +The `steps` property should corresponded to the documented pulses per rotation for the encoders used on the keyboard, typically found on the datasheet of the component. If users use different encoders when they build, the value can be overridden in their keymap. + +Add additional encoders as necessary by duplicating the above lines, replacing `left` with whatever you would like to call your encoder, and updating the pins. Note that support for peripheral (right) side sensors over BLE is still in progress. + +Once you have defined the encoder sensors, you will have to add them to the list of sensors: + +```dts + sensors: sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; + }; +``` + +In this example, a left_encoder and right_encoder are both added. Additional encoders can be added with spaces separating each, and the order they are added here determines the order in which you define their behavior in your keymap. + +In addition, a default value for the number of times the sensors trigger the bound behavior per full rotation is set via the `triggers-per-rotation` property. See [Encoders Config](../config/encoders.md#devicetree) for more details. + + + +Add the following lines to your overlay file(s) to enable the encoder: + +```dts +&left_encoder { + status = "okay"; +}; +``` + +:::note +For split keyboards, make sure to add left hand encoders to the left .overlay file and right hand encoders to the right .overlay file. +::: + + + +Add the following line to your keymap file to add default encoder behavior bindings: + +```dts +sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; +``` + +Add additional bindings as necessary to match the default number of encoders on your board. See the [Encoders](../features/encoders.md) and [Keymap](../features/keymaps.md) feature documentation for more details. + + + + +## Testing + +Once you've fully created the new keyboard shield definition, +you should be able to test with a build command like: + +```sh +west build --pristine -b nice_nano_v2 -- -DSHIELD=my_board +``` + +The above build command generates `build/zephyr/zmk.uf2`. If your board +supports USB Flashing Format (UF2), copy that file onto the root of the USB mass +storage device for your board. The controller should flash your built firmware +and automatically restart once flashing is complete. + +Alternatively, if your board supports flashing and you're not developing from +within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on +your board and run the following command to test your build: + +```sh +west flash +``` + +Please have a look at documentation specific to +[building and flashing](build-flash.md) for additional information. + +:::note +Further testing your keyboard shield without altering the root keymap file can be done with the use of `-DZMK_CONFIG` in your `west build` command, +shown [here](build-flash.md#building-from-zmk-config-folder) +::: diff --git a/docs/docs/development/local-toolchain/posix-board.md b/docs/docs/development/posix-board.md similarity index 64% rename from docs/docs/development/local-toolchain/posix-board.md rename to docs/docs/development/posix-board.md index 37a37076..5a809c02 100644 --- a/docs/docs/development/local-toolchain/posix-board.md +++ b/docs/docs/development/posix-board.md @@ -20,10 +20,11 @@ apt install -y gcc-multilib ## Building -To do this, you can build ZMK targeting the `native_sim` board. +To do this, you can build ZMK targeting the +`native_posix_64` board. ```sh -west build --pristine --board native_sim/native/64 -- -DZMK_CONFIG=tests/none/normal/ +west build --pristine --board native_posix_64 -- -DZMK_CONFIG=tests/none/normal/ ``` Once built, you can run the firmware locally: @@ -34,4 +35,4 @@ Once built, you can run the firmware locally: ## Virtual Key Events -The virtual key presses are hardcoded in `boards/extensions/native_sim/native_sim_64.overlay` file, should you want to change the sequence to test various actions like Mod-Tap, etc. +The virtual key presses are hardcoded in `boards/native_posix_64.overlay` file, should you want to change the sequence to test various actions like Mod-Tap, etc. diff --git a/docs/docs/development/local-toolchain/pre-commit.md b/docs/docs/development/pre-commit.md similarity index 91% rename from docs/docs/development/local-toolchain/pre-commit.md rename to docs/docs/development/pre-commit.md index fdc66513..b4306fc9 100644 --- a/docs/docs/development/local-toolchain/pre-commit.md +++ b/docs/docs/development/pre-commit.md @@ -22,14 +22,12 @@ Now that pre-commit is installed on your PC, you need to install it into the ZMK ```bash pre-commit install -pre-commit install --hook-type commit-msg ``` This should print a message such as ``` -pre-commit installed at .git/hooks/pre-commit -pre-commit installed at .git/hooks/commit-msg +pre-commit installed at .git\hooks\pre-commit ``` Pre-commit will now automatically check your changes whenever you run `git commit`. If it detects a problem, it will describe the problem and cancel the commit. For simple problems such as incorrect formatting, it will also automatically fix the files so you can just `git add` them and try again. diff --git a/docs/docs/development/setup.md b/docs/docs/development/setup.md new file mode 100644 index 00000000..8ce5ffde --- /dev/null +++ b/docs/docs/development/setup.md @@ -0,0 +1,317 @@ +--- +title: Toolchain Setup +sidebar_label: Toolchain Setup +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +export const OsTabs = (props) => ({props.children}); + +This guide will show you how to set up a development environment for building ZMK locally. + +## Install Dependencies + +Click the operating system you are using. (The VS Code & Docker option can be used on any OS.) + + + + +This option use the same [Docker image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. + +1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. +2. Install [Visual Studio Code](https://code.visualstudio.com/) +3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +:::info +The docker container already includes `west`. Skip past the following section to [Get Source Code](#get-source-code). +::: + + + + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) + +Return to this guide once you are finished with each section. + + + + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) + +Return to this guide once you are finished with each section. + +`dfu-util` is required to flash devices that use DFU, but there is currently no maintained package for it on Chocolatey. [QMK Toolbox](https://github.com/qmk/qmk_toolbox) contains a working version of it though. + + + + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) + +Return to this guide once you are finished with each section. + + + + +#### Install Base Dependencies + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions for Ubuntu under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) + +Return to this guide once you are finished with each section. + +#### Install Cross-Compile Toolchain + +Because Raspberry OS runs on the same architecture (but different ABI) as ARM keyboard MCUs, the operating system's installed [cross compilers](https://docs.zephyrproject.org/3.2.0/develop/toolchains/other_x_compilers.html) can be used to target the different ABI. Building for non-ARM MCUs has not been tested. + +First, the cross compiler should be installed: + +```sh +sudo apt install gcc-arm-none-eabi +``` + +Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/3.2.0/develop/env_vars.html#env-vars) needed to find the cross compiler. Create a file named `~/.zephyrrc` if it doesn't exist, and add these lines to it: + +```sh +export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile +export CROSS_COMPILE=/usr/bin/arm-none-eabi- +``` + + + + +Follow Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/installation_linux.html) documentation for Fedora. + + + + +### Install West + +`west` is the [Zephyr® Project's meta-tool](https://docs.zephyrproject.org/3.2.0/develop/west/index.html) used to configure and build Zephyr OS applications. + +West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/3.2.0/develop/west/install.html) are summarized here: + + + + +Install west: + +```sh +pip3 install --user -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure `~/.local/bin` is on your `PATH` environment variable. You can add it with these commands: + +```sh +echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc +source ~/.bashrc +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure that the Python scripts directory is on your `PATH` environment variable. You can add it by opening a PowerShell window and running the following commands: + +```powershell +$Scripts = python -c "import sysconfig; print(sysconfig.get_path('scripts'))" +$Path = [Environment]::GetEnvironmentVariable('PATH', 'User') +[Environment]::SetEnvironmentVariable('PATH', "$Path;$Scripts", 'User') +$env:PATH += ";$Scripts" +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + + + + +## Get Source Code + +Next, you'll need to clone the ZMK source repository if you haven't already. Navigate to the folder you would like to place your `zmk` directory in and run the following command: + +``` +git clone https://github.com/zmkfirmware/zmk.git +``` + +## Initialize & Update Zephyr Workspace + +Since ZMK is built as a Zephyr™ application, the next step is +to use `west` to initialize and update your workspace. The ZMK +Zephyr™ application is in the `app/` source directory: + +### Step into the repository + + + + +```sh +cd zmk +``` + + + + +```sh +cd zmk +``` + + + + +```sh +cd zmk +``` + + + + +```sh +cd zmk +``` + + + + +```sh +cd zmk +``` + + + + + +Open the `zmk` checkout folder in VS Code. The repository includes a configuration for containerized development, so an alert will pop up: + +![VS Code Dev Container Configuration Alert](../assets/dev-setup/vscode_devcontainer.png) + +Click `Reopen in Container` in order to reopen the VS Code with the running container. + +The first time you do this on your machine, it will pull the docker image down from the registry and build the container. Subsequent launches are much faster! + +:::caution +All subsequent steps must be performed from the VS Code terminal _inside_ the container. +::: + + + + +### Initialize the Application + +```sh +west init -l app/ +``` + +### Update to Fetch Modules + +```sh +west update +``` + +:::tip +This step pulls down quite a bit of tooling. Go grab a cup of coffee, it can take 10-15 minutes even on a good internet connection! +::: + +:::info +If you're using Docker, you're done with setup! You must restart the container at this point. The easiest way to do so is to close the VS Code window, verify that the container has stopped in Docker Dashboard, and reopen the container with VS Code. + +Once your container is restarted, proceed to [Building and Flashing](development/build-flash.md). +::: + +### Export Zephyr CMake package + +This allows CMake to load the code needed to build ZMK. + +```sh +west zephyr-export +``` + +### Install Zephyr Python Dependencies + +Some additional Python dependencies are listed in Zephyr's `scripts/requirements.txt` file. + + + + +```sh +pip3 install --user -r zephyr/scripts/requirements.txt +``` + + + + +```sh +pip3 install -r zephyr/scripts/requirements.txt +``` + + + + +```sh +pip3 install -r zephyr/scripts/requirements.txt +``` + + + diff --git a/docs/docs/development/studio-rpc-protocol.md b/docs/docs/development/studio-rpc-protocol.md deleted file mode 100644 index 8dba4a7d..00000000 --- a/docs/docs/development/studio-rpc-protocol.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: ZMK Studio RPC Protocol ---- - -:::danger -Before reading this section, it is **vital** that you read through our [clean room policy](./contributing/clean-room.md). -::: - -## Overview - -The ZMK Studio UI communicates with ZMK devices using a custom RPC protocol developed to be robust and reliable, while remaining simple and easy to extend with future enhancements. - -The protocol consists of [protocol buffer](https://protobuf.dev/programming-guides/proto3/) messages which are encoded/decoded using message framing, and then transmitted using an underlying transport. Two transports are currently implemented: a BLE transport using a custom GATT service and a serial port transport, which usually is used with CDC ADM devices over USB. - -## Protobuf Messages - -The messages for ZMK Studio are defined in a dedicated [zmk-studio-messages](https://github.com/zmkfirmware/zmk-studio-messages) repository. Fundamentally, the [`Request`](https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/studio.proto#L11) message is used to send any requests from the ZMK Studio client to the ZMK device, and the [`Response`](https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/studio.proto#L21) messages are sent from the ZMK device to the Studio client. - -Responses can either be [`RequestResponses`](https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/studio.proto#L28) that are sent in response to an incoming `Request` or a [`Notification`](https://github.com/zmkfirmware/zmk-studio-messages/blob/main/proto/zmk/studio.proto#L38) which is sent at any point from the ZMK device to the ZMK Studio client to inform the client about state changes on the device, e.g. that the device is unlocked. - -## Message Framing - -ZMK Studio uses a simple framing protocol to easily identify the start and end of a given message, with basic escaping to allow for unrestricted content. - -The following special bytes are used for the framing protocol: - -- Start of Frame (SoF): `0xAB` -- Escape Byte (Esc): `0xAC` -- End of Frame (EoF): `0xAD` - -A message consists of a SoF byte, the payload, escaped as needed, followed by an EoF byte. Within the payload, any of the special encoding bytes will be escaped by being prefixed with an Esc byte. - -### Example Encoding (Simple) - -Here is an example encoding when the message content does not include any of the special bytes: - -```mermaid -block-beta - columns 5 - - space:1 - block:group1:3 - columns 3 - contentLabel["Content"]:1 space:2 - OrigA["0x12"] OrigB["0x01"] OrigC["0xBB"] - end - - space - - down<[" "]>(down):5 - - block:groupSoF:1 - columns 1 - SoFLabel["SoF"] - SoF["0xAB"] - end - - block:group2:3 - columns 3 - contentLabel2["Content"]:1 space:2 - EncA["0x12"] - EncB["0x01"] - EncC["0xBB"] - end - block:groupEoF:1 - columns 1 - EoFLabel["EoF"] - 0xAD - end - - class contentLabel boxLabel - class contentLabel2 boxLabel - class SoFLabel boxLabel - class EoFLabel boxLabel - - classDef boxLabel stroke:transparent,fill:transparent -``` - -### Example Encoding (Escaping) - -When the message content includes any of the special bytes, those bytes are escaped whe framed - -```mermaid -block-beta - columns 6 - - space:1 - block:group1:4 - columns 5 - contentLabel["Content"]:1 space:4 - OrigA["0x12"] space OrigB["0xAD"] space OrigC["0xAC"] - end - - space:1 - - down<[" "]>(down):6 - - block:groupSoF:1 - columns 1 - SoFLabel["SoF"] - SoF["0xAB"] - end - - block:group2:4 - columns 5 - contentLabel2["Content"]:1 space:4 - EncA["0x12"] - EscB["0xAC"] - EncB["0xAD"] - EscC["0xAC"] - EncC["0xAC"] - end - block:groupEoF:1 - columns 1 - EoFLabel["EoF"] - 0xAD - end - - class contentLabel boxLabel - class contentLabel2 boxLabel - class SoFLabel boxLabel - class EoFLabel boxLabel - - classDef boxLabel stroke:transparent,fill:transparent -``` - -## Transports - -Two transports are available right now, over USB or Bluetooth connections. - -### USB (Serial) - -The USB transport is actually a basic serial/UART transport, that happens to use the CDC/ACM USB class for a serial connection. Framed messages are sent between ZMK Studio client and ZMK device using simple UART transmission. - -### Bluetooth (GATT) - -The bluetooth transport uses a custom GATT service to transmit/receive. The service has UUID `00000000-0196-6107-c967-c5cfb1c2482a` and has exactly one characteristic with UUID `00000001-0196-6107-c967-c5cfb1c2482a`. The characteristic accepts writes of framed client messages, and will use GATT Indications to send framed messages to the client. diff --git a/docs/docs/development/local-toolchain/tests.md b/docs/docs/development/tests.md similarity index 100% rename from docs/docs/development/local-toolchain/tests.md rename to docs/docs/development/tests.md diff --git a/docs/docs/development/usb-logging.md b/docs/docs/development/usb-logging.md new file mode 100644 index 00000000..e50e7824 --- /dev/null +++ b/docs/docs/development/usb-logging.md @@ -0,0 +1,85 @@ +--- +title: USB Logging +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## Overview + +If you are developing ZMK on a device that does not have a built in UART for debugging and log/console output, +Zephyr can be configured to create a USB CDC ACM device and the direct all `printk`, console output, and log +messages to that device instead. + +:::warning Battery Life Impact + +Enabling logging increases the power usage of your keyboard, and can have a non-trivial impact to your time on battery. +It is recommended to only enable logging when needed, and not leaving it on by default. + +::: + +## Kconfig + +The `CONFIG_ZMK_USB_LOGGING` Kconfig enables USB logging. This can be set at the keyboard level, typically in the `config/.conf` +file if you are using a [user config repository](user-setup.md). It can also be enabled at the ZMK level using the `app/prj.conf` file, or other +search locations described in the [configuration overview](config/index.md#config-file-locations). + +Logging can be further configured using Kconfig described in [the Zephyr documentation](https://docs.zephyrproject.org/3.2.0/services/logging/index.html). +For instance, setting `CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS` to a large value such as `8000` might help catch issues that happen near keyboard +boot, before you can connect to view the logs. + +:::note +In Github Actions, you can check the ` Kconfig file` step output to verify the options above have been enabled +for you successfully. +::: + +```ini +# Turn on logging, and set ZMK logging to debug output +CONFIG_ZMK_USB_LOGGING=y +``` + +## Viewing Logs + +After flashing the updated ZMK image, the board should expose a USB CDC ACM device that you can connect to and view the logs. + + + + +On Linux, this should be a device like `/dev/ttyACM0` and you can connect with `minicom` or `tio` as usual, e.g.: + +```sh +sudo tio /dev/ttyACM0 +``` + + + + +On Windows, you can use [PuTTY](https://www.putty.org/). Once installed, use Device Manager to figure out which COM port your controller is communicating on (listed under 'Ports (COM & LPT)') and specify that as the 'Serial line' in PuTTY. + +![Controller COM port](../assets/usb-logging/com.jpg) + +![PuTTY settings](../assets/usb-logging/putty.jpg) + +If you already have the Ardunio IDE installed you can also use its built-in Serial Monitor. + + + + +On macOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. +You can connect to the device with [tio](https://tio.github.io/) (can be installed via [Homebrew](https://formulae.brew.sh/formula/tio)): + +```sh +sudo tio /dev/tty.usbmodem14401 +``` + +You should see tio printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable. + + + +From there, you should see the various log messages from ZMK and Zephyr, depending on which systems you have set to what log levels. diff --git a/docs/docs/development/usb-logging.mdx b/docs/docs/development/usb-logging.mdx deleted file mode 100644 index 5a9fc868..00000000 --- a/docs/docs/development/usb-logging.mdx +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: USB Logging ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -## Overview - -If you are developing ZMK on a device that does not have a built in UART for debugging and log/console output, -Zephyr can be configured to create a USB CDC ACM device and the direct all `printk`, console output, and log -messages to that device instead. - -:::danger[Battery Life Impact] - -Enabling logging increases the power usage of your keyboard, and can have a non-trivial impact to your time on battery. -It is recommended to only enable logging when needed, and not leaving it on by default. - -::: - -## USB Logging Snippet - -The `zmk-usb-logging` snippet is used to enable logging. - -If using GitHub Actions to build your firmware, enabling logging -requires adding a `snippet: zmk-usb-logging` to your `build.yaml` file for any build you want logging enabled, e.g. - -```yaml ---- -include: - - board: nice_nano - shield: corne_left - snippet: zmk-usb-logging -``` - -When building locally, the `-S`/`--snippet` flag can be passed to `west build` to enable the snippet, e.g. - -```sh -west build -b nice_nano -S zmk-usb-logging -- -DSHIELD="corne_left" -``` - -### Additional Config - -Logging can be further configured using Kconfig described in [the Zephyr documentation](https://docs.zephyrproject.org/4.1.0/services/logging/index.html). -For instance, setting `CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS` to a large value such as `8000` might help catch issues that happen near keyboard -boot, before you can connect to view the logs. - -## Viewing Logs - -After flashing the updated ZMK image, the board should expose a USB CDC ACM device that you can connect to and view the logs. - - - - -On Linux, this should be a device like `/dev/ttyACM0` and you can connect with `minicom` or `tio` as usual, e.g.: - -```sh -sudo tio /dev/ttyACM0 -``` - - - - -On Windows, you can use [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html). Once installed, use Device Manager to figure out which COM port your controller is communicating on (listed under 'Ports (COM & LPT)') and specify that as the 'Serial line' in PuTTY. - -![Controller COM port](../assets/usb-logging/com.jpg) - -![PuTTY settings](../assets/usb-logging/putty.jpg) - -If you already have the Ardunio IDE installed you can also use its built-in Serial Monitor. - - - - -On macOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. -You can connect to the device with [tio](https://tio.github.io/) (can be installed via [Homebrew](https://formulae.brew.sh/formula/tio)): - -```sh -sudo tio /dev/tty.usbmodem14401 -``` - -Alternatively, `cu` should be preinstalled (see `man cu` for usage instructions): - -```sh -sudo cu -l /dev/tty.usbmodem14401 -``` - -You should see the console printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable. - - - - -From there, you should see the various log messages from ZMK and Zephyr, depending on which systems you have set to what log levels. - -## Adding USB Logging to a Board - -Standard boards such as the nice!nano and Seeed Studio XIAO family have the necessary configuration for logging already added, however if you are developing your own standalone board you may wish to add the ability to use USB logging in the future. - -To do so, you need to follow the upstream Zephyr [`cdc-acm-console` snippet requirements](https://docs.zephyrproject.org/4.1.0/snippets/cdc-acm-console/README.html#requirements) steps. - -Usually, this just requires ensuring that the USB node has been tagged with the `zephyr_udc0` label, e.g. - -```dts -zephyr_udc0: &usbd { - status = "okay"; -}; -``` - -## Enabling Logging on Older Boards - -Previously, enabling logging required setting the `CONFIG_ZMK_USB_LOGGING` Kconfig symbol. If for whatever reason -a custom board definition does not support the new `zmk-usb-logging` snippet, you can try setting this symbol at the keyboard level, typically in the `config/.conf` -file if you are using a [user config repository](user-setup.mdx). It can also be enabled at the ZMK level using the `app/prj.conf` file, or other -search locations described in the [configuration overview](config/index.md#config-file-locations). - -:::note -In Github Actions, you can check the ` Kconfig file` step output to verify the options above have been enabled -for you successfully. -::: - -```ini -# Turn on logging, and set ZMK logging to debug output -CONFIG_ZMK_USB_LOGGING=y -``` diff --git a/docs/docs/faq.md b/docs/docs/faq.md index fa9fcea5..edb41f3b 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -7,10 +7,10 @@ sidebar_label: FAQs As a best-in-class RTOS, Zephyr™ brings many [benefits](https://www.zephyrproject.org/benefits) to ZMK, such as: -- A _single_ platform [supporting](https://docs.zephyrproject.org/4.1.0/boards/index.html) many architectures, processors and boards. +- A _single_ platform [supporting](https://docs.zephyrproject.org/latest/boards/index.html) many architectures, processors and boards. - Optimization for low-powered, small memory footprint devices. -- Powerful hardware abstraction and configuration using [DeviceTree](https://docs.zephyrproject.org/4.1.0/build/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html). -- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/4.1.0/connectivity/bluetooth/bluetooth-qual.html) listings, making it easier for final products to obtain qualification from the Bluetooth® SIG. +- Powerful hardware abstraction and configuration using [DeviceTree](https://docs.zephyrproject.org/latest/guides/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/latest/build/kconfig/index.html). +- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/latest/connectivity/bluetooth/bluetooth-qual.html) listings, making it easier for final products to obtain qualification from the Bluetooth® SIG. - Multi-processor support, which is critical for power efficiency in upcoming MCUs. - Permissive licensing with its Apache 2.0 open source [license](https://www.apache.org/licenses/LICENSE-2.0). - A buzzing developer [community](https://github.com/zephyrproject-rtos/zephyr) including many leading [embedded technology](https://www.zephyrproject.org/project-members) companies. @@ -37,7 +37,7 @@ ZMK uses the MIT [license](https://github.com/zmkfirmware/zmk/blob/main/LICENSE) ZMK has the potential to run on any platform supported by Zephyr™. However, it’s impractical for the ZMK contributors to test all possible hardware. -The Zephyr™ [documentation](https://docs.zephyrproject.org/4.1.0/boards/index.html) describes which hardware is currently natively supported by the Zephyr™ platform. _Similar documentation covering which keyboards have been integrated into ZMK is currently being planned._ +The Zephyr™ [documentation](https://docs.zephyrproject.org/latest/boards/index.html) describes which hardware is currently natively supported by the Zephyr™ platform. _Similar documentation covering which keyboards have been integrated into ZMK is currently being planned._ ### Does ZMK compile for AVR? @@ -47,15 +47,38 @@ Sorry, Zephyr™ only supports 32-bit and 64-bit platforms. ZMK is still in its infancy, so there’s a learning curve involved. But if you’d like to try it out, please check out the development [documentation](/docs) and the other FAQs. Please keep in mind that the project team is still small, so our support capability is limited whilst we focus on development. But we’ll try our best! Interested developers are also very welcome to contribute! -### What are _boards_ and _shields_? Why not just "keyboard"? +### What is a “board”? -ZMK uses the Zephyr concepts of "boards" and "shields" to refer to different parts of a keyboard build, that in turn get combined during a firmware build. -This provides the modularity to be able to use composite keyboards with different compatible controllers. -Please see the [explainer on boards & shields](hardware-integration/index.mdx#boards--shields) for more details. +In ZMK, a _board_ defines the _PCB_ that _includes the MCU_. +For keyboards, this is one of two options: + +- Complete keyboard PCBs that include the MCU (e.g. the Planck or Preonic). +- Small MCU boards (e.g. the Proton-C or nice!nano) that expose pins and are designed to be combined with larger keyboard PCBs, or hand wired to switches to create the final keyboard. + +### What is a “shield”? + +In ZMK, a _shield_ is a _PCB_ or _hardwired set of components_ that when combined with a MCU only [board](#what-is-a-board) like the Proton-C or nice!nano, results in a complete usable keyboard. Examples would be keyboard PCBs like the Kyria or Corne. The _shield_ is usually the big PCB containing all the keys. + +### Why _boards_ and _shields_? Why not just “keyboard”? + +If you haven't already done so, please read these FAQs first: + +- [What is a “board”?](#what-is-a-board) +- [What is a "shield"?](#what-is-a-shield) + +When a keyboard accepts a small “PCB MCU module” (e.g. _Arduino Pro Micro_) for its “brains”, then it's important to conceptually separate the hardware into a [board](#what-is-a-board) PCB and a [shield](#what-is-a-shield) PCB. + +The [shield](#what-is-a-shield) is a brainless shell containing all the keys, RGB LEDs, encoders etc. It maps all of these features to a standard pin footprint, such as the Pro Micro pinout. + +To bring this brainless [shield](#what-is-a-shield) to life, you attach any MCU [board](#what-is-a-board) matching the footprint. For instance, the _nice!nano_ is _pin-compatible_ with the _Arduino Pro Micro_, so you can substitute either [board](#what-is-a-board) onto the [shield](#what-is-a-shield). But each [board](#what-is-a-board) comes with its own features (MCU, flash, BLE, etc.) which must also be handled. + +Therefore in ZMK, [board](#what-is-a-board) and [shield](#what-is-a-shield) are considered two different (but related) entities so that it’s easier to mix and match them. They are combined during a ZMK build. + +Please note, many keyboards only have a single PCB which includes the “brains” (MCU) onboard. In ZMK, these have no [shield](#what-is-a-shield), only a [board](#what-is-a-board). ### Does ZMK support wired split? -Currently, ZMK only supports wireless [split keyboards](features/split-keyboards.md). Experimental wired split support for some specific hardware designs is available for advanced users to test. +Currently, ZMK only supports wireless split, but wired split is possible and we welcome contributions! ### How is the latency? @@ -63,7 +86,7 @@ The latency of ZMK is comparable to other firmware offerings. ZMK is equipped wi ### Any chance for 2.4GHz dongle implementation? -At this time, there are no current plans to implement 2.4GHz dongle mode. This is because utilizing Nordic's proprietary 2.4GHz low level protocols requires use of the Nordic Connect SDK, which is licensed with a more restrictive license than ZMK's MIT license. However, it is possible to [create a dongle](hardware-integration/dongle.mdx) for your keyboard that runs ZMK and communicates between parts using BLE (with encryption). This results in a 3.75ms average theoretical latency from the protocol itself. +At this time, there are no current plans to implement 2.4GHz dongle mode. This is because utilizing Nordic's proprietary 2.4GHz low level protocols requires use of the Nordic Connect SDK, which is licensed with a more restrictive license than ZMK's MIT license. However, ZMK does plan to implement dongle mode using BLE (with encryption). This will result in a 3.75ms average latency from the protocol itself. ### What bootloader does ZMK use? diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md new file mode 100644 index 00000000..c1b5db5d --- /dev/null +++ b/docs/docs/features/backlight.md @@ -0,0 +1,231 @@ +--- +title: Backlight +sidebar_label: Backlight +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Backlight is a feature used to control an array of LEDs, usually placed through or under switches. + +:::info +Unlike [RGB Underglow](underglow.md), backlight can only control single color LEDs. Additionally, because backlight LEDs all receive the same power, it's not possible to dim individual LEDs. +::: + +## Enabling Backlight + +To enable backlight on your board or shield, add the following line to your `.conf` file of your user config directory as such: + +```ini +CONFIG_ZMK_BACKLIGHT=y +``` + +If your board or shield does not have backlight configured, refer to [Adding Backlight to a board or a shield](#adding-backlight-to-a-board-or-a-shield). + +## Configuring Backlight + +There are various Kconfig options used to configure the backlight feature. These can all be set in the `.conf` file. + +| Option | Description | Default | +| ------------------------------------ | ----------------------------------------------------- | ------- | +| `CONFIG_ZMK_BACKLIGHT_BRT_STEP` | Brightness step in percent | 20 | +| `CONFIG_ZMK_BACKLIGHT_BRT_START` | Default brightness in percent | 40 | +| `CONFIG_ZMK_BACKLIGHT_ON_START` | Default backlight state | y | +| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE` | Turn off backlight when keyboard goes into idle state | n | +| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB` | Turn off backlight when USB is disconnected | n | + +## Adding Backlight to a board or a shield + + + + +First, you must enable PWM by adding the following lines to your `Kconfig.defconfig` file: + +```kconfig +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT +``` + +Then you have to add the following lines to your `.dts` file: + +```dts +&pwm0 { + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ +}; +``` + +The value `ch0-pin` represents the pin that controls the LEDs. With nRF52 boards, you can calculate the value to use in the following way: you need the hardware port and run it through a function. +**32 \* X + Y** = `` where X is first part of the hardware port "PX.01" and Y is the second part of the hardware port "P1.Y". + +For example, _P1.13_ would give you _32 \* 1 + 13_ = `<45>` and _P0.15_ would give you _32 \* 0 + 15_ = `<15>`. + +If your board uses a P-channel MOSFET to control backlight instead of a N-channel MOSFET, you may want to enable `ch0-inverted`. + +Then you have to add the following lines inside the root devicetree node on the same file as before: + +```dts +/ { + backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 45>; + label = "Backlight LED 0"; + }; + }; +}; +``` + +The value inside `pwm_led_0` must be the same as you used before. + +:::info +Note that every LED inside of the backlight node will be treated as a backlight LED, so if you have other PWM LEDs you need to declare them in a separate node. Refer to [Multiple backlight LEDs](#multiple-backlight-leds) if you have multiple backlight LEDs. +::: + +Finally you need to add backlight to the `chosen` element of the root devicetree node: + +```dts +/ { + chosen { + zmk,backlight = &backlight; + }; +}; +``` + + + + +You must first add a `boards/` directory within your shield folder. For each board that supports the shield you must create a `.defconfig` file and a `.overlay` file inside the `boards/` folder. + +Inside your `.defconfig` file, add the following lines: + +```kconfig +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT +``` + +Then add the following lines to your `.overlay` file: + +```dts +&pwm0 { + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ +}; +``` + +The value `ch0-pin` represents the pin that controls the LEDs. With nRF52 boards, you can calculate the value to use in the following way: you need the hardware port and run it through a function. +**32 \* X + Y** = `` where X is first part of the hardware port "PX.01" and Y is the second part of the hardware port "P1.Y". + +For example, _P1.13_ would give you _32 \* 1 + 13_ = `<45>` and _P0.15_ would give you _32 \* 0 + 15_ = `<15>`. + +If your shield uses a P-channel MOSFET to control backlight instead of a N-channel MOSFET, you may want to enable `ch0-inverted`. + +Then you have to add the following lines inside the root devicetree node on the same file: + +```dts +/ { + backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 45>; + label = "Backlight LED 0"; + }; + }; +}; +``` + +The value inside `pwm_led_0` must be the same as you used before. + +:::info +Note that every LED inside of the backlight node will be treated as a backlight LED, so if you have other PWM LEDs you need to declare them in a separate node. Refer to [Multiple backlight LEDs](#multiple-backlight-leds) if you have multiple backlight LEDs. +::: + +Finally you need to add backlight to the `chosen` element of the root devicetree node: + +```dts +/ { + chosen { + zmk,backlight = &backlight; + }; +}: +``` + +Optionally, on Pro Micro compatible shields you can add a LED GPIO node to your devicetree, this could be useful if you want your shield to be compatible with newer or untested boards. To do that you have to enable `CONFIG_LED_GPIO` in your `.conf` file and then add the following lines inside the root devicetree node of your `.dtsi` or `.dts` file: + +```dts +/ { + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&pro_micro 20 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; +}; +``` + +If no suitable `.overlay` file is found, this node will act as a fallback, however, without PWM, backlight has limited functionality. + + + + +### Multiple backlight LEDs + +It is possible to control multiple backlight LEDs at the same time. This is useful if, for example, you have a Caps Lock LED connected to a different pin and you want it to be part of the backlight. + +In order to do that, first you need to enable PWM for each pin: + +```dts +&pwm0 { + status = "okay"; + ch0-pin = <45>; /* LED 0 */ + ch1-pin = <46>; /* LED 1 */ + ch2-pin = <47>; /* LED 2 */ + ... +}; +``` + +This part may vary based on your MCU as different MCUs may have a different number of modules and channels. + +Then you can simply add each of your LED to the backlight node: + +```dts +backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 45>; /* LED 0 */ + }; + pwm_led_1 { + pwms = <&pwm0 46>; /* LED 1 */ + }; + pwm_led_2 { + pwms = <&pwm0 47>; /* LED 2 */ + }; + ... +}; +``` diff --git a/docs/docs/features/battery.md b/docs/docs/features/battery.md index 1a34c02f..8bf78207 100644 --- a/docs/docs/features/battery.md +++ b/docs/docs/features/battery.md @@ -5,7 +5,7 @@ sidebar_label: Battery Level If your keyboard has a battery sensor, ZMK will report its battery level to the connected bluetooth host and show it on the keyboard's display, if it has one. -For [split keyboards](split-keyboards.md), only the battery level of the central (usually left) side is reported over bluetooth by default. ZMK can be [configured to report the battery levels for peripherals](../config/battery.md#peripheral-battery-monitoring), but not many host systems will display this information without additional configuration or the use of third party utilities. +For split keyboards, only the battery level of the central (usually left) side is reported over bluetooth. :::note @@ -15,5 +15,26 @@ Windows may not properly ask the keyboard to notify it of changes in battery lev ## Adding a Battery Sensor to a Board -If your keyboard is using one of the [boards supported in ZMK](../hardware.mdx) it will already be configured to sense and report battery levels. -If you are using a custom board, see [battery sensing hardware integration page](../hardware-integration/battery.md) to add support. +To enable a battery sensor on a new board, add the driver for the sensor to your board's `.dts` file. ZMK provides two drivers for estimating the battery level using its voltage: + +- `zmk,battery-voltage-divider`: Reads the voltage on an analog input pin. +- `zmk,battery-nrf-vddh`: Reads the power supply voltage on a Nordic nRF52's VDDH pin. + +See the [battery level configuration page](../config/battery.md) for the configuration supported by each driver provided by ZMK. + +Zephyr also provides some drivers for fuel gauge ICs such as the TI bq274xx series and Maxim MAX17xxx series. If you use a battery sensor that does not have an existing driver, you will need to write a new driver that supports the `SENSOR_CHAN_GAUGE_STATE_OF_CHARGE` sensor channel and contribute it to Zephyr or ZMK. + +Once you have the sensor driver defined, add a `zmk,battery` property to the `chosen` node and set it to reference the sensor node. For example: + +```dts +/ { + chosen { + zmk,battery = &vbatt; + }; + + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "VBATT"; + }; +} +``` diff --git a/docs/docs/features/beta-testing.md b/docs/docs/features/beta-testing.md new file mode 100644 index 00000000..4a159362 --- /dev/null +++ b/docs/docs/features/beta-testing.md @@ -0,0 +1,100 @@ +--- +title: Beta Testing +sidebar_label: Beta Testing +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +You may find that ZMK does not support a feature or keyboard that you are interesting in using. You may find that someone +has already taken the time to submit the feature you need as a [Pull Request](https://github.com/zmkfirmware/zmk/pulls). If you find the feature you need as a pull request, +this page is for you! + +## Developer Repositories and Branches + +For a developer to submit a pull request to ZMK, they must first clone the original ZMK repository. After they have a copy +of the source code, they may create a feature branch to work within. When they have finished, they will publish the feature +branch and create the pull request. + +### Finding the Repository Page from the Pull Request + +![PR Repository](../assets/features/beta-testing/pr-repo-branch.png) + +### Finding the Repository URL + +![Repository URL](../assets/features/beta-testing/repo-url.png) + +### Finding the Repository Branch + +![Repository URL](../assets/features/beta-testing/repo-branch.png) + +## Testing features + +Testing features will require you to modify the `west.yml` file. You will need to add a new remote for the pull request you +would like to test, and change the selected remote and revision (or branch) for the `zmk` project. + +### Examples + + + + +```yaml +manifest: + remotes: + - name: zmkfirmware + url-base: https://github.com/zmkfirmware + projects: + - name: zmk + remote: zmkfirmware + revision: main + import: app/west.yml + self: + path: config +``` + + + + +```yaml +manifest: + remotes: + - name: zmkfirmware + url-base: https://github.com/zmkfirmware + - name: okke-formsma + url-base: https://github.com/okke-formsma + projects: + - name: zmk + remote: okke-formsma + revision: macros + import: app/west.yml + self: + path: config +``` + + + + +```yaml +manifest: + remotes: + - name: zmkfirmware + url-base: https://github.com/zmkfirmware + - name: mcrosson + url-base: https://github.com/mcrosson + projects: + - name: zmk + remote: mcrosson + revision: feat-behavior-sleep + import: app/west.yml + self: + path: config +``` + + + diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index d0347e37..e58e1673 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -3,7 +3,7 @@ title: Bluetooth sidebar_label: Bluetooth --- -ZMK's bluetooth functionality allows users to connect their keyboards to hosts using Bluetooth Low Energy (BLE) technology. It also is used for [split keyboards](split-keyboards.md) to connect the two halves wirelessly. +ZMK's bluetooth functionality allows users to connect their keyboards to hosts using Bluetooth Low Energy (BLE) technology. It also is used for split keyboards to connect the two halves wirelessly. :::note @@ -22,9 +22,9 @@ The only known vulnerability in the protocol is a risk of an active man-in-the-m By default, ZMK supports five "profiles" for selecting which bonded host device should receive the keyboard input. -:::note[Connection Management] +:::note Connection Management -When pairing to a host device ZMK saves bond information to the selected profile. It will not replace this automatically when you initiate pairing with another device. To pair with a new device select an unused profile with or clearing the current profile, using the [`&bt` behavior](../keymaps/behaviors/bluetooth.md) on your keyboard. +When pairing to a host device ZMK saves bond information to the selected profile. It will not replace this automatically when you initiate pairing with another device. To pair with a new device select an unused profile with or clearing the current profile, using the [`&bt` behavior](../behaviors/bluetooth.md) on your keyboard. A ZMK device may show as "connected" on multiple hosts at the same time. This is working as intended, and only the host associated with the active profile will receive keystrokes. @@ -34,17 +34,59 @@ Failure to manage the profiles can result in unexpected/broken behavior with hos ## Bluetooth Behavior -Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](../keymaps/behaviors/bluetooth.md). Be sure to refer to that documentation to learn how to manage profiles, switch between connected hosts, etc. +Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](../behaviors/bluetooth.md). Be sure to refer to that documentation to learn how to manage profiles, switch between connected hosts, etc. -## Refreshing the HID Descriptor +## Troubleshooting -Enabling certain features or behaviors in ZMK changes the data structure that ZMK sends over USB or BLE to host devices. -This in turn requires [HID report descriptors](https://docs.kernel.org/hid/hidintro.html) to be modified for the reports to be parsed correctly. -Firmware changes that would modify the descriptor include the following: +### Connectivity Issues -- Changing any of the settings under the [HID category](../config/system.md#hid), including enabling/disabling NKRO or HID indicators -- Enabling mouse features, such as adding [mouse keys](../keymaps/behaviors/mouse-emulation.md) to your keymap +Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: -While the descriptor refresh happens on boot for USB, hosts will frequently cache this descriptor for BLE devices. -In order to refresh this cache, you need to remove the keyboard from the host device, clear the profile associated with the host on the keyboard, then pair again. -For Windows systems you might need to follow the additional instructions in [the section on troubleshooting connection issues](troubleshooting/connection-issues.mdx#windows-connected-but-not-working). +```ini +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y +``` + +For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) + +:::info +This setting can also improve the connection strength between the keyboard halves for split keyboards. +::: + +### Using bluetooth output with USB power + +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. + +## Known Issues + +There are a few known issues related to BLE and ZMK: + +### Windows Battery Reporting + +There is a known issue with Windows failing to update the battery information after connecting to a ZMK keyboard. You can work around this Windows bug by overriding a [Bluetooth config variable](../config/bluetooth.md) to force battery notifications even if a host neglects to subscribe to them: + +```ini +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +### macOS Connected But Not Working + +If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding issue, macOS may report the keyboard as connected, but fail to actually work. If this occurs: + +1. Remove the keyboard from macOS using the Bluetooth control panel. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. +1. Try connecting again from macOS. + +### Windows Connected But Not Working + +Occasionally pairing the keyboard to a Windows device might result in a state where the keyboard is connected but does not send any key strokes. +If this occurs: + +1. Remove the keyboard from Windows using the Bluetooth settings. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the Windows device is active, by pressing the correct keys for your particular keymap. +1. Turn off Bluetooth from Windows settings, then turn it back on. +1. Pair the keyboard to the Windows device. + +If this doesn't help, try following the procedure above but replace step 3 with one of the following: + +- Restart the Windows device +- Open "Device Manager," turn on "Show hidden devices" from the "View" menu, then find and delete the keyboard under the "Bluetooth" item diff --git a/docs/docs/keymaps/combos.md b/docs/docs/features/combos.md similarity index 75% rename from docs/docs/keymaps/combos.md rename to docs/docs/features/combos.md index 9616b5eb..f4664c54 100644 --- a/docs/docs/keymaps/combos.md +++ b/docs/docs/features/combos.md @@ -30,7 +30,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. - (advanced) you can specify `slow-release` if you want the combo binding to be released when all key-positions are released. The default is to release the combo as soon as any of the keys in the combo is released. -- (advanced) you can specify a `require-prior-idle-ms` value much like for [hold-taps](behaviors/hold-tap.mdx#require-prior-idle-ms). If any non-modifier key is pressed within `require-prior-idle-ms` before a key in the combo, the combo will not trigger. +- (advanced) you can specify a `require-prior-idle-ms` value much like for [hold-taps](behaviors/hold-tap.md#require-prior-idle-ms). If any non-modifier key is pressed within `require-prior-idle-ms` before a key in the combo, the combo will not trigger. :::info @@ -38,14 +38,14 @@ Key positions are numbered like the keys in your keymap, starting at 0. So, if t ::: -### Advanced Usage +### Advanced usage - Partially overlapping combos like `0 1` and `0 2` are supported. - Fully overlapping combos like `0 1` and `0 1 2` are supported. - You are not limited to `&kp` bindings. You can use all ZMK behaviors there, like `&mo`, `&bt`, `&mt`, `<` etc. -:::note[Source-specific behaviors on split keyboards] -Invoking a [source-specific behavior](../features/split-keyboards.md#source-locality-behaviors) such as one of the [reset behaviors](behaviors/reset.md) using a combo will always trigger it on the central side of the keyboard, regardless of the side that the keys corresponding to `key-positions` are on. +:::note Source-specific behaviors on split keyboards +Invoking a source-specific behavior such as one of the [reset behaviors](behaviors/reset.md) using a combo will always trigger it on the central side of the keyboard, regardless of the side that the keys corresponding to `key-positions` are on. ::: -See [combo configuration](../config/combos.md) for advanced configuration options. +See [combo configuration](/docs/config/combos) for advanced configuration options. diff --git a/docs/docs/keymaps/conditional-layers.md b/docs/docs/features/conditional-layers.md similarity index 87% rename from docs/docs/keymaps/conditional-layers.md rename to docs/docs/features/conditional-layers.md index d9d067a2..7ccfdf23 100644 --- a/docs/docs/keymaps/conditional-layers.md +++ b/docs/docs/features/conditional-layers.md @@ -47,10 +47,10 @@ Activating a `then-layer` in one conditional layer configuration can trigger the condition in another configuration, possibly repeatedly. ::: -:::warning +:::caution When configured as a `then-layer`, a layer's activation status is entirely controlled by the -conditional layers feature. Even if the layer is activated for another reason (such as a -[momentary layer](behaviors/layers.md#momentary-layer) behavior), it will be immediately -deactivated if the associated `then-layers` configuration is not met. As such, we recommend -avoiding using regular layer behaviors for `then-layer` targets. +conditional layers feature. Even if the layer is activated for another reason (such as a [momentary +layer](../behaviors/layers.md#momentary-layer) behavior), it will be immediately deactivated if the +associated `then-layers` configuration is not met. As such, we recommend avoiding using regular +layer behaviors for `then-layer` targets. ::: diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index 31e00843..38ded2d7 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -26,7 +26,7 @@ Currently the `zmk,kscan-gpio-matrix` and `zmk,kscan-gpio-direct` [drivers](../c ### Global Options You can set these options in your `.conf` file to control debouncing globally. -Values must be `<= 16383`. +Values must be <= 16383. - `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS`: Debounce time for key press in milliseconds. Default = 5. - `CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS`: Debounce time for key release in milliseconds. Default = 5. @@ -40,10 +40,10 @@ CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=3 CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS=3 ``` -### Per-Driver Options +### Per-driver Options You can add these Devicetree properties to a kscan node to control debouncing for -that instance of the driver. Values must be `<= 16383`. +that instance of the driver. Values must be <= 16383. - `debounce-press-ms`: Debounce time for key press in milliseconds. Default = 5. - `debounce-release-ms`: Debounce time for key release in milliseconds. Default = 5. diff --git a/docs/docs/features/displays.md b/docs/docs/features/displays.md index 7123b539..283bf880 100644 --- a/docs/docs/features/displays.md +++ b/docs/docs/features/displays.md @@ -6,5 +6,5 @@ sidebar_label: Displays Displays in ZMK are currently a proof of concept and official support is coming soon. :::info -Although ZMK-powered keyboards _are_ capable of utilizing OLED and ePaper displays, the Displays feature is not yet considered production-ready due to an issue where the display remains blank after resuming from [external power cutoff](../keymaps/behaviors/power.md#external-power-control). This issue can be tracked on GitHub at [zmkfirmware/zmk #674](https://github.com/zmkfirmware/zmk/issues/674). +Although ZMK-powered keyboards _are_ capable of utilizing OLED and ePaper displays, the Displays feature is not yet considered production-ready due to an issue where the display remains blank after resuming from [external power cutoff](../behaviors/power.md#external-power-control). This issue can be tracked on GitHub at [zmkfirmware/zmk #674](https://github.com/zmkfirmware/zmk/issues/674). ::: diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 5b128556..10575763 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -19,13 +19,13 @@ Keyboards and macropads with encoder support will typically take the two EC11 pi ### Rotation -Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`. See [Sensor Rotation](../keymaps/behaviors/sensor-rotate.md) for customizing this behavior. +Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`. See [Sensor Rotation](../behaviors/sensor-rotate.md) for customizing this behavior. ```dts sensor-bindings = ; ``` -- `BINDING` is either a user-defined behavior, or `&inc_dec_kp` for key presses (see [Key Press](../keymaps/behaviors/key-press.md) for details on available keycodes). +- `BINDING` is either a user-defined behavior, or `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). - `CW_KEY` is the keycode activated by a clockwise turn. - `CCW_KEY` is the keycode activated by a counter-clockwise turn. @@ -41,4 +41,4 @@ Here, the left encoder is configured to control volume up and down while the rig ## Adding Encoder Support -See the [Hardware Integration page for encoders](../hardware-integration/encoders.md) for instructions on adding them to your keyboard. +See the [New Keyboard Shield](../development/new-shield.md#encoders) documentation for how to add or modify additional encoders to your shield. diff --git a/docs/docs/keymaps/index.mdx b/docs/docs/features/keymaps.md similarity index 50% rename from docs/docs/keymaps/index.mdx rename to docs/docs/features/keymaps.md index 016e98e8..9778ecba 100644 --- a/docs/docs/keymaps/index.mdx +++ b/docs/docs/features/keymaps.md @@ -3,19 +3,25 @@ title: Keymaps & Behaviors sidebar_label: Keymaps --- -import KeymapExample from "../keymap-example.md"; +import KeymapExample from '../keymap-example.md'; +import KeymapExampleFile from '../keymap-example-file.md'; -ZMK uses a declarative approach to keymaps, using devicetree syntax to configure them in a `.keymap` file. -This declarative configuration defines the key mappings, behaviors used within them and the configuration of certain features. -These keymaps can then be updated dynamically/at runtime using the [ZMK Studio](../features/studio.md) feature, -which allows keymap modifications over USB or BLE. +ZMK uses a declarative approach to keymaps instead of using C code for all keymap configuration. +Right now, ZMK uses the devicetree syntax to declare those keymaps; future work is envisioned for +supporting dynamic loading of declarative keymaps, e.g. over USB Mass Storage or via a custom BLE +service. -## Stock and User Keymaps +:::note +For advanced users looking to implement custom behaviors for their keymaps, this will be possible +in the future by allowing user configs to add to the CMake application built by Zephyr. +::: + +## Big Picture All keyboard definitions (complete boards or shields) include the _default_ keymap for that keyboard, -so ZMK can produce a "stock" firmware for that keyboard without any further modifications. -When users complete the [user setup](../user-setup.mdx), the stock `.keymap` file is copied to the -user config directory, which can be used to [customize](../customization.md) the keymap to each user's liking. +so ZMK can produce a "stock" firmware for that keyboard without any further modifications. For users +looking to customize their keyboard's behavior, they can copy the stock `.keymap` file into their +user config directory, and customize the keymap to their liking. ## Behaviors @@ -27,29 +33,26 @@ For example, the simplest behavior in ZMK is the "key press" behavior, which res (a certain spot on the keyboard), and when that position is pressed, send a keycode to the host, and when the key position is released, updates the host to notify of the keycode being released. -For the full set of possible behaviors, see the [overview page for behaviors](behaviors/index.mdx). +For the full set of possible behaviors, start at the [Key Press](../behaviors/key-press.md) behavior. ## Layers Like many mechanical keyboard firmwares, ZMK keymaps are composed of a collection of layers, with a -minimum of at least one layer that is the default, usually near the bottom of the "layer stack". Each layer +minimum of at least one layer that is the default, usually near the bottom of the "stack". Each layer in ZMK contains a set of bindings that bind a certain behavior to a certain key position in that layer. -| ![Diagram of three layers](../assets/keymaps/layer-diagram.png) | +| ![Diagram of three layers](../assets/features/keymaps/layer-diagram.png) | | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | | _A simplified diagram showing three layers. The layout of each layer is the same (they all contain four keys), but the behavior bindings within each layer can be different._ | -All layers are assigned and referred to by a natural number, with the base layer being layer `0`. It is common to [use the C preprocessor to "name" layers](behaviors/layers.md#defines-to-refer-to-layers), making them more legible. +In addition to the base default layer (which can be changed), certain bound behaviors may also +enable/disable additional layers "on top" of the default layer. -The default layer (the base layer with index 0) is always enabled. Certain bound behaviors may enable/disable additional layers. - -When a key location is pressed/released, the _highest-valued currently active_ layer is used. The press/release event is sent to the behavior bound at that position in said layer, for it to perform whatever actions it wants to in reaction to the event. The behavior can choose to "consume" the event, or "pass it along" and let the next highest-valued active layer _also_ get the event (whose behavior may continue "passing it along"). - -Note that the _activation_ order isn't relevant for determining the priority of active layers, it is determined _only_ by the definition order. - -:::tip -If you wish to use multiple base layers (with a [toggle](behaviors/layers.md#toggle-layer)), e.g. one for QWERTY and another for Colemak layouts, you will want these layers to have the lowest value possible. In other words, one should be layer `0`, and the other should be layer `1`. This allows other momentary layers activated on top of them to work with both. -::: +When a key location is pressed/released, the stack of all active layers from "top to bottom" is used, +and the event is sent to the behavior bound at that position in each layer, for it to perform whatever +actions it wants to in reaction to the event. Those behaviors can choose to "handle" the event, and stop +it from being passed to any lower layers, or may choose to "pass it along", and let the next layer +in the stack _also_ get the event. ## Behavior Bindings @@ -93,7 +96,7 @@ The first defines the nodes for all the available behaviors in ZMK, which will b The second include brings in the defines for all the keycodes (e.g. `A`, `N1`, `C_PLAY`) and the modifiers (e.g. `LSHIFT`) used for various behavior bindings. -### Root Devicetree Node +### Root devicetree Node All the remaining keymap nodes will be nested inside of the root devicetree node, like so: @@ -118,51 +121,20 @@ Nested under the devicetree root, is the keymap node. The node _name_ itself is ### Layers -Each layer of your keymap will be nested under the keymap node. Here is an example of a layer in a 6-key macropad. +Each layer of your keymap will be nested under the keymap node. Here is a sample +that defines just one layer for this keymap: -```dts - keymap { - compatible = "zmk,keymap"; - - default_layer { // Layer 0 - display-name = "Base"; -// ---------------------------------------------- -// | Z | M | K | -// | A | B | C | - bindings = < - &kp Z &kp M &kp K - &kp A &kp B &kp C - >; - }; - }; -``` + Each layer should have: -1. A `bindings` property that will be a list of [behavior bindings](behaviors/index.mdx), one for each key position for the keyboard. +1. A `bindings` property this will be a list of behavior bindings, one for each key position for the keyboard. 1. (Optional) A `sensor-bindings` property that will be a list of behavior bindings for each sensor on the keyboard. (Currently, only encoders are supported as sensor hardware, but in the future devices like trackpoints would be supported the same way) -1. (Optional) A `display-name` property that is a string used by certain features, such as ZMK Studio and the layer status display widget. -### Multiple Layers - -Layers are numbered in the order that they appear in keymap node - the first layer is `0`, the second layer is `1`, etc. - -Here is an example of a trio of layers for a simple 6-key macropad: - - - -:::note -Even if layer `1` was to be activated after `2`, layer `2` would still have priority as it is higher valued. Behaviors such as [To Layer (`&to`)](behaviors/layers.md#to-layer) can be used to enable one layer _and disable all other non-default layers_, though. -::: +For the full set of possible behaviors, start at the [Key Press](../behaviors/key-press.md) behavior. ### Complete Example -Some examples of complete keymaps for a keyboard are: +Putting this all together, a complete [`kyria.keymap`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/kyria.keymap) looks like: -- [`corne.keymap`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/corne/corne.keymap) -- [`kyria.keymap`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/kyria.keymap) -- [`lily58.keymap`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/lily58/lily58.keymap) - -:::tip -Every keyboard comes with a "default keymap". For additional examples, the [ZMK tree's `app/boards` folder](https://github.com/zmkfirmware/zmk/blob/main/app/boards) can be browsed. -::: + diff --git a/docs/docs/features/led-indicators.md b/docs/docs/features/led-indicators.md deleted file mode 100644 index f017d5cd..00000000 --- a/docs/docs/features/led-indicators.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: LED Indicators -sidebar_label: LED Indicators ---- - -ZMK supports the following five LED indicator states from the HID specification: - -- Num Lock -- Caps Lock -- Scroll Lock -- Compose -- Kana - -If your keyboard supports this feature, ZMK will display some or all of these states on LEDs. - -The default behavior for an indicator LED is as follows: - -- If the keyboard is on battery power and idle, the LED is off. -- If the keyboard is not connected to any host, the LED is off. -- If the indicator state is active, the LED is on at full brightness. -- Otherwise, the LED is off. - -If you want to change these behaviors, you can set properties on the devicetree nodes for each indicator in your `.keymap` file. The conventional node labels for indicators are as follows: - -- `num_lock_indicator` -- `caps_lock_indicator` -- `scroll_lock_indicator` -- `compose_indicator` -- `kana_indicator` - -The examples below all use `caps_lock_indicator`. To edit a different indicator, use the relevant label for that indicator instead. - -## Idle Behavior - -The `on-while-idle` property prevents the LED from turning off when the keyboard on battery power and idle: - -```dts -&caps_lock_indicator { - on-while-idle; -}; -``` - -## LED Brightness - -The `active-brightness`, `inactive-brightness`, and `disconnected-brightness` properties control the brightness of the LED when the indicator is active, indicator is not active, and the keyboard is not connected to any host, respectively. - -For example, if you want the LED to be off when the indicator is active, 100% brightness when inactive, and 50% brightness when not connected: - -```dts -&caps_lock_indicator { - active-brightness = <0>; - inactive-brightness = <100>; - disconnected-brightness = <50>; -}; -``` - -If the LED is not configured to support brightness control, any value greater than 0 will result in maximum brightness. - -For most LEDs, you can enable PWM brightness control, though this will increase power usage slightly. See the [LED indicators hardware integration page](../hardware-integration/lighting/led-indicators.md) for details on configuring the LEDs. - -## Adding LED Indicator Support to a Keyboard - -See the [LED indicators hardware integration page](../hardware-integration/lighting/led-indicators.md) for instructions to enable this feature on a keyboard. diff --git a/docs/docs/features/lighting.md b/docs/docs/features/lighting.md deleted file mode 100644 index 2276488e..00000000 --- a/docs/docs/features/lighting.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Lighting -sidebar_label: Lighting ---- - -ZMK supports two distinct systems in order to control lighting hardware integrated into keyboards. -Your keyboard likely uses only one type, depending on the type of LED hardware it supports: - -- [RGB underglow](#rgb-underglow) system controls LED strips composed of addressable RGB LEDs. - Most keyboards that have multi-color lighting utilizes these. -- [Backlight](#backlight) system controls parallel-connected, non-addressable, single color LEDs. - These are found on keyboards that have a single color backlight that only allows for brightness control. - -:::info - -Although the naming of the systems might imply it, which system you use typically does _not_ depend on the physical location of the LEDs. -Instead, you should use the one that supports the LED hardware type that your keyboard has, as described above. - -::: - -## RGB Underglow - -RGB underglow is a feature used to control "strips" of RGB LEDs. Most of the time this is called underglow and creates a glow underneath the board using a ring of LEDs around the edge, hence the name. However, this can be extended to be used to control anything from a single LED to a long string of LEDs anywhere on the keyboard. - -:::info -RGB underglow can also be used for per-key lighting. If you have RGB LEDs on your keyboard, this is what you want. For PWM/single color LEDs, see [Backlight section below](#backlight). -::: - -ZMK relies on Zephyr's `led-strip` drivers for this feature. The following LEDs/LED families have been implemented: - -- WS2812 (includes WS2812B, WS2813, SK6812, and others) -- APA102 -- LPD880x (includes LPD8803, LPD8806, and others) - -The WS2812 LED family is by far the most popular of these types, so this page will primarily focus on working with it. - -Here you can see the RGB underglow feature in action using WS2812 LEDs. - -
- -
- -### Enabling RGB Underglow - -To enable RGB underglow on your board or shield, simply set the `CONFIG_ZMK_RGB_UNDERGLOW` configuration in the `.conf` file for your board or shield. -For example: - -```ini -CONFIG_ZMK_RGB_UNDERGLOW=y -``` - -See [Configuration Overview](../config/index.md) for more instructions on how to use Kconfig. - -If your board or shield does not have RGB underglow configured, refer to the [Adding RGB Underglow Support to a Keyboard](#adding-rgb-underglow-support-to-a-keyboard) section. - -#### Modifying the Number of LEDs - -The number of LEDs specified in the default configuration for your board or shield may not match the number you have installed. For example, the `corne` shield specifies only 10 LEDs per side while supporting up to 27. On a split keyboard, a good sign of this mismatch is if the lit LEDs on each half are symmetrical. - -The `chain-length` property of the `led_strip` node controls the number of underglow LEDs. If it is incorrect for your build, [you can change this property](../config/index.md#changing-devicetree-properties) in your `.keymap` file by adding a stanza like this one outside of any other node (i.e. above or below the `/` node): - -```dts -&led_strip { - chain-length = <21>; -}; -``` - -For split keyboards, set `chain-length` to the number of LEDs installed on each half. - -### Configuring RGB Underglow - -See [RGB underglow configuration](../config/lighting.md#rgb-underglow). - -### Adding RGB Underglow Support to a Keyboard - -See [RGB underglow hardware integration page](../hardware-integration/lighting/underglow.md) on adding underglow support to a ZMK keyboard. - -## Backlight - -Backlight is a feature used to control an array of LEDs, usually placed through or under switches. - -:::info -Unlike [RGB underglow](#rgb-underglow), backlight can only control single color LEDs. Additionally, because backlight LEDs all receive the same power, it's not possible to dim individual LEDs. -::: - -### Enabling Backlight - -To enable backlight on your board or shield, add the following line to your `.conf` file of your user config directory as such: - -```ini -CONFIG_ZMK_BACKLIGHT=y -``` - -If your board or shield does not have backlight configured, refer to [Adding Backlight to a board or a shield](#adding-backlight-to-a-board-or-a-shield). - -### Configuring Backlight - -There are various Kconfig options used to configure the backlight feature. -See [backlight configuration](../config/lighting.md#backlight) for details. - -### Adding Backlight to a Board or a Shield - -See [backlight hardware integration page](../hardware-integration/lighting/backlight.mdx) for information on adding backlight support to a ZMK keyboard. diff --git a/docs/docs/features/low-power-states.md b/docs/docs/features/low-power-states.md deleted file mode 100644 index d428d0eb..00000000 --- a/docs/docs/features/low-power-states.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Low Power States -sidebar_label: Low Power States ---- - -## Idle - -In the idle state, peripherals such as displays and lighting are disabled, but the keyboard remains connected to Bluetooth so it can immediately respond when you press a key. Idle state is entered automatically after a timeout period that is [30 seconds by default](../config/power.md#low-power-states). - -## Deep Sleep - -In the deep sleep state, the keyboard enters a software power-off state. Among others, this: - -- Disconnects the keyboard from all Bluetooth connections -- Disables any peripherals such as displays and lighting -- If possible, disables external power output -- Clears the contents of RAM, including any unsaved [Studio](studio.md) changes - -This state uses very little power, but it may take a few seconds to reconnect after waking. A [wakeup source](#wakeup-sources) is required to wake from deep sleep. - -### Config - -Deep sleep must be enabled via its corresponding [config](../config/power.md#low-power-states). - -### Wakeup Sources - -Using deep sleep requires `kscan` nodes to have the `wakeup-source` property to enable them to wake the keyboard, e.g.: - -```dts -/ { - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; - wakeup-source; - - ... - }; -}; -``` - -It is recommended to add the `wakeup-source` property to `kscan` devices even if the deep sleep feature is not used -- there is no downside to it. - -## Soft Off - -The soft off feature is used to turn the keyboard on and off explicitly, rather than through a timeout like the deep sleep feature. Depending on the keyboard, this may be through a dedicated on/off push button defined in hardware, or merely through an additional binding in the keymap to turn the device off and an existing reset button to turn the device back on. - -The device enters the same software power-off state as in deep sleep, but is significantly more restrictive in the sources which can wake it. Power is _not_ technically removed from the entire system, unlike a hardware switch. - -The feature is intended as an alternative to using a hardware switch to physically cut power from the battery to the keyboard. This can be useful for existing PCBs not designed for wireless that don't have a power switch, or for new designs that favor a push button on/off like found on other devices. It yields power savings comparable to the deep sleep state. - -A device can be put in the soft off state by: - -- Triggering a hardware-defined dedicated GPIO pin, if one exists; -- Triggering the [soft off behavior](../keymaps/behaviors/soft-off.md) from the keymap. - -Once in the soft off state, the device can only be woken up by: - -- Triggering any GPIO pin specified to enable waking from sleep, if one exists; -- Pressing a reset button found on the device. - -The GPIO pin used to wake from sleep can be a hardware-defined one, such as for a dedicated on-off push button, or it can be a single specific key switch reused for waking up (which may be accidentally pressed, e.g. while the device is being carried in a bag). To allow the simultaneous pressing of multiple key switches to trigger and exit soft off, some keyboards make use of additional hardware to integrate the dedicated GPIO pin into the keyboard matrix. - -### Config - -Soft off must be enabled via [its corresponding config](../config/power.md#low-power-states) before it can be used. - -### Using Soft Off - -If your keyboard has hardware designed to take advantage of soft off, refer to your keyboard's documentation. - -For keyboards which do not have such hardware, using soft off is as simple as placing the [soft off behavior](../keymaps/behaviors/soft-off.md) in your keymap and then invoking it. - -You can then wake up the keyboard by pressing the reset button once, and repeating this for each side for split keyboards. - -### Adding Soft Off to a Keyboard - -Please refer to the [corresponding page under hardware integration](../hardware-integration/soft-off-setup.mdx) for details. diff --git a/docs/docs/features/modules.mdx b/docs/docs/features/modules.mdx deleted file mode 100644 index 898c294b..00000000 --- a/docs/docs/features/modules.mdx +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Modules -sidebar_label: Modules ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -ZMK makes use of [Zephyr modules](https://docs.zephyrproject.org/4.1.0/develop/modules.html) to include additional source code or configuration files into its build. You can think of them as similar to plugins or themes. The most common uses of this feature are: - -- Building firmware for a keyboard external to ZMK's tree -- Adding functionality to ZMK, such as a driver or a behavior - -A common ZMK setup thus consists of the following separate components, commonly housed in their respective Git repositories: - -- A single ZMK config maintained by the user, containing the `.conf` and `.keymap` files for one or multiple keyboards. This is also where files from ZMK or modules should be overridden/modified, if there is a need. -- Any number of ZMK modules, maintained by the module's owner. Some modules may contain multiple keyboards or functionalities. If all of your keyboards and functionalities are internal to ZMK's tree, then no modules are necessary. -- The ZMK firmware itself, maintained by its contributors. - -:::note -The shift to using modules for keyboards is a relatively recent one, and not all designs may be properly configured to be used as a module. If this is the case for your keyboard, then we would strongly suggest asking your vendor or designer to rectify this. -::: - -## Building With Modules - -### GitHub Actions - -When [using GitHub Actions to build ZMK](../user-setup.mdx), adding modules is as simple as modifying the `west.yml` found in your `zmk-config`'s `config` directory. The recommended way of doing so is: - -1. Find the URL base (the parent URL) for the module and add it as an entry to the [remotes](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html#remotes). -2. Add the module as an entry to the [projects](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html#projects). - Aside from the mandatory `name`, `remote`, and the commonly used `revision` properties, take note of the `import` property under `projects`. Some modules may have other modules as dependencies. This property allows the specifying of an additional west manifest file found in the tree of the module, which will automatically import all dependencies. - -For more information on `west.yml`, see [West Manifests](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html). - -#### Examples - - - - -```yaml -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - projects: - - name: zmk - remote: zmkfirmware - revision: main - import: app/west.yml - self: - path: config -``` - - - - -```yaml -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - - name: module_a_base - url-base: https://github.com/alice - projects: - - name: zmk - remote: zmkfirmware - revision: main - import: app/west.yml - - name: module_a - remote: module_a_base - revision: main - self: - path: config -``` - - - - -```yaml -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - - name: module_a_base - url-base: https://github.com/alice - - name: module_b_base - url-base: https://github.com/bob - projects: - - name: zmk - remote: zmkfirmware - revision: main - import: app/west.yml - - name: module_a - remote: module_a_base - revision: main - - name: module_b - remote: module_b_base - revision: main - import: west.yml - self: - path: config -``` - - - - -### Building Locally - -To add a module to your build when building locally, you will need to clone/copy said module into your local file tree. You can then build using the module as described in [Building with External Modules](../development/local-toolchain/build-flash.mdx#building-with-external-modules). - -## Beta Testing - -You may find that there are some features which you desire for which there is a [Pull Request](https://github.com/zmkfirmware/zmk/pulls), but no module. If this is the case, you can still make use of the feature. - -### Developer Repositories and Branches - -For a developer to submit a pull request to ZMK, they must first clone the original ZMK repository. After they have a copy -of the source code, they may create a feature branch to work within. When they have finished, they will publish the feature -branch and create the pull request. - -#### Finding the repository page from the Pull Request - -![PR Repository](../assets/features/beta-testing/pr-repo-branch.png) - -#### Finding the repository URL - -![Repository URL](../assets/features/beta-testing/repo-url.png) - -#### Finding the repository branch - -![Repository URL](../assets/features/beta-testing/repo-branch.png) - -## Testing Features - -### GitHub Actions - -When [using GitHub Actions to build ZMK](../user-setup.mdx), once you have obtained the correct URL, you'll need to modify the `west.yml` file similarly to [Building With Modules](#building-with-modules). Add the remote for the branch like in said section. The difference is that you will need to change the selected remote and revision (or branch) for the `zmk` project. - -#### Example - - - - -```yaml -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - projects: - - name: zmk - remote: zmkfirmware - revision: main - import: app/west.yml - self: - path: config -``` - - - - -```yaml -manifest: - remotes: - - name: zmkfirmware - url-base: https://github.com/zmkfirmware - - name: forkedzmk - url-base: https://github.com/forkedzmk - projects: - - name: zmk - remote: forkedzmk - revision: specificpr - import: app/west.yml - self: - path: config -``` - - - - -### Building Locally - -When building from a pull request locally, you'll need to [perform the local user setup](../development/local-toolchain/setup/index.md), but using the repository of the pull request rather than the official ZMK repository. You can then [build and flash](../development/local-toolchain/build-flash.mdx) as usual. - -## Creating a ZMK Module - -Please see the dedicated page [here](../development/module-creation.md) for information on creating modules. diff --git a/docs/docs/features/pointing.md b/docs/docs/features/pointing.md deleted file mode 100644 index 92772722..00000000 --- a/docs/docs/features/pointing.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Pointing Devices ---- - -ZMK supports physical pointing devices, as well as [mouse emulation behaviors](../keymaps/behaviors/mouse-emulation.md) for sending HID pointing events to hosts. - -## Configuration - -To enable the pointer functionality, you must set `CONFIG_ZMK_POINTING=y` in your config. See the [pointer configuration](../config/pointing.md) for the full details. - -:::warning - -When enabling the feature, changes are made to the HID report descriptor which some hosts may not pick up automatically over BLE. Be sure to [remove and re-pair to your hosts](bluetooth.md#refreshing-the-hid-descriptor) once you enable the feature. - -::: - -## Mouse Emulation - -Mouse emulation allows you to use your keyboard as a pointing device without using dedicated pointer hardware, like an integrated trackpad, trackball, etc. By adding new bindings in your keymap like `&mmv MOVE_UP` you can make key presses send mouse HID events to your connected hosts. - -See the [mouse emulation behaviors](../keymaps/behaviors/mouse-emulation.md) for details. - -## Physical Pointing Devices - -There are a few drivers available for supporting physical pointing devices integrated into a ZMK powered device. When doing so, you can use your device as both a keyboard and a pointing device with any connected hosts. The functionality can be extended further, e.g. slow mode, scroll mode, temporary mouse layers, etc. by configuring [input processors](#input-processors) linked to the physical pointing device. - -For more information, refer to the [pointer hardware integration](../hardware-integration/pointing.mdx) documentation. - -## Input Processors - -Input processors are small pieces of functionality that process and optionally modify events generated from emulated and physical pointing devices. Processors can do things like scaling movement values to make them larger or smaller for detailed work, swapping the event types to turn movements into scroll events, or temporarily enabling an extra layer while the pointer is in use. - -For more details, see the [input processors](../keymaps/input-processors/index.md) section of the keymap documentation. - -## Input Listeners - -Listeners are the key piece that integrate the low level input devices to the rest of the ZMK system. In particular, listeners subscribe to input events from the linked device, and when a given event occurs (e.g. X/Y movement), apply any input processors before sending those events to the HID system for notification to the host. The main way to modify the way a pointer behaves is by configuring the input processors for a given listener. - -For more details on assigning processors to your listeners, see the [input processor usage](../keymaps/input-processors/usage.md) documentation. diff --git a/docs/docs/features/split-keyboards.md b/docs/docs/features/split-keyboards.md deleted file mode 100644 index 1f3e6675..00000000 --- a/docs/docs/features/split-keyboards.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Split Keyboards -sidebar_label: Split Keyboards ---- - -ZMK supports setups where a keyboard is split into two or more physical parts (also called "sides" or "halves" when split in two), each with their own controller running ZMK. The parts communicate with each other to work as a single keyboard device. - -## Central and Peripheral Roles - -In split keyboards running ZMK, one part is assigned the "central" role which receives key position and sensor events from the other parts that are called "peripherals." -The central runs the necessary keymap logic to convert received events into HID events such as keycodes and then communicates with the connected host devices, e.g. over USB or bluetooth. If the keyboard makes use of a [dongle](../hardware-integration/dongle.mdx), then the dongle takes on the role of central. - -The internal keyboard state (like active layers) is handled exclusively by the central. -Peripherals _cannot_ communicate with host devices on their own, since they can only communicate with the central. -They will not present as keyboard devices when connected over USB and will not advertise as pairable BLE keyboards. - -By convention, for a keyboard split into two "halves" the left half is set as the central and the right as a peripheral. - -:::info[Battery life impact] -For BLE-based split keyboards, the central uses significantly more power than the peripherals because its radio needs to periodically wake up to check for incoming transmissions. -You can refer to the [power profiler](/power-profiler) to see battery life estimates for different roles. -::: - -### Configuration - -The [new shield guide](../hardware-integration/new-shield.mdx) details how to define a split keyboard shield with two parts, enabling the split feature and setting up the necessary roles for each part. - -Also see the reference section on [split keyboards configuration](../config/split.md) where the relevant symbols include `CONFIG_ZMK_SPLIT` that enables the feature, `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` which sets the central role and `CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS` that sets the number of peripherals. - -### Latency Considerations - -Since peripherals communicate through centrals, the key and sensor events originating from them will naturally have a larger latency, especially with a wireless split communication protocol. -For the currently used BLE-based transport, split communication increases the average latency by 3.75ms with a worst case increase of 7.5ms. - -## Split Transports - -ZMK supports two transports for connecting split parts: Bluetooth and full-duplex wired UART. Only one transport can be active at a time, so designs involving some portions connected via Bluetooth and others via full-duplex wired are _not_ supported. - -:::warning[Hot Plugging Cables] - -Many popular cables, in particular, TRRS/TRS cables, can cause irreparable damage to controllers if they are inserted or removed when power is already present on them. Whether or not you are using the wired split functionality or not, _never_ insert or remove such a cable when a controller is powered by USB _or_ battery. - -::: - -### Bluetooth - -[Bluetooth](./bluetooth.md) is the most well tested and flexible transport available in ZMK. Using Bluetooth, a central can connect to multiple peripherals, enabling the use of a [dongle](../hardware-integration/dongle.mdx) to improve battery life, or allowing for multi-part split keyboards. - -This transport will be enabled for designs that set `CONFIG_ZMK_SPLIT=y` and have `CONFIG_ZMK_BLE=y` set by a supported MCU/controller. - -### Full-Duplex Wired (UART) - -The full-duplex wired UART transport is a recent addition, and is intended for testing by early adopters. It allows for fully functional communication between one central and one peripheral. Unlike the Bluetooth transport, the central cannot currently have more than one peripheral connected via wired split. - -This transport will be enabled for designs that set `CONFIG_ZMK_SPLIT=y` and have a node with `compatible = "zmk,wired-split";` present in their devicetree configuration. - -:::note[Full Duplex vs Half Duplex] -Full-duplex UART requires the use of two wires connecting the halves. Future half-duplex (single-wire) UART support, which is planned, will allow using wired ZMK with designs such as the Corne, Sweep, etc. that use only a single GPIO pin for bidirectional communication between split sides. - -Until half-duplex support is completed, those particular designs will not work with the wired split transport, and can only be used with the Bluetooth transport. -::: - -### Runtime Switching - -ZMK features highly experimental support for switching between the two available transports. This requires specially designed hardware, and attempting to use this feature on a keyboard not explicitly designed for it (e.g. Corne, Sofle) _WILL_ cause permanent damage. - -Currently, there are no open source/reference designs that implement this functionality, and only experienced designers with extensive EE knowledge should attempt to implement a design with this functionality. - -## Building and Flashing Firmware - -ZMK split keyboards require building and flashing different firmware files for each split part. -For instance when [using the GitHub workflow](../user-setup.mdx) to build two part split keyboards, two firmware files that typically contain `_left` and `_right` in the file names will be produced. -These files need to be flashed to the respective controllers of the two halves. - -:::tip[Updating your keymap] -Since the keymap processing is primarily done on the central side, for keymap changes it will typically be enough to flash the controller of the central half. -However if you make changes to [config files](../config/index.md) that should apply to all parts, you need to flash to all parts. -Any changes in ZMK related to split keyboard features might also necessitate doing this. -::: - -## Pairing for Wireless Split Keyboards - -Split keyboards with BLE-based split communications (i.e. all officially supported split keyboards) have an internal pairing procedure between the central and each peripheral. -When the central has an open slot for a peripheral, it will advertise for connections (which will not be visible to non-ZMK devices). -Then, any peripheral that has not yet bonded to a central will pair to it. -Similar to how [bluetooth profiles](bluetooth.md) are managed between the keyboard and host devices, the bonding information will be stored with the corresponding hardware addresses of the other keyboard part, on both the central and peripheral. - -In practice, this means that your split keyboard parts will automatically pair and work the first time they are all on at the same time. -However, if this process somehow went wrong or you used controllers in a different split keyboard configuration before, you will need to explicitly clear the stored bond information so that the parts can pair properly. -For this, please follow [the specified procedure](../troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair) in the troubleshooting section. - -:::warning -If the central keyboard part is either advertising for a pairing or waiting for disconnected peripherals, it will consume more power and drain batteries faster. -::: - -## Behaviors with Locality - -Most ZMK [behaviors](../keymaps/behaviors/index.mdx) are processed exclusively on the central of the split keyboard as it handles the keymap state and any communication with the host devices. -However, certain behaviors have "global" or "source" localities, where they can affect the peripherals when invoked. - -### Global Locality Behaviors - -These are behaviors that affect all keyboard parts, such as changing lighting effects: - -- [RGB underglow behaviors](../keymaps/behaviors/underglow.md) -- [Backlight behaviors](../keymaps/behaviors/backlight.md) -- [Power management behaviors](../keymaps/behaviors/power.md) -- [Soft off behavior](../keymaps/behaviors/soft-off.md) - -### Source Locality Behaviors - -These behaviors only affect the keyboard part that they are invoked from: - -- [Reset behaviors](../keymaps/behaviors/reset.md) - -:::note[Peripheral invocation] -Peripherals must be paired and connected to the central in order to be able to activate these behaviors, even if it is possible to trigger the behavior using only keys on a particular peripheral. -This is because the key bindings are processed on the central side which would then instruct the peripheral side to run the behavior's effect. -::: - -:::note[Combos] -[Combos](../keymaps/combos.md) always invoke behaviors with source locality on the central. -::: diff --git a/docs/docs/features/studio.md b/docs/docs/features/studio.md deleted file mode 100644 index 19760245..00000000 --- a/docs/docs/features/studio.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: ZMK Studio ---- - -ZMK Studio provides runtime update functionality to ZMK powered devices, allowing users to change their keymap layers without flashing new firmware to their keyboards. - -:::info - -To use ZMK Studio, a keyboard needs to be [configured appropriately](#adding-zmk-studio-support-to-a-keyboard). ZMK has updated some, but not all, of its in-tree keyboards for use with ZMK Studio, the list of which can be found in the [ZMK Studio blog post](/blog/2024/11/11/zmk-studio-mvp-ga). If your keyboard is supported by an external module/config, check with the maintainer to see if support has been added. - -::: - -## Capabilities - -ZMK Studio currently has the following capabilities: - -| Legend: | ✅ Supported | 🚧 Under Development | 💡 Planned | 🕯️ Low Priority | ❌ Not Planned | -| :------ | :----------- | :------------------- | :--------- | :-------------- | -------------- | - -| Status | Feature/Capability | -| :----: | ----------------------------------------------------------------------------------------------------------------------------------------- | -| ✅ | Making keymap changes while keyboard is in use | -| ✅ | Making changes while connected via USB | -| ✅ | Native app for: Windows, Linux, MacOS | -| ✅ | Making changes while connected via BLE (Linux web-app & native apps only) | -| ✅ | Assigning [predefined behaviors](../keymaps/behaviors/index.mdx) to keys | -| ✅ | Assigning [user-defined behaviors](../keymaps/behaviors/index.mdx#user-defined-behaviors) to keys | -| 💡 | [Configuring basic behavior properties](../config/behaviors.md) | -| 💡 | Configuring advanced behavior properties, e.g. [tap dance](../keymaps/behaviors/tap-dance.mdx), [macros](../keymaps/behaviors/macros.md), | -| ❌ | Defining new behaviors not specified in devicetree | -| 💡 | Configuring [combos](../keymaps/combos.md) | -| 💡 | Configuring [conditional layers](../keymaps/conditional-layers.md) | -| 🕯️ | Assigning behaviors to encoders | -| ✅ | Selecting alternative pre-defined physical layouts for the keyboard | -| ❌ | Defining new physical layouts for the keyboard | -| ✅ | Renaming layers & enabling [extra layers](#including-extra-layers) | -| ❌ | Adding more layers than specified by devicetree | -| 💡 | Host locale selection | -| 💡 | Importing and exporting keymaps | - -Items listed as "planned", "under development", "low priority", or "not planned" can be configured using [devicetree](../config/index.md#devicetree-files) instead. - -## Keymap Changes - -To unlock your keyboard to allow ZMK Studio to make changes, you'll need to add a [`&studio_unlock`](../keymaps/behaviors/studio-unlock.md) binding to the keymap. - -:::note - -Once using ZMK Studio to manage your keymap, any future changes made to the `.keymap` file for your keyboard will not be applied unless you perform a "Restore Stock Settings" action from the ZMK Studio UI. - -Generally, if you intend to use ZMK Studio, then you should not make any further changes to the `.keymap` file (with the exception of adding new empty layers to then use within ZMK Studio). - -::: - -## Accessing ZMK Studio - -You can use ZMK Studio with Chrome/Edge at . - -To use the native app for Linux, macOS, or Windows, visit the [download page](https://zmk.studio/download). - -:::warning - -To use ZMK Studio over USB, you need permission to access the USB serial port. This most commonly occurs on Linux, with various distributions having different methods of resolving the error. For example, you may need to be added to a `uucp` or a `dialout` group. Refer to your operating system's documentation for more information. - -::: - -:::note - -If you are connected to the computer over both USB and BLE endpoints, you should set the keyboard output to the same endpoint that you connect to ZMK Studio using. -For example, if you are connecting to ZMK Studio over USB, ensure that USB output is selected by invoking the `&out OUT_USB` [behavior](../keymaps/behaviors/outputs.md). - -::: - -## Building - -Building for ZMK Studio involves two main additional items. - -- Build with the `studio-rpc-usb-uart` snippet to enable the endpoint used for ZMK Studio communication over USB. -- Enable the `ZMK_STUDIO` Kconfig setting. - -### GitHub Actions - -Add a `studio-rpc-usb-uart` to the `snippet` property of your build configuration, in the `build.yaml` file at the root of your user config. Enabling the `ZMK_STUDIO` Kconfig setting can also be done from the `build.yaml` file using the `cmake-args` property. - -For a split keyboard, you should do this _only_ for your central/left side, e.g.: - -```yaml title="build.yaml" ---- -include: - - board: nice_nano - shield: corne_left - snippet: studio-rpc-usb-uart - cmake-args: -DCONFIG_ZMK_STUDIO=y - - board: nice_nano - shield: corne_right -``` - -### Local Build - -When building locally, use the `-S` parameter to include the `studio-rpc-usb-uart` snippet. Instead of adding it to your config file, you can also append the `ZMK_STUDIO` Kconfig as an additional CMake argument, e.g.: - -```bash -west build -d build/cl_studio -b nice_nano \ - -S studio-rpc-usb-uart -- -DSHIELD=corne_left -DCONFIG_ZMK_STUDIO=y -``` - -## Including Unreferenced Behaviors - -Normally, ZMK will only build and include behaviors that are referenced by your keymap and unused behavior will be skipped. However, ZMK Studio builds using the `studio-rpc-usb-uart` snippet will automatically define the `ZMK_BEHAVIORS_KEEP_ALL` value, which changes the approach and builds all possible behaviors into the firmware. This lets those behaviors be used in ZMK Studio. - -A few controls are available to override this behavior for fine-grained control of what behaviors are built. Behaviors can be kept or omitted by defining certain values in the top of your keymap file, _before_ the standard `behaviors.dtsi` file is included. - -By convention, the defines used to keep/omit a given behavior are typically upper-cased versions of the behavior label, e.g. for the `&kt` behavior, the suffix to use would be `_KT`. - -### Omit Specific Behaviors - -You can omit a specific behaviors by defining a variable like `ZMK_BEHAVIORS_OMIT_KT` at the top of your keymap: - -```dts -#define ZMK_BEHAVIORS_OMIT_KT - -#include -``` - -### Keep Only Selective Behaviors - -To override the default "keep all" functionality, you can undefine the `ZMK_BEHAVIORS_KEEP_ALL` flag, and then keep only specific behaviors with a flag like `ZMK_BEHAVIORS_KEEP_KT`, e.g.: - -```dts -#undef ZMK_BEHAVIORS_KEEP_ALL - -#define ZMK_BEHAVIORS_KEEP_SK -#define ZMK_BEHAVIORS_KEEP_MT -#define ZMK_BEHAVIORS_KEEP_KT - -#include -``` - -## Including Extra Layers - -By default, a build with ZMK Studio enabled will only allow as many layers as are defined in your standard keymap. To make additional layers available for use through ZMK Studio, you simply add new empty layers to your keymap with a status of `reserved`, e.g.: - -```dts -/ { - keymap { - compatible = "zmk,keymap"; - - base { - display-name = "Base"; - bindings = // etc. - }; - - fn_layer { - display-name = "Fn"; - bindings = // etc. - }; - - extra1 { - status = "reserved"; - }; - - extra2 { - status = "reserved"; - }; - } -} -``` - -The reserved layers will be ignored during regular ZMK builds but will become available for ZMK Studio enabled builds. - -## Adding ZMK Studio Support to a Keyboard - -To allow ZMK Studio to be used with a keyboard, the keyboard will need to have a physical layout with the `keys` property defined. The keyboard should also **not** have a `chosen` `zmk,matrix-transform`. Relevant information can be found in: - -- The [dedicated page on physical layouts](../hardware-integration/physical-layouts.md), informing you how to define one -- The [new shield guide](../hardware-integration/new-shield.mdx), informing you how to select a physical layout once defined -- The corresponding [configuration page](../config/layout.md#physical-layout), for reference - -To use the `studio-rpc-usb-uart` snippet, the keyboard also needs to be configured to allow CDC-ACM console snippets (this is also used for [USB logging](../development/usb-logging.mdx)). If your keyboard is a composite keyboard, consisting of an in-tree board and a shield, then you can skip this step as the board will already be configured properly. Relevant information on that can be found [in the Zephyr documentation](https://docs.zephyrproject.org/4.1.0/snippets/cdc-acm-console/README.html). - -Firmware with ZMK Studio enabled require significantly more RAM. Some MCUs, such as the STM32F072 series, will require fine tuning of various settings in order to reduce the RAM consumption enough for a Studio enabled build to fit. - -Finally, once you have successfully built and tested firmware with ZMK Studio enabled, add the `studio` flag to your keyboard's [metadata](../hardware-integration/hardware-metadata-files#features). diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md new file mode 100644 index 00000000..b5c4c703 --- /dev/null +++ b/docs/docs/features/underglow.md @@ -0,0 +1,178 @@ +--- +title: RGB Underglow +sidebar_label: RGB Underglow +--- + +RGB underglow is a feature used to control "strips" of RGB LEDs. Most of the time this is called underglow and creates a glow underneath the board using a ring of LEDs around the edge, hence the name. However, this can be extended to be used to control anything from a single LED to a long string of LEDs anywhere on the keyboard. + +:::info +RGB underglow can also be used for under-key lighting. If you have RGB LEDs on your keyboard, this is what you want. For PWM/single color LEDs, see [Backlight](backlight.md). +::: + +ZMK supports all the RGB LEDs supported by Zephyr. Here's the current list supported: + +- WS2812-ish (WS2812B, WS2813, SK6812, or compatible) +- APA102 +- LPD880x (LPD8803, LPD8806, or compatible) + +Of the compatible types, the WS2812 LED family is by far the most popular type. Currently each of these types of LEDs are expected to be run using SPI with a couple of exceptions. + +Here you can see the RGB underglow feature in action using WS2812 LEDs. + +
+ +
+ +## Enabling RGB Underglow + +To enable RGB underglow on your board or shield, simply enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file for your board or shield. +For example: + +```ini +CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +CONFIG_WS2812_STRIP=y +``` + +See [Configuration Overview](/docs/config) for more instructions on how to +use Kconfig. + +If your board or shield does not have RGB underglow configured, refer to [Adding RGB Underglow to a Board](#adding-rgb-underglow-to-a-board). + +### Modifying the number of LEDs + +A common issue when enabling underglow is that some of the installed LEDs do not illuminate. This can happen when a board's default underglow configuration accounts only for either the downward facing LEDs or the upward facing LEDs under each key. On a split keyboard, a good sign that this may be the problem is that the unilluminated LEDs on each half are symmetrical. + +The number of underglow LEDs is controlled by the `chain-length` property in the `led_strip` node. You can [change the value of this property](../config/index.md#changing-devicetree-properties) in the `.keymap` file by adding a stanza like this one outside of any other node (i.e. above or below the `/` node): + +```dts +&led_strip { + chain-length = <21>; +}; +``` + +where the value is the total count of LEDs (per half, for split keyboards). + +## Configuring RGB Underglow + +See [RGB underglow configuration](/docs/config/underglow). + +## Adding RGB Underglow to a Board + +RGB underglow is always added to a board, not a shield. This is a consequence of needing to configure SPI to control the LEDs. +If you have a shield with RGB underglow, you must add a `boards/` directory within your shield folder to define the RGB underglow individually for each board that supports the shield. +Inside the `boards/` folder, you define a `.overlay` for each different board. +For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines the RGB underglow for the `nice_nano` board specifically. + +### nRF52-based boards + +With nRF52 boards, you can just use `&spi3` and define the pins you want to use. + +Here's an example on a definition that uses P0.06: + +```dts +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; +``` + +:::info + +If you are configuring SPI for an nRF52 based board, double check that you are using pins that aren't restricted to low frequency I/O. +Ignoring these restrictions may result in poor wireless performance. You can find the list of low frequency I/O pins for the nRF52840 [here](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fps_nrf52840%2Fpin.html&cp=4_0_0_6_0). + +::: + +:::note + +Standard WS2812 LEDs use a wire protocol where the bits for the colors green, red, and blue values are sent in that order. +If your board/shield uses LEDs that require the data sent in a different order, the `color-mapping` property ordering should be changed to match. + +::: + +### Other boards + +For other boards, you must select an SPI definition that has the `MOSI` pin as your data pin going to your LED strip. + +Here's another example for a non-nRF52 board on `spi3`: + +```dts +#include + +&spi3 { + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; + spi-max-frequency = <5250000>; + + /* WS2812 */ + chain-length = <10>; /* number of LEDs */ + spi-one-frame = <0x70>; /* make sure to configure this properly for your SOC */ + spi-zero-frame = <0x40>; /* make sure to configure this properly for your SOC */ + color-mapping = ; + }; +}; +``` + +Once you have your `led_strip` properly defined you need to add it to the root devicetree node `chosen` element: + +```dts +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; +``` + +Finally you need to enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file of your board (or set a default in the `Kconfig.defconfig`): + +```ini +CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +CONFIG_WS2812_STRIP=y +``` diff --git a/docs/docs/hardware-integration/battery.md b/docs/docs/hardware-integration/battery.md deleted file mode 100644 index 9b717baf..00000000 --- a/docs/docs/hardware-integration/battery.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Battery Sensing -sidebar_label: Battery Sensing ---- - -If your keyboard is using one of the [boards supported in ZMK](../hardware.mdx) it will already be configured to [sense and report battery levels](../features/battery.md). -Below instructions are only intended for users defining and using a custom board. - -To enable a battery sensor on a new board, add the driver for the sensor to your board's `.dts` file. ZMK provides two drivers for estimating the battery level using its voltage: - -- `zmk,battery-voltage-divider`: Reads the voltage on an analog input pin. -- `zmk,battery-nrf-vddh`: Reads the power supply voltage on a Nordic nRF52's VDDH pin. - -See the [battery level configuration page](../config/battery.md) for the configuration supported by each driver provided by ZMK. - -Zephyr also provides some drivers for fuel gauge ICs such as the TI bq274xx series and Maxim MAX17xxx series. If you use a battery sensor that does not have an existing driver, you will need to write a new driver that supports the `SENSOR_CHAN_GAUGE_STATE_OF_CHARGE` sensor channel and contribute it to Zephyr or ZMK. - -Once you have the sensor driver defined, add a `zmk,battery` property to the `chosen` node and set it to reference the sensor node. For example: - -```dts -/ { - chosen { - zmk,battery = &vbatt; - }; - - vbatt: vbatt { - compatible = "zmk,battery-nrf-vddh"; - }; -} -``` diff --git a/docs/docs/hardware-integration/bootloader/_base-config.md b/docs/docs/hardware-integration/bootloader/_base-config.md deleted file mode 100644 index 3172ec9f..00000000 --- a/docs/docs/hardware-integration/bootloader/_base-config.md +++ /dev/null @@ -1,13 +0,0 @@ -## Kconfig Symbol Enablement - -Three Kconfig symbols need to be enabled for this feature to work, namely `RETAINED_MEM`, `RETENTION`, and `RETENTION_BOOT_MODE`. Typically, this is done by `imply`ing the symbols for the board symbol in the `Kconfig.`, file, e.g.: - -```dts -config BOARD_TOFU65 - select SOC_RP2040 - imply RETAINED_MEM - imply RETENTION - imply RETENTION_BOOT_MODE -``` - -By using `imply` at the board level, users of the board can choose to override the setting and disable the feature if they so choose. diff --git a/docs/docs/hardware-integration/bootloader/adafruit-nrf52.mdx b/docs/docs/hardware-integration/bootloader/adafruit-nrf52.mdx deleted file mode 100644 index 0e06ea7e..00000000 --- a/docs/docs/hardware-integration/bootloader/adafruit-nrf52.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Adafuit nRF52 Bootloader -sidebar_label: Adafuit nRF52 ---- - -import BaseConfig from "./_base-config.md"; - -The [Adafruit nRF52 Bootloader](https://github.com/adafruit/Adafruit_nRF52_Bootloader/) is a [magic value type bootloader](./index.mdx#magic-value-bootloaders), with some extra setup used to integrate with it. - - - -## Magic Value Type Kconfig - -In addition to the core Kconfig symbols already set up, one additional Kconfig choice needs to be set, e.g. in `Kconfig.defaults` for the board: - -``` -choice ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE - default ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 - -endchoice -``` - -This ensures the correct magic value is stored in the retained memory. - -## Devicetree Simple Include - -A simple shared file can be included in your board's devicetree to set up the retained memory and retention nodes. Near the top of your file, add an include for `common/nordic/nrf52840_uf2_boot_mode.dtsi`, e.g.: - -```dts -/dts-v1/; - -#include -#include -``` - -## Devicetree Manual Changes - -### GPREGRET Setup - -Nordic nRF52840 has a dedicated register that can be used to store data to persist across resets. Zephyr has a retained mem driver over this register, so we'll add the boot mode retention to that existing node: - -```dts -&gpregret1 { - adafruit_boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; -}; -``` - -### Magic Value Mapper - -Next, we'll set up our mapping retained mem driver, which will map from the Zephyr boot mode values to the values the bootloader is looking for: - -```dts -/ { - magic_mapper { - compatible = "zmk,bootmode-to-magic-mapper"; - status = "okay"; - - #address-cells = <1>; - #size-cells = <1>; - - boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; -}; -``` - -### Chosen Node Properties - -Finally, we'll assign two `chosen` properties for the two nodes that have been defined: - -```dts -/ { - chosen { - zephyr,boot-mode = &boot_retention; - zmk,magic-boot-mode = &adafruit_boot_retention; - }; -``` diff --git a/docs/docs/hardware-integration/bootloader/index.mdx b/docs/docs/hardware-integration/bootloader/index.mdx deleted file mode 100644 index 5190c04b..00000000 --- a/docs/docs/hardware-integration/bootloader/index.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Bootloader Integration -sidebar_label: Bootloader ---- - -:::info -The information on this page is only relevant for **boards**, not **shields**. -::: - -The `&bootloader` behavior requires properly set up [boot mode](https://docs.zephyrproject.org/4.1.0/services/retention/index.html#boot-mode) support to function properly. The behavior operates by setting the boot mode, resetting, and then relies on an SoC/bootloader specific early init hook to enter the bootloader when the boot mode is found to have been set. - -Most of the SoCs actively supported by ZMK rely on a generic retained memory driver to store the boot mode between restarts, and additional configuration is required when using a second stage bootloader like the [Adafruit nRF52 Bootloader](https://github.com/adafruit/Adafruit_nRF52_Bootloader/) or [tinyuf2](https://github.com/adafruit/tinyuf2). - -## Magic Value Bootloaders - -Most "second stage" bootloaders will enter bootloader mode on startup when a specific magic value is found in a specific reserved location in memory. For those bootloaders, an extra mapping layer is used to map the Zephyr "bootloader mode" retained value to the magic value expected by the bootloader. - -The following bootloaders of this type are supported, see those pages for details on the additional configuration needed: - -- [Adafruit nRF52](./adafruit-nrf52.mdx) -- [TinyUF2](./tinyuf2.mdx) -- [SAMD21 UF2](./samd21-uf2.mdx) - -## Jump-To Bootloaders - -Several SoCs use bootloaders that can be directly jumped to from early init code in the firmware. For these situations, the only setup required is a a [retained mem](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/retained_mem.html) instance that can retain the set boot mode after the reset, in order for the early initailization code to check the value and then jump to the bootloader. - -The following bootloaders of this type are supported, see those pages for details on the additional configuration needed: - -- [RP2040/RP2350](./rp2.mdx) -- [STM32](./stm32.mdx) diff --git a/docs/docs/hardware-integration/bootloader/rp2.mdx b/docs/docs/hardware-integration/bootloader/rp2.mdx deleted file mode 100644 index fcbc65e9..00000000 --- a/docs/docs/hardware-integration/bootloader/rp2.mdx +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: RP2040/RP2350 Bootloader -sidebar_label: RP2040/RP2350 ---- - -import BaseConfig from "./_base-config.md"; - -The RP2040/RP2350 Bootloader is a [jump-to type bootloader](./index.mdx#jump-to-bootloaders), with some extra setup used to integrate with it. - -By default, when integrating this bootloader, a ["double tap reset to enter the bootloader"](../../config/bootloader.md#double-tap-to-bootloader) feature will be enabled, to help with designs that do not easily expose a BOOTSEL pin. - - - -## Simple Include - -A simple shared file can be included in your board's devicetree to set up the necessary retained memory and retention nodes. Near the top of your file, add an include for `arm/raspberrypi/rp2040-boot-mode-retention.dtsi`, e.g.: - -```dts -/dts-v1/; - -#include -#include -``` - -## Manual Changes - -The include mentioned above can be performed manually, if you so choose. - -First, we'll shrink the SRAM node, from the front, to create a 4-byte area that won't have anything placed in it by the normal Zephyr linking process: - -```dts -&sram0 { - reg = <0x20000004 ((DT_SIZE_K(264)) - 4)>; -}; -``` - -Next, we'll define a _new_ 4-byte RAM region for that reserved space, and within that region, set up a Zephyr retained RAM node. Within that node, we'll create the actual retention _value_ that is used: - -```dts -/ { - sram@20000000 { - compatible = "zephyr,memory-region", "mmio-sram"; - reg = <0x20000000 0x4>; - zephyr,memory-region = "RetainedMem"; - status = "okay"; - - retainedmem { - compatible = "zephyr,retained-ram"; - status = "okay"; - #address-cells = <1>; - #size-cells = <1>; - boot_mode: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; - }; -}; -``` - -Finally, we'll assign that new retention value node to the `zephyr,boot-mode` chosen property: - -```dts -/ { - chosen { - zephyr,boot-mode = &boot_mode; - }; -}; -``` diff --git a/docs/docs/hardware-integration/bootloader/samd21-uf2.mdx b/docs/docs/hardware-integration/bootloader/samd21-uf2.mdx deleted file mode 100644 index 1894246a..00000000 --- a/docs/docs/hardware-integration/bootloader/samd21-uf2.mdx +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: SAMD21 UF2 Bootloader -sidebar_label: SAMD21 ---- - -import BaseConfig from "./_base-config.md"; - -The [SAMD21 UF2 Bootloader](https://github.com/adafruit/uf2-samdx1) is a [magic value type bootloader](./index.mdx#magic-value-bootloaders), with some extra setup used to integrate with it. - - - -## Adjust The Existing RAM node - -We'll first adjust the SRAM to ensure Zephyr does not overwrite the memory location the bootloader inspect to determine if it should enter bootloader mode: - -```dts -&sram0 { - reg = <0x20000000 0x7FFC>; -}; -``` - -Note: - -- The `0x20000000` address is the address of the RAM for the target. This is nearly always `0x20000000`. -- The exact value of `0x7FFC` will depend on the total RAM on the target. The value should be the total RAM, minus 4-bytes, in hex. - -## Add a new memory region node with retainer RAM - -```dts -/ { - sram@20007FFC { - compatible = "zephyr,memory-region", "mmio-sram"; - reg = <0x20007FFC 0x4>; - zephyr,memory-region = "RetainedMem"; - status = "okay"; - - retainedmem { - compatible = "zephyr,retained-ram"; - status = "okay"; - #address-cells = <1>; - #size-cells = <1>; - - magic_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x4>; - }; - }; - }; -}; -``` - -Note: - -- The node `sram@20007FFC` and the corresponding `reg` property values are obtained by adding the base RAM address (.e.g. `0x20000000`) to the shrunk RAM size (e.g. `0x7FFC`) to get the new start address for the area of reserved RAM. -- The magic values are 32-bits (4 bytes), so the second `reg` size value is `0x4`. - -## Magic Mapper node - -Next, we'll set up our mapping retained mem driver, which will map from the Zephyr boot mode values to the values the bootloader is looking for: - -```dts -/ { - magic_mapper { - compatible = "zmk,bootmode-to-magic-mapper"; - status = "okay"; - - #address-cells = <1>; - #size-cells = <1>; - - boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; -}; -``` - -## Assign Chosen Properties - -Finally, we'll assign two `chosen` properties for the two nodes that have been defined: - -```dts -/ { - chosen { - zephyr,boot-mode = &boot_retention; - zmk,magic-boot-mode = &magic_retention; - }; -}; -``` - -## Magic Value Type Kconfig - -Lastly, one Kconfig choice needs to be set, e.g. in `Kconfig.defaults` for the board: - -``` -choice ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE - default ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_BOSSA - -endchoice -``` diff --git a/docs/docs/hardware-integration/bootloader/stm32.mdx b/docs/docs/hardware-integration/bootloader/stm32.mdx deleted file mode 100644 index 5fcca6dd..00000000 --- a/docs/docs/hardware-integration/bootloader/stm32.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: STM32 ROM Bootloader -sidebar_label: STM32 ROM -toc_max_heading_level: 3 ---- - -import BaseConfig from "./_base-config.md"; - -The [STM32 ROM Bootloader](https://www.st.com/resource/en/application_note/an2606-stm32-microcontroller-system-memory-boot-mode-stmicroelectronics.pdf) is a [jump-to type bootloader](./index.mdx#jump-to-bootloaders), with some extra setup used to integrate with it. - -By default, when integrating this bootloader, a ["double tap reset to enter the bootloader"](../../config/bootloader.md#double-tap-to-bootloader) feature will be enabled, to help with designs that do not easily expose a BOOT pin. - - - -## Adjust Existing SRAM Node - -First, we'll adjust the existing SRAM node to shrink it by one byte so Zephyr will not interfere with the retained mem: - -```dts -/* Reduce SRAM0 usage by 1 byte to account for non-init area */ -&sram0 { - reg = <0x20000000 0x3FFF>; -}; -``` - -Note: - -- The `0x20000000` address is the address of the RAM for the target. This is nearly always `0x20000000` -- The exact value of `0x3FFF` will depend on the total RAM on the target. The value should be the total RAM, minus 1-bytes, in hex - -## New Memory Region & Nested Retained Mem - -```dts -/ { - sram@20003FFF { - compatible = "zephyr,memory-region", "mmio-sram"; - reg = <0x20003FFF 0x1>; - zephyr,memory-region = "RetainedMem"; - status = "okay"; - - retainedmem { - compatible = "zephyr,retained-ram"; - status = "okay"; - #address-cells = <1>; - #size-cells = <1>; - - retention0: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; - }; -}; -``` - -Note: - -- The node `sram@20003FFF` and the corresponding `reg` property values are obtained by adding the base RAM address (.e.g. `0x20000000`) to the shrunk RAM size (e.g. `0x3FFF`) to get the new start address for the area of reserved RAM. - -## Chosen Boot Mode Node - -Finally, we'll set a chosen property to select the created retention node: - -```dts -/ { - chosen { - zephyr,boot-mode = &retention0; - }; -}; -``` diff --git a/docs/docs/hardware-integration/bootloader/tinyuf2.mdx b/docs/docs/hardware-integration/bootloader/tinyuf2.mdx deleted file mode 100644 index 85386b4d..00000000 --- a/docs/docs/hardware-integration/bootloader/tinyuf2.mdx +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: TinyUF2 Bootloader -sidebar_label: TinyUF2 ---- - -import BaseConfig from "./_base-config.md"; - -The [TinyUF2 Bootloader](https://github.com/adafruit/tinyuf2) is a [magic value type bootloader](./index.mdx#magic-value-bootloaders), with some extra setup used to integrate with it. - - - -## Adjust The Existing RAM node - -For TinyUF2, we'll first adjust the SRAM to ensure Zephyr does not overwrite the memory location the bootloader inspect to determine if it should enter bootloader mode: - -```dts -&sram0 { - reg = <0x20000000 0x1FFFC>; -}; -``` - -Note: - -- The `0x20000000` address is the address of the RAM for the target. This is nearly always `0x20000000` -- The exact value of `0x1FFFC` will depend on the total RAM on the target. The value should be the total RAM, minus 4-bytes, in hex - -## Add a New Memory Region Node with Retainer RAM - -```dts -/ { - sram@2001FFFC { - compatible = "zephyr,memory-region", "mmio-sram"; - reg = <0x2001FFFC 0x4>; - zephyr,memory-region = "RetainedMem"; - status = "okay"; - - retainedmem { - compatible = "zephyr,retained-ram"; - status = "okay"; - #address-cells = <1>; - #size-cells = <1>; - - magic_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x4>; - }; - }; - }; -}; -``` - -Note: - -- The node `sram@2001FFFC` and the corresponding `reg` property values are obtained by adding the base RAM address (.e.g. `0x20000000`) to the shrunk RAM size (e.g. `0x1FFFC`) to get the new start address for the area of reserved RAM. -- The magic values in TinyUF2 are 32-bits (4 bytes), so the second `reg` size value is `0x4`. - -## Magic Mapper node - -Next, we'll set up our mapping retained mem driver, which will map from the Zephyr boot mode values to the values the bootloader is looking for: - -```dts -/ { - magic_mapper { - compatible = "zmk,bootmode-to-magic-mapper"; - status = "okay"; - - #address-cells = <1>; - #size-cells = <1>; - - boot_retention: retention@0 { - compatible = "zephyr,retention"; - status = "okay"; - reg = <0x0 0x1>; - }; - }; -}; -``` - -## Assign Chosen Properties - -Finally, we'll assign two `chosen` properties for the two nodes that have been defined: - -```dts -/ { - chosen { - zephyr,boot-mode = &boot_retention; - zmk,magic-boot-mode = &magic_retention; - }; -}; -``` - -## Magic Value Type Kconfig - -Lastly, one Kconfig choice needs to be set, e.g. in `Kconfig.defaults` for the board: - -``` -choice ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE - default ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_TINYUF2 - -endchoice -``` diff --git a/docs/docs/hardware-integration/dongle.mdx b/docs/docs/hardware-integration/dongle.mdx deleted file mode 100644 index 822b6248..00000000 --- a/docs/docs/hardware-integration/dongle.mdx +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: Keyboard Dongle -sidebar_label: Keyboard Dongle ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -A bluetooth dongle can be added to any wireless keyboard running ZMK. The result is a [split keyboard](../features/split-keyboards.md) with the dongle as ["central"](../features/split-keyboards.md#central-and-peripheral-roles). There are a number of advantages to adding a dongle, but also some disadvantages: - -Benefits: - -- For split keyboards, having the dongle for the "central" role results in [improved battery life](/power-profiler) for the former central part, as it is now a peripheral. -- It is easier to connect to the host device since dongles are typically connected via USB. - -Disadvantages: - -- An extra [board](index.mdx#what-is-a-board) is needed (any BLE-capable board that ZMK supports will work). -- The keyboard becomes unusable without the dongle. - -Depending on how the dongle is used, there are some additional [latency considerations](../features/split-keyboards.md#latency-considerations) to keep in mind. -The addition of the dongle adds an extra "hop" for the former central, increasing its latency to that of a peripheral. The other parts are unchanged latency-wise. There is also a commonly occurring case where the peripherals benefit. -Assuming the dongle is connected to USB and the former central would have been connected via bluetooth to the host if the dongle wasn't present: - -- The former central will have its latency increased by about 1ms from the extra USB "hop" -- The other parts will have their average latency _decreased_ by 6.5ms from the replacement of a BLE "hop" with a "USB" hop. - -As a result, for this common use case the average latency of the keyboard decreases. - -## Adding a Dongle - -The approach taken to adding a dongle is _generally_ the same[^1]. -Whether your keyboard consists of a [board and a shield](index.mdx#boards--shields) or is just a board is irrelevant. - -To add a dongle, you will create a simplified form of a [new shield](new-shield.mdx). -The approach described below assumes the dongle will not have any keys assigned to itself, so it will not work for that scenario. -If you want to understand the details of how it all works better, please read through the [new shield guide](new-shield.mdx). - -As there are a very large number of possible devices that could be used as a dongle, you will be defining your dongle as a personal shield intended for your exclusive use. - -Prior to adding a dongle to your keyboard, please test its functionality without a dongle. The below guide will assume that your keyboard is named `my_keyboard`, replace accordingly. - -### Dongle Folder - -First, make sure that your `zmk-config` matches the folder structure found in the [unified ZMK config template](https://github.com/zmkfirmware/unified-zmk-config-template) (extra files and folders are fine, but none should be missing). - -Next, navigate to the `zmk-config/boards/shields` directory. Create a subdirectory called `my_keyboard`, if one doesn't already exist. Unless otherwise specified, the below files should all be placed in said folder. - -### Kconfig Files - -#### Kconfig.shield - -Make a file called `Kconfig.shield`, if one does not exist already. Add the following lines to it, replacing `SHIELD_MY_KEYBOARD_DONGLE` and `my_keyboard_dongle` according to your keyboard: - -```kconfig title="Kconfig.shield" -# No whitespace after the comma or in the keyboard name! -config SHIELD_MY_KEYBOARD_DONGLE - def_bool $(shields_list_contains,my_keyboard_dongle) -``` - -#### Kconfig.defconfig - -Make a file called `Kconfig.defconfig`, if one does not exist already. Add the following lines to it where `SHIELD_MY_KEYBOARD_DONGLE` should match the previous section: - -```kconfig title="Kconfig.defconfig" -if SHIELD_MY_KEYBOARD_DONGLE - -# Max 16 characters in keyboard name -config ZMK_KEYBOARD_NAME - default "My Board" - -config ZMK_SPLIT_ROLE_CENTRAL - default y - -config ZMK_SPLIT - default y - -# Set this to the number of peripherals your dongle will have. -# For a unibody, this would be 1. If you have left and right halves, set it to 2, etc. -config ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS - default 1 - -# Set this to ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS + your desired number of BT profiles (default is 5) -config BT_MAX_CONN - default 6 - -# Set this to the same number as BT_MAX_CONN -config BT_MAX_PAIRED - default 6 - -endif -``` - -### Dongle Overlay File - -Create a file called `my_keyboard_dongle.overlay` (renamed as appropriate). -This file will include your keyboard's matrix transform and physical layout, allowing it to map key press events from the peripherals to behaviors. - -Add the following lines to the file you created, introducing a mock kscan for the dongle since it has no keys itself: - -```dts title="my_keyboard_dongle.overlay" -#include - -/ { - chosen { - zmk,kscan = &mock_kscan; - }; - - mock_kscan: mock_kscan_0 { - compatible = "zmk,kscan-mock"; - columns = <0>; - rows = <0>; - events = <0>; - }; -}; -``` - -You will now need to find and copy your keyboard's matrix transform into the `my_keyboard_dongle.overlay` file. - -#### Matrix transform - -Navigate to the directory defining your keyboard (in-tree keyboards found [here](https://github.com/zmkfirmware/zmk/tree/main/app/boards), if your keyboard is a shield look under the `shields` subdirectory) and look through the [devicetree files](../config/index.md) for nodes with `compatible = "zmk,matrix-transform";`. -This should look something like this: - -```dts - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - - map = < - // Lots of RC(r,c) macros - >; - }; -``` - -Copy this node into your `my_keyboard_dongle.overlay` file. It should be a child node of the root node (put it inside the `/ { ... };`). -If there are multiple matrix transformations, copy the one that matches your keyboard's layout. - -Make a note of the label that the transform has, it will be used later. In the example the label is `default_transform`. - -#### Physical layout - -A full physical layout is necessary to allow your dongle to be used with [ZMK Studio](../features/studio.md). -If your keyboard is not Studio-ready or you have no interest in using ZMK Studio with your dongle, then this section is simplified significantly. - - - - -You will need to find your keyboard's physical layout, much like finding the matrix transform. -Depending on your keyboard, the physical layout could be found in a variety of locations. Look for a node with `compatible = "zmk,physical-layout";`. -There are three commonly found possibilities: - -- The physical layout is found in a file called `my_keyboard-layouts.dtsi` -- The physical layout is found in the same file as the matrix transform and chosen node -- The physical layout is imported from ZMK's shared layouts - `#include .dtsi>` can be found at the top of one of the devicetree files. - - - -Copy the file into your dongle's folder. Then import the file, assign the matrix transform to it, and select it in the `chosen` node: - -```dts -#include "my_keyboard-layouts.dtsi" - -&physical_layout0 { - transform = <&default_transform>; -}; - -/ { - chosen { - zmk,kscan = &mock_kscan; - zmk,physical-layout = &physical_layout0; - }; -}; -``` - -Make sure that the labels `physical_layout0` and `default_transform` match those of the physical layout node defined in the file and the matrix transform respectively. - -:::note -If there are multiple physical layouts in the file, you will need to copy over all of the remaining matrix transformations and assign them to their corresponding physical layout. -::: - - - -Copy the physical layout node into your `my_keyboard_dongle.overlay` file. Make sure the matrix transform is assigned to it, and select it in the `chosen` node. - -```dts -/ { - chosen { - zmk,kscan = &mock_kscan; - zmk,physical-layout = &physical_layout0; - }; - - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default Layout"; - transform = <&default_transform>; - keys = <...>; // Long list of key positions - }; -}; -``` - -Make sure that the labels `physical_layout0` and `default_transform` match those of the physical layout node and the matrix transform respectively. - -:::note -If there are multiple physical layouts, you need only copy the one that applies to your keyboard. -::: - - - -Include your desired layout at the top of the file. Then assign your matrix transform to it, taking care to match up the node labels correctly. - -```dts -#include .dtsi> - -&physical_layout0 { - transform = <&default_transform>; -}; -``` - -In this case your node label will _not_ be `physical_layout0`, make sure to adjust it accordingly. - -Finally, select your physical layout in the chosen node. - -```dts -/ { - chosen { - zmk,kscan = &mock_kscan; - zmk,physical-layout = &physical_layout0; - }; -}; -``` - - - - - - -Add a barebones [physical layout](physical-layouts.md) without the `keys` property to your `my_keyboard_dongle.overlay` file. - -```dts -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default Layout"; - transform = <&default_transform>; - }; -}; -``` - -Make sure that the `transform` property uses the same label as your matrix transform. Then select the physical layout in the same `chosen` node that was previously created: - -```dts -/ { - chosen { - zmk,kscan = &mock_kscan; - zmk,physical-layout = &physical_layout0; // New item added - }; -}; -``` - - - - -## Building the Firmware - -Add the appropriate lines to your `build.yaml` file to build the firmware for your dongle. Also add some CMake arguments using `cmake-args` to the existing parts of your keyboard, turning them into peripherals for your dongle.[^2] - -```yaml -include: - # ----------------------------------------- - # Your other keyboard parts here - # ----------------------------------------- - # Change the board appropriately, you can use any board - - board: nice_nano - shield: my_keyboard_dongle - - board: nice_nano - shield: settings_reset - # Add these cmake-args to the peripherals you wish to use with the dongle - - board: nice_nano - shield: my_keyboard - cmake-args: -DCONFIG_ZMK_SPLIT=y -DCONFIG_ZMK_SPLIT_ROLE_CENTRAL=n -``` - -You can then flash the firmware to your device as detailed in our [user setup](../user-setup.mdx#install-the-firmware) and [split keyboard](../features/split-keyboards.md#building-and-flashing-firmware) pages. - -:::warning -Before flashing your new firmware, you need to flash `settings_reset` [firmware](../troubleshooting/connection-issues.mdx#building-a-reset-firmware) on all devices to ensure they can pair to each other. -::: - -To use your dongled keyboard with [ZMK Studio](../features/studio.md), apply the instructions for [building with Studio](../features/studio.md#building) to the dongle. - -If you ever want to "undongle" your keyboard, simply remove these CMake arguments and flash the resulting firmware (after a `settings_reset`). - -[^1]: If you have a custom dongle that uses an onboard MCU, then you will need to take a slightly different approach that isn't currently documented. - -[^2]: If you are building locally, you can append these flags to the end of the [build command](../development/local-toolchain/build-flash.mdx#cmake-arguments). diff --git a/docs/docs/hardware-integration/encoders.md b/docs/docs/hardware-integration/encoders.md deleted file mode 100644 index 4a9ea85f..00000000 --- a/docs/docs/hardware-integration/encoders.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: EC11 Encoders -sidebar_label: Encoders ---- - -EC11 encoder support can be added to your board or shield by adding the appropriate lines to your board/shield's configuration (.conf), devicetree (.dtsi/.overlay), and keymap (.keymap) files. - -## Configuration File - -In your configuration file you will need to add the following lines so that the encoders can be enabled/disabled: - -```ini -# Uncomment to enable encoder -# CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y -``` - -These should be commented by default for encoders that are optional/can be swapped with switches, but can be uncommented if encoders are part of the default design. - -:::note -If building locally for split boards, you may need to add these lines to the specific half's configuration file as well as the combined configuration file, see the [configuration overview](../config/index.md) for details. -::: - -## Devicetree File - -In your devicetree file you will need to define each sensor with their properties. For split keyboards, do this in the .dtsi file that is shared by all parts; otherwise do it in the .dts (for boards) or .overlay (shields) file, see [configuration overview](../config/index.md#devicetree-files) for details. Add the following lines: - -```dts - left_encoder: encoder_left { - compatible = "alps,ec11"; - a-gpios = ; - b-gpios = ; - steps = <80>; - status = "disabled"; - }; -``` - -Here you need to replace `PIN_A` and `PIN_B` with the appropriate pins that your PCB utilizes for the encoder(s). See shield overlays section in the [new shield guide](new-shield.mdx#shield-overlays) on the appropriate node label and pin number to use for GPIOs. - -The `steps` property should corresponded to the documented pulses per rotation for the encoders used on the keyboard, typically found on the datasheet of the component. If users use different encoders when they build, the value can be overridden in their keymap. - -Add additional encoders as necessary by duplicating the above lines, replacing `left` with whatever you would like to call your encoder, and updating the pins. - -Once you have defined the encoder sensors, you will have to add them to the list of sensors: - -```dts - sensors: sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - triggers-per-rotation = <20>; - }; -``` - -In this example, a `left_encoder` and `right_encoder` are both added. Additional encoders can be added with spaces separating each, and the order they are added here determines the order in which you define their behavior in your keymap. - -In addition, a default value for the number of times the sensors trigger the bound behavior per full rotation is set via the `triggers-per-rotation` property. See [Encoders Config](../config/encoders.md#devicetree) for more details. - -Add the following lines to the .dts/.overlay file that contains the encoder to enable it: - -```dts -&left_encoder { - status = "okay"; -}; -``` - -Make sure to add this to the .dts/.overlay file, rather than any shared (.dtsi) files. - -## Keymap - -Add the following line to your keymap file to add default encoder behavior bindings: - -```dts -sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; -``` - -Add additional bindings as necessary to match the default number of encoders on your board. See the [Encoders](../features/encoders.md) and [Keymaps](../keymaps/index.mdx) documentation pages for more details. diff --git a/docs/docs/hardware-integration/includes/_gpio-key-direct.md b/docs/docs/hardware-integration/includes/_gpio-key-direct.md deleted file mode 100644 index 2e364744..00000000 --- a/docs/docs/hardware-integration/includes/_gpio-key-direct.md +++ /dev/null @@ -1,14 +0,0 @@ -Here is an example for a keyboard with a dedicated on/off push button that is a direct wire between the GPIO pin and ground: - -```dts -/ { - keys { - compatible = "gpio-keys"; - soft_off_gpio_key: soft_off_gpio_key { - gpios = <&gpio0 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - }; - }; -}; -``` - -In the above example the soft on/off would be triggered by pulling the specified pin low, typically by pressing a switch that has the other leg connected to ground. diff --git a/docs/docs/hardware-integration/includes/_gpio-key-matrix.md b/docs/docs/hardware-integration/includes/_gpio-key-matrix.md deleted file mode 100644 index affed12e..00000000 --- a/docs/docs/hardware-integration/includes/_gpio-key-matrix.md +++ /dev/null @@ -1,14 +0,0 @@ -Here is an example for a keyboard with a GPIO pin that reads from the matrix: - -```dts -/ { - keys { - compatible = "gpio-keys"; - soft_off_gpio_key: soft_off_gpio_key { - gpios = <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; - }; - }; -}; -``` - -MCU inputs are triggered by pulling the specified pin high, typically by pressing some combination of switches which connects the MCU input to an MCU output. diff --git a/docs/docs/hardware-integration/includes/_gpio-key-wakeup.md b/docs/docs/hardware-integration/includes/_gpio-key-wakeup.md deleted file mode 100644 index 0a022894..00000000 --- a/docs/docs/hardware-integration/includes/_gpio-key-wakeup.md +++ /dev/null @@ -1,15 +0,0 @@ -Here is an example for a keyboard with a GPIO pin reused from a matrix kscan: - -```dts -/ { - keys { - compatible = "gpio-keys"; - soft_off_gpio_key: soft_off_gpio_key { - gpios = <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; - }; - }; -}; -``` - -The GPIO settings should match those in the kscan, so the above would be set to `(GPIO_ACTIVE_LOW | GPIO_PULL_UP)` for a direct kscan. -The specified pin should be the MCU input pin of the switch used for waking from soft off (for a `col2row` matrix, the MCU input pins are the row pins). diff --git a/docs/docs/hardware-integration/includes/_sideband-direct.md b/docs/docs/hardware-integration/includes/_sideband-direct.md deleted file mode 100644 index e224a584..00000000 --- a/docs/docs/hardware-integration/includes/_sideband-direct.md +++ /dev/null @@ -1,37 +0,0 @@ -### KScan sideband behavior - -The kscan sideband behavior driver will be used to trigger the [soft off behavior](../../keymaps/behaviors/soft-off.md) "out of band" from the normal keymap processing. To do so, it will decorate/wrap an underlying kscan driver. - -With a simple direct pin setup, the [direct kscan](../../config/kscan.md) driver can be used with a [GPIO key](#gpio-key), to make a small "side matrix": - -```dts -/ { - wakeup_scan: wakeup_scan { - compatible = "zmk,kscan-gpio-direct"; - input-keys = <&soft_off_gpio_key>; - wakeup-source; - }; -}; -``` - -With that in place, the kscan sideband behavior will wrap the new driver: - -```dts -/ { - side_band_behavior_triggers: side_band_behavior_triggers { - compatible = "zmk,kscan-sideband-behaviors"; - - kscan = <&wakeup_scan>; - auto-enable; - wakeup-source; - - soft_off { - column = <0>; - row = <0>; - bindings = <&hw_soft_off>; - }; - }; -}; -``` - -As the kscan used only has a single key, both column and row are set to 0. The properties of the `kscan-sideband-behaviors` node can be found in the [appropriate configuration section](../../config/kscan.md#kscan-sideband-behavior-driver). diff --git a/docs/docs/hardware-integration/includes/_sideband-matrix.md b/docs/docs/hardware-integration/includes/_sideband-matrix.md deleted file mode 100644 index c6de0f41..00000000 --- a/docs/docs/hardware-integration/includes/_sideband-matrix.md +++ /dev/null @@ -1,66 +0,0 @@ -### KScan sideband behavior - -The kscan sideband behavior driver will be used to trigger the [soft off behavior](../../keymaps/behaviors/soft-off.md) "out of band" from the normal keymap processing. To do so, it will decorate/wrap an underlying kscan driver. - -For the matrix-integrated approach you will supplement the existing kscan matrix by adding the additional pin as another entry in -the `row-gpios`/`col-gpios` for whichever pins are used to read the matrix state. This approach requires a matrix transform to be present. As an example, consider the following existing kscan matrix: - -```dts -/ { - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; - wakeup-source; - - col-gpios - = <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - ; - row-gpios - = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; -}; -``` - -To supplement it with a soft off input, you would add another row value (without changing the matrix transform): - -```dts -/ { - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; - wakeup-source; - - col-gpios - = <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - ; - row-gpios - = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; -}; -``` - -With that in place, you would decorate the kscan driver: - -```dts -/ { - side_band_behavior_triggers: side_band_behavior_triggers { - compatible = "zmk,kscan-sideband-behaviors"; - wakeup-source; - kscan = <&kscan>; - soft_off { - column = <0>; - row = <2>; - bindings = <&hw_soft_off>; - }; - }; -}; -``` - -Critically, the `column` and `row` values would correspond to the location of the added entry. The properties of the `kscan-sideband-behaviors` node can be found in the [appropriate configuration section](../../config/kscan.md#kscan-sideband-behavior-driver). diff --git a/docs/docs/hardware-integration/includes/_sideband-wakeup-direct.md b/docs/docs/hardware-integration/includes/_sideband-wakeup-direct.md deleted file mode 100644 index dc389726..00000000 --- a/docs/docs/hardware-integration/includes/_sideband-wakeup-direct.md +++ /dev/null @@ -1,28 +0,0 @@ -### KScan sideband behavior - -With a simple direct pin setup, the [direct kscan](../../config/kscan.md) driver can be used with a [GPIO key](#gpio-key), to make a small "side matrix": - -```dts -/ { - wakeup_scan: wakeup_scan { - compatible = "zmk,kscan-gpio-direct"; - input-keys = <&soft_off_gpio_key>; - wakeup-source; - }; -}; -``` - -The kscan sideband behavior needs to wrap the new driver to enable it: - -```dts -/ { - side_band_behavior_triggers: side_band_behavior_triggers { - compatible = "zmk,kscan-sideband-behaviors"; - kscan = <&wakeup_scan>; - auto-enable; - wakeup-source; - }; -}; -``` - -The properties of the `kscan-sideband-behaviors` node can be found in the [appropriate configuration section](../../config/kscan.md#kscan-sideband-behavior-driver). diff --git a/docs/docs/hardware-integration/includes/_soft-off-behavior.md b/docs/docs/hardware-integration/includes/_soft-off-behavior.md deleted file mode 100644 index 9f9ac021..00000000 --- a/docs/docs/hardware-integration/includes/_soft-off-behavior.md +++ /dev/null @@ -1,16 +0,0 @@ -### Soft off behavior instance - -Behind the scenes, a hardware dedicated GPIO pin utilizes the [soft off behavior](../../keymaps/behaviors/soft-off.md) to trigger entering the soft-off state. To use said behavior outside of a keymap, add an instance of the behavior to your `.overlay`/`.dts` file: - -```dts -/ { - behaviors { - hw_soft_off: hw_soft_off { - compatible = "zmk,behavior-soft-off"; - #binding-cells = <0>; - split-peripheral-off-on-press; // Turn peripheral off immediately for reliability - hold-time-ms = <2000>; // Only turn off if the key is held for 2 seconds or longer. - }; - }; -}; -``` diff --git a/docs/docs/hardware-integration/includes/_soft-off-waker.md b/docs/docs/hardware-integration/includes/_soft-off-waker.md deleted file mode 100644 index d6349b46..00000000 --- a/docs/docs/hardware-integration/includes/_soft-off-waker.md +++ /dev/null @@ -1,17 +0,0 @@ -### Soft off waker - -We need to add another device which will be enabled only when the keyboard is going into soft off state, and will configure the previously declared GPIO key with the correct interrupt configuration to wake the device from soft off once it is pressed. - -```dts -/ { - wakeup_scan: wakeup_scan { - compatible = "zmk,gpio-key-wakeup-trigger"; - trigger = <&soft_off_gpio_key>; - wakeup-source; - extra-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; - }; -}; -``` - -The properties for the `gpio-key-wakeup-trigger` node can be found in the [appropriate configuration section](../../config/power.md#gpio-key-wakeup-trigger). -In particular, note the `extra-gpios` property containing the MCU output pins of any keys used to wake the keyboard (for a `col2row` matrix, these are your columns). diff --git a/docs/docs/hardware-integration/index.mdx b/docs/docs/hardware-integration/index.mdx deleted file mode 100644 index 5c7ed01b..00000000 --- a/docs/docs/hardware-integration/index.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Hardware Integration -sidebar_label: Overview ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -This section of the documentation describes steps necessary to get ZMK running on a keyboard, including basic keyboard functionality as well as additional features such as encoders. -Please see pages in the sidebar for guides and reference that describe different aspects of this integration. - -The foundational elements needed to get a specific keyboard working with ZMK can be broken down into: - -- A [physical layout](physical-layouts.md) that describes the electrical and physical structure of the keyboard, referring to: - - A [kscan driver](../config/kscan.md), which most frequently uses `compatible = "zmk,kscan-gpio-matrix"` for GPIO matrix based keyboards, or `compatible = "zmk,kscan-gpio-direct"` for direct wires. - - A [matrix transform](../config/layout.md), which defines how the kscan row/column events are translated into logical "key positions". - - An [optional description](physical-layouts.md#optional-keys-property) of physical key positions and sizes, in order to visualize the keyboard accurately in [ZMK Studio](../features/studio.md). -- A [keymap](../keymaps/index.mdx), which binds each key position to a behavior, e.g. key press, mod-tap, momentary layer, in a set of layers. -- Other, optional configuration items to support features such as encoders or lighting systems. - -These core architectural elements are defined per-keyboard, and _where_ they are defined depends on the specifics of how that keyboard is structured. - -## Boards & Shields - -ZMK uses the Zephyr concepts of "boards" and "shields" to refer to different parts of a keyboard build, that in turn get combined during a firmware build. -Also see the Zephyr documentation on [boards](https://docs.zephyrproject.org/4.1.0/glossary.html#term-board) and [shields](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html). - -### What is a "board"? - -In ZMK, a _board_ defines the _PCB_ that _includes the microcontroller unit (MCU)_. -For keyboards, this is one of two options: - -- Complete keyboard PCBs that include the MCU (e.g. the Planck or Preonic). -- Small MCU boards (e.g. the nice!nano or Seeed Studio Xiao RP2040) that expose pins and are designed to be combined with larger keyboard PCBs, or hand-wired to switches to create the final keyboard. - -### What is a "shield"? - -In ZMK, a _shield_ is a _PCB_ or _hardwired set of components_ that when combined with an MCU-only board, like the SparkFun Pro Micro RP2040 or nice!nano, results in a complete usable keyboard. -Examples would be keyboard PCBs like the Kyria or Lily58. -The shield is usually the big PCB containing all the keys. - -### Why not just "keyboard"? - -["Composite" keyboards](../hardware.mdx#composite) are keyboards which use a separate small PCB MCU module for its "brains". -In such keyboards, the [shield](#what-is-a-shield) is a brainless shell containing all the keys, RGB LEDs, encoders etc. -It typically maps all of these features to a standard pin footprint, such as the Pro Micro pinout. - -To bring this brainless shield to life, you attach any MCU [board](#what-is-a-board) matching the footprint. -For instance, the _nice!nano_ is _pin-compatible_ with the _SparkFun Pro Micro RP2040_, so you can substitute either board onto the shield. -But each board comes with its own features (MCU, flash, BLE, etc.) which must also be handled. - -Therefore in ZMK, board and shield are considered two different (but related) entities so that it is easier to mix and match them, and they are combined during a ZMK build. -This provides the modularity to be able to use composite keyboards with different compatible controllers. - -Note that ["self-contained" keyboards](../hardware.mdx#onboard) only have a single PCB which includes the "brains" (MCU) onboard. -In ZMK, these have no shield, only a board. - -## Organization Overview - - - - - -For a [self-contained keyboard](../hardware.mdx#onboard) that includes the microprocessor, all of the above architecture components are included in the Zephyr _board_ definition and no shield is defined. -You can see an example for the [Planck V6](https://github.com/zmkfirmware/zmk/tree/main/app/boards/olkb/planck) board directory. - -With this type of keyboard, the full ZMK definition for the keyboard exists in the `/boards//` directory where `` is `zmk/app` or a [module](../features/modules.mdx) root, e.g. `zmk/app/boards/olkb/planck/`. -In that directory you'll have the following files, where there can be multiples of files with ``s, corresponding to each keyboard part for [split keyboards](../features/split-keyboards.md): - -``` - -├── Kconfig.defconfig -├── Kconfig. -├── _defconfig -├── .dts -├── .keymap -├── board.cmake -├── board.yml -└── .zmk.yml -``` - -These files include [base Kconfig files](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html): - -- A `Kconfig.` file that defines the toplevel [Kconfig](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html) items for the board, including selecting the corresponding SoC Kconfig setting. -- A `Kconfig.defconfig` file that sets some initial defaults when building this keyboard. This usually includes: - - Setting [`ZMK_KEYBOARD_NAME`](../config/system.md#general) to a value, for the product name to be used for USB/BLE info - -[Configuration files](../config/index.md#kconfig-files) that set the visible Kconfig symbols: - -- A `_defconfig` file that forces specific Kconfig settings that are specific to this hardware configuration. - These tend to be settings enabling various drivers or features, e.g. GPIO, USB support, or memory settings for ZMK Studio. - -[Devicetree files](../config/index.md#devicetree-files): - -- `.dts` which contains all the devicetree definitions[^1], including but not limited to: - - An `#include` line that pulls in the specific microprocessor that is used, e.g. `#include `, - - Kscan, matrix transform and physical layout devicetree nodes as described above, - - A [chosen](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) node including `zmk,physical-layout` property among others, where each property references the nodes defined in the file. -- A `.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. - -And other miscellaneous ones: - -- A `board.cmake` file with CMake directives for how to flash to the device. -- A [`board.yml`](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#write-your-board-yaml) file containing information about the board and variants. -- A `.zmk.yml` file containing [metadata](hardware-metadata-files.md) for the keyboard. - -See Zephyr's [board porting guide](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html) for information on creating a new board. -See also our [new board guide](new-board.md) for information on creating a ZMK-compatible board variant. - -[^1]: - Parts of these files can live in separate `.dtsi` files (typically in the same directory) that are then `#include`d in the files, to reduce duplication or improve organization. - For instance, a shared `.dtsi` file is used for split keyboards that contains devicetree definitions that are shared across keyboard parts. - - - - -Keyboards that require an add-on board to operate are [composite keyboards](../hardware.mdx#composite), where the ZMK integration pieces are placed in the _shield_ definition for that keyboard. -This allows users to swap in different boards that use the same interconnect (e.g. Pro Micro RP2040, or nice!nano) and build a firmware the matches their actual combination of physical components. - -With this type of keyboard, the partial definition for the keyboard exists in the `/boards/shields/` directory where `` is `zmk/app` or a [module](../features/modules.mdx) root, e.g. `zmk/app/boards/shields/clueboard_california/`. -In that directory, you'll have the following files, where there can be multiple ``s, corresponding to each keyboard part for [split keyboards](../features/split-keyboards.md): - -``` - -├── Kconfig.shield -├── Kconfig.defconfig -├── .overlay -├── .keymap -└── .zmk.yml -``` - -These files include [base Kconfig files](new-shield.mdx#base-kconfig-files): - -- A `Kconfig.shield` that defines the toplevel Kconfig value for the shield, which uses a supplied utility to function to default the value based on the shield list, e.g. `def_bool $(shields_list_contains,clueboard_california)`. -- A `Kconfig.defconfig` file to set default values for settings like `ZMK_KEYBOARD_NAME` - -[Devicetree files](../config/index.md#devicetree-files): - -- A `.overlay` file which is a devicetree overlay file[^1], containing definitions including but not limited to: - - Kscan, matrix transform and physical layout devicetree nodes as described above, where the kscan node uses the interconnect [nexus node](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html#gpio-nexus-nodes) aliases such as `&pro_micro` for GPIO pins. - - A [chosen](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) node including at least the `zmk,physical-layout` property, referring to the defined node. -- A `.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. - -And other miscellaneous ones: - -- A `.zmk.yml` file containing [metadata](hardware-metadata-files.md) for the keyboard. - -See the [new keyboard shield guide](new-shield.mdx) for documentation that walks you through creating these files to define a new composite keyboard. - - - diff --git a/docs/docs/hardware-integration/lighting/backlight.mdx b/docs/docs/hardware-integration/lighting/backlight.mdx deleted file mode 100644 index 8b484d08..00000000 --- a/docs/docs/hardware-integration/lighting/backlight.mdx +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: Backlight -sidebar_label: Backlight -description: Lighting system that controls an array of single-color LEDs. ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Please see [lighting feature page](../../features/lighting.md#backlight) for an introduction on the feature. - - - - - -First, you must enable PWM by adding the following lines to your `Kconfig.defconfig` file: - -```kconfig -if ZMK_BACKLIGHT - -config PWM - default y - -config LED_PWM - default y - -endif # ZMK_BACKLIGHT -``` - -Create a `-pinctrl.dtsi` file if it does not already exist, and include it at the beginning of the `.dts` file. `CONFIG_PINCTRL=y` must be added to `_defconfig` if it isn't already enabled. -See the documentation page on [pin control](../pinctrl.mdx) for detailed information on setting up pins for hardware protocols such as PWM that is used for controlling backlight LEDs. - -The pinctrl file has a `&pinctrl` node that encompasses all pinctrl settings, including I2C or SPI peripherals (e.g. WS2812 LEDs, battery fuel gauges): - -```dts -&pinctrl { - // Other pinctrl definitions for other hardware - pwm0_default: pwm0_default { - group1 { - psels = ; - }; - }; - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; -``` - -Pin numbers are handled differently depending on the MCU. On nRF MCUs pins are configured using `(PWM_OUTX, Y, Z)`, where `X` is the PWM channel used (usually 0), `Y` is the first part of the hardware port (_PY.01_) and `Z` is the second part of the hardware port (_P1.Z_). - -For example, _P1.13_ would give you `(PWM_OUT0, 1, 13)` and _P0.15_ would give you `(PWM_OUT0, 0, 15)`. - -Add the PWM device to the `board.dts` file and assign the pinctrl definitions to it: - -```dts -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; -``` - -Then add the following lines to the same `.dts` file, but inside the root devicetree node: - -```dts -/ { - backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 PWM_MSEC(10) PWM_POLARITY_NORMAL>; - }; - }; -}; -``` - -The value inside `pwm_led_0` after `&pwm0` must be the channel number. Since `PWM_OUT0` is defined in the pinctrl node, the channel in this example is 0. - -In this example, `PWM_MSEC(10)` is the period of the PWM waveform. This period can be altered if your drive circuitry requires different values or the frequency is audible. - -If your board uses a P-channel MOSFET to control backlight instead of a N-channel MOSFET, you may want to change `PWM_POLARITY_NORMAL` for `PWM_POLARITY_INVERTED`. - -Finally you need to add backlight to the `chosen` element of the root devicetree node: - -```dts -/ { - chosen { - zmk,backlight = &backlight; - }; -}; -``` - - - - -You must first add a `boards/` directory within your shield folder. For each board that supports the shield you must create a `.defconfig` file and a `.overlay` file inside the `boards/` folder. - -Inside your `.defconfig` file, add the following lines: - -```kconfig -if ZMK_BACKLIGHT - -config PWM - default y - -config LED_PWM - default y - -endif # ZMK_BACKLIGHT -``` - -Then add the following lines to your `.overlay` file: - -```dts -&pinctrl { - // Other pinctrl definitions for other hardware - pwm0_default: pwm0_default { - group1 { - psels = ; - }; - }; - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; -``` - -See the documentation page on [pin control](../pinctrl.mdx) for detailed information on setting up pins for hardware protocols such as PWM that is used for controlling backlight LEDs. - -Pin numbers are handled differently depending on the MCU. On nRF MCUs pins are configured using `(PWM_OUTX, Y, Z)`, where `X` is the PWM channel used (usually 0), `Y` is the first part of the hardware port (_PY.01_) and `Z` is the second part of the hardware port (_P1.Z_). - -For example, _P1.13_ would give you `(PWM_OUT0, 1, 13)` and _P0.15_ would give you `(PWM_OUT0, 0, 15)`. - -Add the PWM device to the `.overlay` file and assign the pinctrl definitions to it: - -```dts -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; -``` - -Then add the following lines to the same `.overlay` file, but inside the root devicetree node: - -``` -/ { - backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 PWM_MSEC(10) PWM_POLARITY_NORMAL>; - }; - }; -}; -``` - -In this example, `PWM_MSEC(10)` is the period of the PWM waveform. This period can be altered if your drive circuitry requires different values or the frequency is audible. - -If your board uses a P-channel MOSFET to control backlight instead of a N-channel MOSFET, you may want to change `PWM_POLARITY_NORMAL` for `PWM_POLARITY_INVERTED`. - -The value inside `pwm_led_0` after `&pwm0` must be the channel number. Since `PWM_OUT0` is defined in the pinctrl node, the channel in this example is 0. - -Finally you need to add backlight to the `chosen` element of the root devicetree node: - -```dts -/ { - chosen { - zmk,backlight = &backlight; - }; -}; -``` - - - - -### Multiple Backlight LEDs - -It is possible to control multiple backlight LEDs at the same time. This is useful if, for example, you have a Caps Lock LED connected to a different pin and you want it to be part of the backlight. - -In order to do that, first configure PWM for each pin in the pinctrl node: - -```dts -&pinctrl { - // Other Pinctrl definitions go here - pwm0_default: pwm0_default { - group1 { - psels = , // LED 0 - , // LED 1 - ; // LED 2 - }; - }; - pwm0_sleep: pwm0_sleep { - group1 { - psels = , // LED 0 - , // LED 1 - ; // LED 2 - low-power-enable; - }; - }; -}; -``` - -This part will vary based on your MCU as different MCUs have a different number of modules, channels and configuration options. - -Add each of your LEDs to the backlight node in the same manner as for one LED, using the channel number definitions in the pinctrl node: - -```dts -backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0: pwm_led_0 { - pwms = <&pwm0 0 PWM_MSEC(10) PWM_POLARITY_NORMAL>; - }; - pwm_led_1: pwm_led_1 { - pwms = <&pwm0 1 PWM_MSEC(10) PWM_POLARITY_NORMAL>; - }; - pwm_led_2: pwm_led_2 { - pwms = <&pwm0 2 PWM_MSEC(10) PWM_POLARITY_NORMAL>; - }; -}; -``` diff --git a/docs/docs/hardware-integration/lighting/index.mdx b/docs/docs/hardware-integration/lighting/index.mdx deleted file mode 100644 index 7642fe06..00000000 --- a/docs/docs/hardware-integration/lighting/index.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Lighting -sidebar_label: Lighting ---- - -import DocCardList from "@theme/DocCardList"; - -The following pages detail adding lighting support to ZMK keyboards, which currently supports two lighting systems: underglow and backlight. - -:::warning - -Although the naming of the systems might imply it, which system you use typically does _not_ depend on the physical location of the LEDs. -Instead, you should use the one that supports the LED hardware type that your keyboard has. - -::: - - diff --git a/docs/docs/hardware-integration/lighting/led-indicators.md b/docs/docs/hardware-integration/lighting/led-indicators.md deleted file mode 100644 index 04c194e1..00000000 --- a/docs/docs/hardware-integration/lighting/led-indicators.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: LED Indicators -sidebar_label: LED Indicators -description: Lighting system that indicates HID states such as caps lock. ---- - -ZMK supports the following five LED indicator states from the HID specification: - -- Num Lock -- Caps Lock -- Scroll Lock -- Compose -- Kana - -To connect these indicator states to LEDs on a keyboard, you must do two things in your board or shield files: - -1. Define an LED driver and one or more LEDs to control. -2. Configure ZMK to control those LEDs. - -## LED Definitions - -The most common setup is for LEDs to be driven directly from a GPIO pin. The examples on this page show how to controls these using the `gpio-leds` or `pwm-leds` drivers, but you can also use any other [LED driver](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/led.html) from Zephyr. - -:::warning -LED strip drivers (e.g. WS2812 LEDs) are not currently supported. More work is needed to support the separate API and avoid conflicts with the underglow system. -::: - -In your shield's `.overlay` file or board's `.dts` file, create a `gpio-leds` node and define any LEDs that you want to be able to control. The following example defines two LEDs on `&gpio0 1` and `&gpio0 2` which are enabled by driving the pins high: - -```dts -/ { - leds { - compatible = "gpio-leds"; - - num_lock_led: num_lock_led { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - }; - - caps_lock_led: caps_lock_led { - gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; - }; - }; -}; -``` - -### PWM Brightness Control - -The above example only supports LEDs being off or on at full brightness. If you want to be able to reduce the brightness or use multiple brightness levels, you must use `pwm-leds` instead of `gpio-leds`. Note that this will increase power usage slightly when LEDs are enabled compared to using `gpio-leds`. - -See the [backlight hardware integration page](backlight.mdx) for an example of configuring PWM LEDs. - -## Indicator Definitions - -Now that you have some LEDs defined, you can configure ZMK to use them. - -In your shield's `.overlay` file or board's `.dts` file, add the following include to the top of the file: - -```dts -#include -``` - -Then, add a `zmk,indicator-leds` node. This node can have any number of child nodes. Each child maps an indicator state to one or more LEDs: - -```dts -/ { - leds { - compatible = "gpio-leds"; - - // LEDs as defined in the previous step - num_lock_led: num_lock_led { ... }; - caps_lock_led: caps_lock_led { ... }; - }; - - indicators { - compatible = "zmk,indicator-leds"; - - num_lock_indicator: num_lock { - indicator = ; - leds = <&num_lock_led>; - }; - - caps_lock_indicator: caps_lock { - indicator = ; - leds = <&caps_lock_led>; - }; - }; -}; -``` - -The name of each child node is unimportant, but you should give each node a label so users can change their settings in `.keymap` files. Conventionally, you should use one of the following: - -- `num_lock_indicator` -- `caps_lock_indicator` -- `scroll_lock_indicator` -- `compose_indicator` -- `kana_indicator` - -(If you have a non-standard setup and need to use different labels, you should document this somewhere so users know how to configure them.) - -Each child node must have an `indicator` property, which is set to one of the following: - -- `HID_INDICATOR_NUM_LOCK` -- `HID_INDICATOR_CAPS_LOCK` -- `HID_INDICATOR_SCROLL_LOCK` -- `HID_INDICATOR_COMPOSE` -- `HID_INDICATOR_KANA` - -Each child node must also have an `leds` property, which holds a list of LED nodes to control. In this example, the LEDs are labeled `num_lock_led` and `caps_lock_led`, so the `leds` properties refer to them with `&num_lock_led` and `&caps_lock_led`, respectively. - -You can also control multiple LEDs from the same indicator: - -```dts - leds = <&led_1 &led_2>; -``` - -## LED Behavior - -See the [feature page](../../features/led-indicators.md) and [configuration page](../../config/led-indicators.md) for details on configuring LED brightness according to the indicator state. diff --git a/docs/docs/hardware-integration/lighting/underglow.md b/docs/docs/hardware-integration/lighting/underglow.md deleted file mode 100644 index 61ecacf6..00000000 --- a/docs/docs/hardware-integration/lighting/underglow.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: RGB Underglow -sidebar_label: RGB Underglow -description: Lighting system that controls strips of RGB LEDs. ---- - -Please see [lighting feature page](../../features/lighting.md#rgb-underglow) for an introduction on the feature. - -Support for RGB underglow is always added to a board, not a shield. This is because the LED strip drivers rely on hardware-specific interfaces (e.g. SPI, I2S) and configurations, which shields do not control. -See the documentation page on [pin control](../pinctrl.mdx) for detailed information on setting up pins for hardware protocols such as SPI or PIO that are used for LED strips. - -Shields written for boards which support RGB underglow should add a `boards/` folder underneath the shield folder. Inside this `boards/` folder, create a `.overlay` for any of the boards the shield can be used with. Place all hardware-specific configurations in these `.overlay` files. - -For example: the `kyria` shield has a [`boards/nice_nano_nrf52840_zmk.overlay`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/boards/nice_nano_nrf52840_zmk.overlay) and a [`boards/nrfmicro_nrf52840_zmk_1_3_0.overlay`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay), which configure a WS2812 LED strip for the `nice_nano/nrf52840/zmk` and `nrfmicro@1.3.0/nrf52840/zmk` boards respectively. - -### nRF52-Based Boards - -Using an SPI-based LED strip driver on the `&spi3` interface is the simplest option for nRF52-based boards. - -:::info -If possible, avoid using pins which are limited to low-frequency I/O for this purpose. The resulting interference may result in poor wireless performance. The list of low frequency I/O pins for the nRF52840 can be found at . -::: - -The following example uses `P0.06` as the "Data In" pin of a WS2812-compatible LED strip: - -```dts -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* number of LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; -}; -``` - -Standard WS2812 LEDs use a wire protocol where the bits for the colors green, red, and blue values are sent in that order. -If your board/shield uses LEDs that require the data sent in a different order, the `color-mapping` property ordering should be changed to match. - -### Other Boards - -Be sure to check the Zephyr documentation for the LED strip and necessary hardware bindings. Not every board has an `spi3` node, or configures `pinctrl` the same way. Reconcile this with any hardware restrictions found in the manufacturer's datasheet. Additional hardware interfaces may need to be enabled via Kconfig. - -For example: the `sparkfun_pro_micro_rp2040` board can utilize SPI via PIO to run a WS2812 strip on `GP0`: - -```dts -#include - -&pinctrl { - pio0_spi0_default: pio0_spi0_default { - group1 { - pinmux = ; - }; - }; -}; - -&pio0 { - status = "okay"; - - pio0_spi0: pio0_spi0 { - pinctrl-0 = <&pio0_spi0_default>; - pinctrl-names = "default"; - - compatible = "raspberrypi,pico-spi-pio"; - #address-cells = <1>; - #size-cells = <0>; - clocks = <&system_clk>; - clock-frequency = <4000000>; - - clk-gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>; /* Must be defined. Select a pin that is not used elsewhere. */ - mosi-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; /* Data In pin. */ - miso-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; /* Must be defined. Re-using the DI pin is OK for WS2812. */ - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* number of LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; - }; -}; -``` - -### Final Steps - -Once the `led_strip` is properly defined, add it to the `chosen` node under the root devicetree node: - -```dts -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; -``` diff --git a/docs/docs/hardware-integration/new-board.md b/docs/docs/hardware-integration/new-board.md deleted file mode 100644 index 3450cdfd..00000000 --- a/docs/docs/hardware-integration/new-board.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: New Board ---- - -This guide will walk through the necessary steps to write a [board](./index.mdx#boards--shields) suitable for use with ZMK. Boards used with ZMK fall into two categories: - -- Boards with interconnects, such as `nice_nano` or `seeed_xiao`. Such boards will (active development of ZMK aside) always be used with a shield to create a keyboard. -- Boards that are themselves keyboards, such as `bt75` or `ferris`. - -Some keyboards are boards but also have interconnects for modular add-ons. These are considered as keyboard-boards for the purpose of this guide. Details on adding an interconnect for modular add-ons are considered out of scope. - -## Boards Included in ZMK - -Boards with interconnects can be considered for inclusion to the tree of ZMK. If this is your aim, it is vital that you read through our [clean room policy](../development/contributing/clean-room.md). - -Boards with interconnects that are included with ZMK are generally: - -- Reliably commercially available as individual units -- In regular use across multiple shields (i.e. not niche) - -Popular open source designs which are not being sold can also be considered for inclusion. - -There also exist many boards in the tree of upstream Zephyr. We generally accept ZMK-variants of these boards into our tree as well. - -## New ZMK Module Repository - -Regardless of whether you aim to include the board in ZMK or not, you should first write the definition for it in a module. A new ZMK module repository can be created from a template. - -:::note -This guide assumes you already have a configured GitHub account. If you don't yet have one, go ahead and [sign up](https://github.com/join) before continuing. -::: - -Follow these steps to create your new repository: - -- Visit -- Click the green "Use this template" button -- In the drop down that opens, click "Use this template". -- In the following screen, provide the following information: - - A repository name, e.g. `my-board-module`. - - A brief description, e.g. `ZMK Support For MyBoard`. - - Select Public or Private, depending on your preference. -- Click the green "Create repository" button - -The repository is a combination of the directories and files required of a ZMK config, and those required of a shield module. -This enables the use of GitHub Actions to test that the shield is defined correctly. -See also the page on [module creation](../development/module-creation.md) for a reference on exactly which file structure and files are required for a ZMK keyboard module. - -We recommend that you take this moment to name your module according to our [convention](../development/module-creation.md), i.e. your `zephyr/module.yml` file should begin with - -```yaml title="zephyr/module.yml" -name: zmk-keyboard- -``` - -if it is a keyboard, or - -```yaml title="zephyr/module.yml" -name: zmk-component- -``` - -if it is a board with an interconnect. - -## Write a Zephyr Board Definition - -Zephyr has a guide on writing a board [here](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html). Follow this guide to create a Zephyr-compatible board. Use the `boards` folder of your ZMK module as a base. - -Once your board definition has been written, we recommend flashing some [Zephyr samples](https://docs.zephyrproject.org/4.1.0/samples/basic/basic.html) to it, to verify that it is working. - -Flashing Zephyr samples can also be very helpful when troubleshooting/testing the functionality of extra features such as LED ICs, Bluetooth, or various sensor ICs. - -## Write a ZMK Variant of Zephyr Board - -To make a board fully compatible with ZMK, you will be creating a ZMK variant of the Zephyr board you made in the previous step. Perform the below actions for each board you've defined, in the case of multi-board split keyboards. - -### Add Variant to board.yml - -Edit your existing `board.yml` file to add the variant: - -```yaml title="board.yml" -board: - ... - socs: - - name: - variants: - - name: zmk -``` - -### Add Kconfig for ZMK Variant - -Add a file to your board's folder called `_zmk_defconfig`. This file will be used to set Kconfig flags specific to the ZMK variant. - -:::warning -Make sure you know what each Kconfig flag does before you enable it. Some flags may be incompatible with certain hardware, or have other adverse effects. -::: - -These flags are typically a subset of the following: - -```yaml title="_zmk_defconfig" -# SPDX-License-Identifier: - -# Enable MPU -CONFIG_ARM_MPU=y - -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 - -# Enable reset by default -CONFIG_RESET=y - -# Enable clock control by default -CONFIG_CLOCK_CONTROL=y - -# Code partition needed to target the correct flash range -CONFIG_USE_DT_CODE_PARTITION=y - -# Output UF2 by default, native bootloader supports it. -CONFIG_BUILD_OUTPUT_UF2=y - -# USB HID -CONFIG_ZMK_USB=y - -# BLE HID -CONFIG_ZMK_BLE=y - -# Bootloader Support -CONFIG_RETAINED_MEM=y -CONFIG_RETENTION=y -CONFIG_RETENTION_BOOT_MODE=y - -# Settings Support -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - - -# Enable HW stack protection -CONFIG_HW_STACK_PROTECTION=y - -# Enable GPIO -CONFIG_GPIO=y - -# Defaults for matrix scanning to avoid interrupt issues -CONFIG_ZMK_KSCAN_MATRIX_POLLING=y -``` - -Note that none of our in-tree boards have all of the above flags set. We recommend referencing the Kconfig flags from an existing in-tree board with the same SoC as the one you are using for your initial definition, making sure you understand what each flag does. - -### Add Devicetree for ZMK Variant - -```dts title="_zmk.dts -/* - * Copyright (c) - * - * SPDX-License-Identifier: - */ - -// Include the base board definition -#include <../boards///.dts> -// Include predefined boot mode settings, e.g. -#include - -// Disable UART nodes if they are not actively in use (wired split) as they increase power draw -&uart0 { status = "disabled"; }; - -// Reduce the code partition section of the memory and add a storage partition to store ZMK Studio changes -&code_partition { - reg = <0x100 (DT_SIZE_M(2) - 0x100 - DT_SIZE_K(512))>; -}; -&flash0 { - reg = <0x10000000 DT_SIZE_M(2)>; - partitions { - storage_partition: partition@180000 { - reg = <0x180000 DT_SIZE_K(512)>; - read-only; - }; - }; -}; -``` - -See [here](./bootloader/index.mdx) for bootloader instructions for other SoCs. Depending on your SoC and design you may need to make further changes. Please refer to our in-tree boards with the same SoC as yours as examples. - -## Next Steps - -If your board is a keyboard, continue from [the `Kconfig.defconfig` step](https://zmk.dev/docs/hardware-integration/new-shield?keyboard-type=unibody#kconfigdefconfig) of the new shield guide. Use your ZMK variant's devicetree instead of the overlay file which would be used for a shield. - -If your board is a board with an interconnect, your next step should be to write a [tester shield](../troubleshooting/hardware-issues.mdx#identifying-issues). Such a shield should be the bare minimum shield to verify that your board works with ZMK. diff --git a/docs/docs/hardware-integration/new-shield.mdx b/docs/docs/hardware-integration/new-shield.mdx deleted file mode 100644 index de9eca55..00000000 --- a/docs/docs/hardware-integration/new-shield.mdx +++ /dev/null @@ -1,621 +0,0 @@ ---- -title: New Keyboard Shield ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import InterconnectTabs from "@site/src/components/interconnect-tabs"; -import Metadata from "@site/src/data/hardware-metadata.json"; - -export const SplitTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -export const SplitInvisTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -This guide will walk through the steps necessary to add ZMK support for a keyboard that uses an add-on MCU board (e.g. Pro Micro compatible) to provide the microprocessor. - -The high level steps are: - -- Create a new [ZMK module](../development/module-creation.md) to contain your shield. -- Create a new shield directory. -- Add the base Kconfig files. -- Add the shield overlay file defining: - - The keyboard scan driver for detecting key press/release. - - The matrix transform for mapping keyboard scan row/column values to key positions in the keymap. - - The physical layout definition to select the matrix transform and keyboard scan instance. -- Add a default keymap, which users can override in their own configs as needed. -- Add a `.zmk.yml` metadata file to document the high level details of your shield, and the features it supports. - -Many of the above files will differ depending on whether your keyboard is a unibody or is [split into multiple parts](../features/split-keyboards.md). - -After adding ZMK support for a basic shield using this guide, check the sidebar for guides on adding any additional features (such as encoders) that your keyboard has. -It may be helpful to review the upstream [shields documentation](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html#shields) to get a proper understanding of the underlying system before continuing. - -:::info -When writing your shield, please be aware of [licensing](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository): - -- If you reference code or other items that are under a copyleft license (e.g. GNU GPLv2, used by QMK) as a reference, you must license your shield under a compatible copyleft license. -- If you license anything under a copyleft license, it cannot be referenced by anyone working on ZMK (see our [clean room policy](../development/contributing/clean-room.md)). - -We generally recommend licensing your shield under MIT, if you don't have a particular incentive to do otherwise. -::: - -## New ZMK Module Repository - -The first step to creating the shield is to create a new ZMK module repository from a template. - -:::note -This guide assumes you already have a configured GitHub account. If you don't yet have one, go ahead and [sign up](https://github.com/join) before continuing. -::: - -Follow these steps to create your new repository: - -- Visit https://github.com/zmkfirmware/unified-zmk-config-template -- Click the green "Use this template" button -- In the drop down that opens, click "Use this template". -- In the following screen, provide the following information: - - A repository name, e.g. `my-shield-module`. - - A brief description, e.g. `ZMK Support For MyShield Keyboard`. - - Select Public or Private, depending on your preference. -- Click the green "Create repository" button - -The repository is a combination of the directories and files required of a ZMK config, and those required of a shield module. -This enables the use of GitHub Actions to test that the shield is defined correctly. -See also the page on [module creation](../development/module-creation.md) for a reference on exactly which file structure and files are required for a ZMK keyboard module. - -We recommend that you take this moment to name your module according to our [convention](../development/module-creation.md), i.e. your `zephyr/module.yml` file should begin with - -```yaml title="zephyr/module.yml" -name: zmk-keyboard- -``` - -## New Shield Directory - -Shields in Zephyr module "board root" go into the `boards/shields/` directory; that means the new shield directory in your module repository should be: - -```bash -mkdir boards/shields/ -``` - -## Base Kconfig Files - -:::tip[Example shields] -You can check out the [`shields` folder](https://github.com/zmkfirmware/zmk/tree/main/app/boards/shields) in the ZMK repo that houses [the in-tree supported shields](../hardware.mdx) in order to copy and modify as a starting point. -::: - -There are two required [Kconfig](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html) files that need to be created for your new keyboard shield to get it picked up for ZMK, `Kconfig.shield` and `Kconfig.defconfig`. - - - -### Kconfig.shield - -The `Kconfig.shield` file defines the shield name used to build your keyboard. - - - - -```kconfig title="Kconfig.shield" -# No whitespace after the comma or in your keyboard name! -config SHIELD_MY_KEYBOARD - def_bool $(shields_list_contains,my_keyboard) -``` - -This will set the `SHIELD_MY_KEYBOARD` flag to `y` whenever `my_keyboard` is used as the shield name. -The `SHIELD_MY_KEYBOARD` flag will be used in `Kconfig.defconfig` to set other properties about your shield, so make sure that they match. - - - - -Split keyboards have multiple shield names defined, one for each part. -For example, if your keyboard consists of two halves named `my_keyboard_left` and `my_keyboard_right`, it would look like this: - -```kconfig title="Kconfig.shield" -# No whitespace after the comma or in your part name! -config SHIELD_MY_KEYBOARD_LEFT - def_bool $(shields_list_contains,my_keyboard_left) - -# No whitespace after the comma or in your part name! -config SHIELD_MY_KEYBOARD_RIGHT - def_bool $(shields_list_contains,my_keyboard_right) -``` - -This will set the `SHIELD_MY_KEYBOARD_LEFT` flag to `y` whenever `my_keyboard_left` is used as the shield name. -Likewise, when `my_keyboard_right` is used as the shield name the `SHIELD_MY_KEYBOARD_RIGHT` flag is set to `y`. -The `SHIELD_MY_KEYBOARD_LEFT` and `SHIELD_MY_KEYBOARD_RIGHT` flags will be used in `Kconfig.defconfig` to set other properties about your shields, so make sure that they match. - - - - -### Kconfig.defconfig - -The `Kconfig.defconfig` file is used to set new defaults for configuration settings when this shield is used. -One main item that usually has a new default value set here is the `ZMK_KEYBOARD_NAME` value, which controls the display name of the device over USB and BLE. - -The updated new default values should always be wrapped inside a conditional on the shield config name defined in the `Kconfig.shield` file. - - - - -```kconfig title="Kconfig.defconfig" -if SHIELD_MY_KEYBOARD - -# Name must be less than 16 characters long! -config ZMK_KEYBOARD_NAME - default "My Keyboard" - -endif -``` - - - - -For split keyboards, a central side (usually the left) is specified via the configuration in this file. -For that side, the keyboard name is assigned and the central config is set. -The peripheral side is not assigned a name. -Finally, the split config needs to be set for both sides: - -```kconfig title="Kconfig.defconfig" -if SHIELD_MY_KEYBOARD_LEFT - -# Name must be less than 16 characters long! -config ZMK_KEYBOARD_NAME - default "My Keyboard" - -config ZMK_SPLIT_ROLE_CENTRAL - default y - -endif - -if SHIELD_MY_KEYBOARD_LEFT || SHIELD_MY_KEYBOARD_RIGHT - -config ZMK_SPLIT - default y - -endif -``` - - - - -### User Configuration Files - -In addition to the `Kconfig.shield` and `Kconfig.defconfig` files, many shields will also define a user configuration file called `my_keyboard.conf`. -This file exists to provide "suggestions" of [configuration settings](../config/index.md) for a user to select, such as enabling deep sleep. -Note that the name should match the shield/part name defined in the [Kconfig.shield file](#kconfigshield). - -:::warning -This file can also be used to set configuration options. -However, if a flag is set in this file, **the user can no longer change it**. -Though sometimes necessary, this method of setting configuration options is discouraged. -The case for which this is necessary is due to be eliminated in the future, making this method redundant. -::: - - - - - -Split keyboards can have multiple `.conf` files, one for each part. For example: - -- `my_keyboard.conf` - Configuration elements affect both halves -- `my_keyboard_left.conf` - Configuration elements only affect left half -- `my_keyboard_right.conf` - Configuration elements only affect right half - -In most case you'll only need to use the .conf file that affects both halves of a split board. - -:::note -The shared configuration in `my_keyboard.conf` is only applied when you are building with a [`zmk-config` folder](../development/local-toolchain/build-flash.mdx#building-from-zmk-config-folder) and it is present at `config/my_keyboard.conf`. -::: - - - - -## Shield Overlays - - - -Shield overlay files contain a devicetree description that is merged with the primary board devicetree description during the firmware building process. -There are three main things that need to be defined in this file: - -- Your keyboard scan (kscan) driver, which determines which GPIO pins to scan for key press events -- Your matrix transform, which acts as a "bridge" between the kscan and the keymap -- Your physical layout, which aggregates the above and (optionally) defines physical key positions so that the keyboard can be used with [ZMK Studio](../features/studio.md). - - - - -A unibody keyboard will have a single overlay file named `my_keyboard.overlay`, where `my_keyboard` is the shield name defined in the [Kconfig.shield file](#kconfigshield). - - - - -A split keyboard will have an overlay file defined for each split part. -For example, if the keyboard is split into a left and a right half, these can be named: - -- `my_keyboard_left.overlay` -- `my_keyboard_right.overlay` - -Here `my_keyboard_left` and `my_keyboard_right` are the shield names defined in the [Kconfig.shield file](#kconfigshield). - -Split keyboards often share some of their devicetree description. -The standard approach is to have a core `my_keyboard.dtsi` (devicetree include) file, which is included into each of the shield overlays. - - - - -### Kscan - -The kscan node defines the controller GPIO pins that are used to scan for key press and release events. The pins are referred to using the GPIO labels noted in the pinouts below: - - - -To use GPIO pins that are not part of the interconnects as described above, you can use the GPIO labels that are specific to each controller type. -For instance, pins numbered `PX.Y` in nRF52840-based boards can be referred to via `&gpioX Y` labels. -An example is `&gpio1 7` for the `P1.07` pin that the nice!nano exposes in the middle of the board. - -The [Keyboard Scan configuration documentation](../config/kscan.md) has the full details on configuring the kscan driver. - - - - -For a simple 3x3 macropad matrix, the kscan might look something like: - -```dts title="my_keyboard.overlay" -/ { - kscan0: kscan0 { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; - wakeup-source; - - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; - - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; -}; -``` - - - - -For split keyboards you should define your kscan in `my_keyboard.dtsi`. -If your `row-gpios` or your `col-gpios` (or both) are identical between the parts, then they should also be defined in `my_keyboard.dtsi`. -For example, for a `col2row` 2-part split keyboard (18 keys split into a 3x3 macropad on both halves) where the "row" GPIOs used are the same for both halves: - -```dts title="my_keyboard.dtsi" -/ { - kscan0: kscan0 { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; - wakeup-source; - - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - - }; -}; -``` - -The missing `col-gpios` would be defined in your `my_keyboard_left.overlay` and `my_keyboard_right.overlay` files. - -```dts title="my_keyboard_left.overlay" -#include "my_keyboard.dtsi" // The shared dtsi file is included in the overlay - -// Label of the kscan node in the dtsi -&kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; -}; -``` - -```dts title="my_keyboard_right.overlay" -#include "my_keyboard.dtsi" // The shared dtsi file is included in the overlay - -// Label of the kscan node in the dtsi -&kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 11 GPIO_ACTIVE_HIGH> - , <&pro_micro 13 GPIO_ACTIVE_HIGH> - ; -}; -``` - - - - -### Matrix Transform - -The matrix transform is used to transform row/column events into "key position" events. - -When a key is pressed, a kscan event is generated from it with a `row` and a `column` value corresponding to the zero-based indices of the `row-gpios` and `col-gpios` pins that triggered the event, respectively. -Then, the "key position" triggered is the index of the `RC(row, column)` in the matrix transform where `row` and `column` are the indices as mentioned above. -This key position will in turn have a behavior binding associated with it in the keymap. - - - - -The `my_keyboard.overlay` must include a matrix transform that defines this mapping from row/column values to key positions. -Add `#include ` to the top of the file. - -Here is an example of a matrix transform for the previous 3x3 macropad: - -```dts title="my_keyboard.overlay" -#include // Put this with the other includes at the top of your overlay - -/ { - default_transform: keymap_transform0 { - compatible = "zmk,matrix-transform"; - columns = <3>; // Length of the "col-gpios" array - rows = <3>; // Length of the "row-gpios" array - map = < - // Key 1 | Key 2 | Key 3 - RC(0,0) RC(0,1) RC(0,2) - // Key 4 | Key 5 | Key 6 - RC(1,0) RC(1,1) RC(1,2) - // Key 7 | Key 8 | Key 9 - RC(2,0) RC(2,1) RC(2,2) - >; - }; -}; -``` - - - - -Split keyboards should define their matrix transform in the shared `my_keyboard.dtsi`. Add `#include ` to the top of the file. - -Here is an example of a matrix transform for the previous example (18-key double macropad): - -```dts title="my_keyboard.dtsi" -#include // Put this with the other includes at the top of your dtsi - -/ { - default_transform: keymap_transform0 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <3>; - map = < - // LKey 1 |LKey 2 |LKey 3 RKey 1 |RKey 2 |RKey 3 - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) - // LKey 4 |LKey 5 |LKey 6 RKey 4 |RKey 5 |RKey 6 - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) - // LKey 7 |LKey 8 |LKey 9 RKey 7 |RKey 8 |RKey 9 - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) - >; - }; -}; -``` - -The above transform has 6 columns and three rows, while each half of the keyboard only has three columns and three rows. -To allow the kscan matrices to be joined in the matrix transform, an offset is applied to the matrix transform of peripherals. - -```dts title="my_keyboard_right.overlay" -&default_transform { // Offset of 3 because the left side has 3 columns - col-offset = <3>; -}; -``` - -This offset means that when the right half of the keyboard has a key event triggered by the GPIO pins at the indices `0,0` of its `row-gpios` and `col-gpios` arrays respectively, it will interpret it as an `RC(0,3)` event rather than an `RC(0,0)` event. -Additional peripherals would need their columns to be offset by an ever increasing number equal to the sum of the columns in the central + any peripherals that came before it. -You can also apply row offsets with `row-offset`. - - - - -The matrix transform is also used to "correct" pin orderings into something that more closely matches the physical order of keys. Causes of abnormal pin orderings include: - -- To reduce the used pins, an "efficient" number of rows/columns for the GPIO matrix is used, that does _not_ match the physical layout of rows/columns of the actual key switches. -- For non-rectangular keyboards with thumb clusters, non `1u` locations, etc. - -See the [in-tree keyboards](https://github.com/zmkfirmware/zmk/tree/main/app/boards/shields) that ZMK defines for examples of more complex matrix transformations. - -Also see the [matrix transform section](../config/layout.md#matrix-transform) in the Keyboard Scan configuration documentation for further details and examples of matrix transforms. - -### Physical Layout - -Your keyboard will need to have a physical layout defined. -Physical layouts organize the matrix transform, kscan and optionally the physical description of key positions in a single entity. - - - - -If you are not planning to add support for [ZMK Studio](../features/studio.md), you can add a `zmk,physical-layout`-compatible node for each physical layout your keyboard supports: - -```dts -/ { - physical_layout0: physical_layout_0 { // First physical layout, use different naming for other layouts - compatible = "zmk,physical-layout"; - display-name = "Default Layout"; - kscan = <&kscan0>; // Label of the kscan node, optional if all layouts use the same - transform = <&default_transform>; // Label of the matrix transform for this layout - }; -}; -``` - -These nodes should be placed in `my_keyboard.overlay` for unibody keyboards and the shared `my_keyboard.dtsi` for splits. - - - - -If you are planning to add support for [ZMK Studio](../features/studio.md), you should follow the [physical layouts documentation](physical-layouts.md) to create a new file `my_keyboard-layouts.dtsi` which includes the physical layout definitions. -Once you have finished defining your physical layouts, import the `my_keyboard-layouts.dtsi` file at the top of your `my_keyboard.overlay` file (unibody) or `my_keyboard.dtsi` file (split). - -```dts -#include "my_keyboard-layouts.dtsi" -``` - - - - -### Chosen Node - -Set the `chosen` node to a defined "default" physical layout. This should also be placed in the same file as the physical layout, i.e. `my_keyboard.overlay` for unibodies and `my_keyboard.dtsi` for split keyboards. - -```dts -/ { - chosen { - zmk,physical-layout = &physical_layout0; - // Other chosen items - }; -}; -``` - -If you define multiple physical layouts, users can select a different layout by overriding the `zmk,physical-layout` chosen node in their keymap file or by using [ZMK Studio](../features/studio.md) if your board is compatible with it. - -:::note -If all of your physical layouts use the same `kscan` node under the hood, you can skip setting the `kscan` property on each layout and instead assign the `zmk,kscan` chosen node to your single kscan instance: - -```dts -/ { - chosen { - zmk,kscan = &kscan0; - zmk,physical-layout = &physical_layout0; - // Other chosen items - }; -}; -``` - -::: - -### Wired Split - - -This is only required for wired split keyboards. - - -If testing the experimental [wired split](../features/split-keyboards.md) support, you should assign a [predefined](./pinctrl.mdx#predefined-nodes) or [pinctrl configured](./pinctrl.mdx) UART to the `device` property of a new node with `compatible` value of `"zmk,wired-split"`: - -```dts -/ { - wired_split { - compatible = "zmk,wired-split"; - device = <&pro_micro_serial>; - }; -}; -``` - -See the [wired split](../config/split.md#wired-split) configuration for more details. - -For wireless split keyboards, this step should be skipped, especially since the UART pins on your controller might already be in use for other functionality. - - - - -## Default Keymap - -Each keyboard should provide a default keymap to be used when building the firmware, which can be overridden and customized by user configs. -For "shield keyboards", this should be placed in the `boards/shields/my_keyboard/my_keyboard.keymap` file. - -Here is an example simple keymap for a 3x3 macropad, with only one layer: - -```dts title="my_keyboard.keymap" -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { // Layer 0 - // ------------------------------------- - // | Z | M | K | - // | A | B | C | - // | D | E | F | - bindings = < - &kp Z &kp M &kp K - &kp A &kp B &kp C - &kp D &kp E &kp F - >; - }; - }; - }; -``` - -The keymap should match the order of the keys in the [matrix transform](#matrix-transform) exactly, left to right, top to bottom (they are both 1 dimensional arrays rearranged with newline characters for better legibility). -See [Keymaps](../keymaps/index.mdx) for information on defining keymaps in ZMK. -If you wish to use [ZMK Studio](../features/studio.md) with your keyboard, make sure to assign the [ZMK Studio unlocking behavior](../keymaps/behaviors/studio-unlock.md) to a key in your keymap. - -## Metadata - -ZMK makes use of an additional metadata YAML file for all boards and shields to provide high level information about the hardware to be incorporated into setup scripts/utilities, website hardware list, etc. - -Here is a sample `corne.zmk.yml` file from the repository: - -```yaml -file_format: "1" -id: corne -name: Corne -type: shield -url: https://github.com/foostan/crkbd/ -requires: [pro_micro] -exposes: [i2c_oled] -features: - - keys - - display -siblings: - - corne_left - - corne_right -``` - -You should place a properly named `my_keyboard.zmk.yml` file in the directory next to your other shield values, and fill it out completely and accurately. -See [Hardware Metadata Files](hardware-metadata-files.md) for the full details. - -## Testing - -Once you've defined everything as described above, you can build your firmware to make sure everything is working. -If you wish to test that your keyboard works with [ZMK Studio](../features/studio.md), you'll also need to follow the [instructions for enabling Studio](../features/studio.md#building). - -### GitHub Actions - -To use GitHub Actions to test, push the files defining the keyboard to GitHub. -Next, [update the `build.yaml`](../customization.md#building-additional-keyboards) of your `zmk-config` to build your keyboard. - -- If your shield is defined in your `zmk-config`, then the shield should start building. -- If the shield is defined in a separate module, you will need to [adjust your `west.yml` to reference the module](https://zmk.dev/docs/features/modules#building-with-modules). - -### Local Toolchain - -You can also use a local toolchain setup to test your keyboard. -Follow [our guide for getting set up](../development/local-toolchain/setup/index.md), then follow the [instructions for building and flashing locally](../development/local-toolchain/build-flash.mdx). -You will need to specify the module of your keyboard when building. diff --git a/docs/docs/hardware-integration/physical-layouts.md b/docs/docs/hardware-integration/physical-layouts.md deleted file mode 100644 index 60a29a8d..00000000 --- a/docs/docs/hardware-integration/physical-layouts.md +++ /dev/null @@ -1,418 +0,0 @@ ---- -title: Physical Layouts -toc_max_heading_level: 4 ---- - -A physical layout is a devicetree entity that aggregates all details about a certain possible keyboard layout. -It contains: - -- A [keyboard scan (kscan) driver](../config/kscan.md) -- A [matrix transform](../config/layout.md#matrix-transform) -- (Optional) [Physical key positions](#optional-keys-property) - -By convention, physical layouts and any [position maps](#position-map) are defined in a separate file called `-layouts.dtsi`. -This file should then be imported by the appropriate file, such as an `.overlay`, `.dts`, or a `.dtsi` (the last of which is itself imported by one of the previous). - -## Basic Physical Layout - -A bare physical layout without the `keys` property looks like this: - -```dts title="-layouts.dtsi" -/ { - physical_layout0: physical_layout_0 { - compatible = "zmk,physical-layout"; - display-name = "Default Layout"; - }; -}; -``` - -Every physical layout needs a matrix transform, and optionally can also have a kscan. By convention, these are assigned to the physical layout in the file where the matrix transform and kscan are defined: - -```dts title=".dts | .dtsi | .overlay" -&physical_layout0 { - kscan = <&kscan0>; // Label of the kscan node this layout uses - transform = <&default_transform>; // Label of the matrix transform this layout uses -}; -``` - -The `kscan` property only needs to be assigned if some of your physical layouts use different kscans. Otherwise, it can be omitted and the `kscan` can be assigned in the [`chosen` node](./new-shield.mdx#chosen-node) instead. See the [configuration section on physical layouts](../config/layout.md#physical-layout) for reference. - -## (Optional) Keys Property - -The `keys` property is required for [ZMK Studio](../features/studio.md) support. It is used to describe the physical attributes of each key position present in that layout. - -To pull in the necessary definition for creating physical layouts with the `keys` property, a new include should be added to the top of the devicetree file: - -```dts title="-layouts.dtsi" -#include -``` - -Assigned to the `keys` property is an array of key descriptions listed in the same order as keymap bindings, matrix transforms, etc. -A key description has the shape `<&key_physical_attrs w h x y r rx ry>` with the following properties: - -| Property | Type | Description | Unit | -| ---------- | -------- | ------------------------------------ | ------------------------------------------------------- | -| Width | int (>0) | Key(cap) width | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Height | int (>0) | Key(cap) height | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| X | uint | Key X position (top-left point) | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Y | uint | Key Y position (top-left point) | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Rotation | int | Key rotation (positive => clockwise) | [centi-](https://en.wikipedia.org/wiki/Centi-)degree | -| Rotation X | int | Rotation origin X position | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | -| Rotation Y | int | Rotation origin Y position | [centi-](https://en.wikipedia.org/wiki/Centi-)"keyunit" | - -You can specify negative values in devicetree using parentheses around it, e.g. `(-3000)` for a 30 degree counterclockwise rotation. - -We recommend the use of for writing a physical layout or converting one from a QMK JSON definition. If your keyboard already has a physical layout defined for the use with KLE, we recommend using first to convert your existing layout into QMK JSON. The second tool can also import the position data from KiCAD, if said program was used to design the keyboard. - -### Physical Layout with Keys Example - -Here is an example of a physical layout for a 2x2 macropad: - -```dts title="macropad-layouts.dtsi" -#include - -/ { - macropad_physical_layout: macropad_physical_layout { - compatible = "zmk,physical-layout"; - display-name = "Macro Pad"; - transform = <&default_transform>; - kscan = <&kscan0>; - keys // w h x y rot rx ry - = <&key_physical_attrs 100 100 0 0 0 0 0> - , <&key_physical_attrs 100 100 100 0 0 0 0> - , <&key_physical_attrs 100 100 0 100 0 0 0> - , <&key_physical_attrs 100 100 100 100 0 0 0> - ; - }; -}; -``` - -## Using Predefined Layouts - -ZMK defines a number of popular physical layouts in-tree at [`app/dts/layouts`](https://github.com/zmkfirmware/zmk/tree/main/app/dts/layouts). -To use such layouts, import them and assign their `transform` and (optionally) `kscan` properties. - -Here is an example of using the predefined physical layouts for a keyboard with the same layout as the "ferris": - -```dts title="ferris.dtsi" -#include - -// Assigning suitable kscan and matrix transforms -&cuddlykeyboards_ferris_layout { - transform = <&default_transform>; - kscan = <&kscan0>; -}; -``` - -Shared physical layouts found in the same folder are defined such that they can be used together, to define [multiple physical layout](#multiple-physical-layouts) options. See below for more information on multiple physical layouts. - -Here is an example of using the predefined physical layouts for a 60% keyboard: - -```dts title="bt60_v1.dts" -#include -#include -#include -#include - - -// Assigning suitable kscan and matrix transforms -&layout_60_ansi { - transform = <&ansi_transform>; - kscan = <&ansi_kscan>; -}; - -&layout_60_iso { - transform = <&iso_transform>; - kscan = <&iso_kscan>; -}; - -&layout_60_all1u { - transform = <&all_1u_transform>; - kscan = <&all_1u_kscan>; -}; - -&layout_60_hhkb { - transform = <&hhkb_transform>; - kscan = <&hhkb_kscan>; -}; -``` - -## Multiple Physical Layouts - -If a keyboard has multiple possible layouts (e.g. you can snap off an outer column), then you should define multiple matrix transformations and multiple physical layouts, one for each possible layout. -If necessary, you can also define multiple kscan instances. - -```dts title="-layouts.dtsi" -// Needed if and only if keys property is used -#include - -/ { - default_layout: default_layout { - compatible = "zmk,physical-layout"; - display-name = "Default Layout"; - transform = <&default_transform>; - kscan = <&kscan0>; - keys = <...>; // List of key positions, optional - }; - - alt_layout: alt_layout { - compatible = "zmk,physical-layout"; - display-name = "Alternate Layout"; - transform = <&alt_transform>; - kscan = <&alt_kscan0>; - keys = <...>; // List of key positions, optional - }; -}; -``` - -### Position Map - -When switching between layouts using [ZMK Studio](../features/studio.md), an attempt is made to automatically infer bindings for the keys in the new layout from the old layout. Keys with the same physical key properties are given the same binding. This approach has some limitations, so for more accurate transference of bindings a position map is used. - -:::warning - -Keys whose positions can neither be inferred from the default layout nor have bindings in the position map cannot be assigned to. - -::: - -A position map looks something like this: - -```dts title="-layouts.dtsi" -/ { - position_map { - compatible = "zmk,physical-layout-position-map"; - complete; // Optional, see 'Example non-complete position map' - layout1: layout1 { - physical-layout = <&physical_layout1>; - positions = <...>; // List of positions to map - }; - layout2: layout2 { - physical-layout = <&physical_layout2>; - positions = <...>; // List of positions to map - }; - // Additional layout child nodes - }; -}; -``` - -A child node is defined for every layout the keyboard can have. The `positions` properties each contain an array of indices, which are used to refer to keys in the `keys` array of their corresponding physical layout. A `0` in the `positions` property refers to the first key in the `keys` array, a `1` refers to the second, and so on. - -When switching from one layout to another, say from layout 1 to layout 2, the _orderings_ found in the `positions` arrays are used. The first key in the `positions` array of layout 2 is given the binding assigned to the first key in the `positions` array of layout 1, the second key in the `positions` array of layout 2 is given the binding assigned to the second key in the `positions` array of layout 1, and so on. - -The position map should be marked as `complete` if all desired binding transfers are defined within it. Otherwise, [ZMK Studio](../features/studio.md) will continue to automatically determine assignments for keys not listed in the position map. See [this example non-complete position map](#example-non-complete-position-map) for why this could be useful. - -See also the [configuration section on position maps](../config/layout.md#physical-layout-position-map). - -We recommend the use of , distinct from the previous two mentioned, for the purposes of writing a position map. - -#### Writing a position map - -Start by creating the parent node defining the position map: - -```dts title="-layouts.dtsi" -/ { - keypad_position_map { - compatible = "zmk,physical-layout-position-map"; - complete; // Optional, see 'Example non-complete position map' - - // Child node 1 here - - // Child node 2 here - - // ... - }; -}; -``` - -It is easiest to write the position map by considering one layout to be the "reference" layout, and defining all other position maps with respect to it. The reference layout should usually be the one with the most keys, as that creates a position map where no key bindings are lost when switching to a layout with fewer keys and back. - -Create the child node for the reference layout, and fill the `positions` array by counting upwards, giving it the same order and number of keys as the `keys` property of its physical layout. For a 2x2 macropad the child node would be - -```dts title="2x2macropad-layouts.dtsi" -/ { - keypad_position_map { - // Other properties - - macropad_map: macropad { - physical-layout = <¯opad_layout>; - positions // This is equivalent to `positions = <0 1 2 3>;`, reshaped for readability - = < 0 1 > - , < 2 3 >; - }; - }; -}; -``` - -Next write the child nodes for every other layout with respect to the reference. For keys present in the reference which aren't present in the layout you're writing the child node for, count backwards: The first key that isn't present is given the highest number found in the `positions` array of the reference, the second key that isn't present is given the second highest number, and so on. The below examples show this process more clearly. - -#### Example larger position map - -Consider the following macropad/numpad with two physical layouts: - -![A 4x5 numpad/macropad](../assets/hardware-integration/numpad.svg) - -Let us first consider each side individually. The "reference" position map of the left side would look like this: - -```dts title="macropad-layouts.dtsi" -/ { - keypad_position_map { - // Other properties - - macropad_map: macropad { - physical-layout = <¯opad_layout>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 19>; - }; - }; -}; -``` - -Meanwhile, the "reference" position map of the right side with fewer keys would look like this: - -```dts title="macropad-layouts.dtsi" -/ { - keypad_position_map { - // Other properties - - numpad_map: numpad { - physical-layout = <&numpad_layout>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 > - , <11 12 13 14> - , <15 16 >; - }; - }; -}; -``` - -As a reminder, the `positions` property is a one-dimensional array like the `keys` property, formatted nicely through the use of whitespace and angle bracket groupings. - -If the left side with more keys was used as the reference layout, then the overall position map of the keyboard would look like this: - -```dts title="macropad-layouts.dtsi" -/ { - keypad_position_map1 { - compatible = "zmk,physical-layout-position-map"; - complete; - - macropad_map: macropad { - physical-layout = <¯opad_layout>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 11> - , <12 13 14 15> - , <16 17 18 19>; - }; - - numpad_map: numpad { - physical-layout = <&numpad_layout>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 19> - , <11 12 13 14> - , <15 18 16 17>; - }; - }; -}; -``` - -The "missing" positions are filled with the "spare" numbers of the layout with more keys. The order in which the spare keys are used is arbitrary and counting backwards is a convenient way to assign them. - -If the right side with fewer keys were used as a reference instead, then the overall position map would look like this: - -```dts title="macropad-layouts.dtsi" -/ { - keypad_position_map2 { - compatible = "zmk,physical-layout-position-map"; - complete; - - macropad_map: macropad { - physical-layout = <¯opad_layout>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 > - , <12 13 14 15> - , <16 18 >; - }; - - numpad_map: numpad { - physical-layout = <&numpad_layout>; - positions - = < 0 1 2 3> - , < 4 5 6 7> - , < 8 9 10 > - , <11 12 13 14> - , <15 16 >; - }; - }; -}; -``` - -There is functionally no difference between the two approaches, but the first approach is recommended. - -#### Example non-`complete` position map - -Consider the above device again -- most of the positions have identical `keys` properties. For example, the macropad's `12` key and the numpad's `11` key would have the same physical property, and be mapped to each other automatically. The keys whose mappings are unable to be determined automatically are those with different physical characteristics: the 2u high and 2u wide keys, and their corresponding 1u counterparts. - -A non-`complete` position map can be used to assign mappings to only these particular keys: - -```dts title="macropad-layouts.dtsi" -/ { - keypad_position_map3 { - compatible = "zmk,physical-layout-position-map"; - - macropad_map: macropad { - physical-layout = <¯opad_layout>; - positions = <7 15 16>; - }; - - numpad_map: numpad { - physical-layout = <&numpad_layout>; - positions = <7 14 15>; - }; - }; -}; -``` - -This is noticably simpler to write, and can be a useful way of saving flash space for memory-constrained devices. - -#### Additional example: corne - -The following is an example of a position map which maps the 5-column and 6-column Corne keymap layouts. The 6 column layout is the reference layout. - -```dts - foostan_corne_lossless_position_map { - compatible = "zmk,physical-layout-position-map"; - - complete; - - twelve_map: twelve { - physical-layout = <&foostan_corne_6col_layout>; - positions - = < 0 1 2 3 4 5 6 7 8 9 10 11> - , <12 13 14 15 16 17 18 19 20 21 22 23> - , <24 25 26 27 28 29 30 31 32 33 34 35> - , < 36 37 38 39 40 41 >; - }; - - ten_map: ten { - physical-layout = <&foostan_corne_5col_layout>; - positions - = <41 0 1 2 3 4 5 6 7 8 9 40> - , <39 10 11 12 13 14 15 16 17 18 19 38> - , <37 20 21 22 23 24 25 26 27 28 29 36> - , < 30 31 32 33 34 35 >; - }; - }; -``` - -The above position map is in actuality spread over [multiple files](https://github.com/zmkfirmware/zmk/tree/main/app/dts/layouts/foostan/corne), as one of our predefined layouts. diff --git a/docs/docs/hardware-integration/pinctrl.mdx b/docs/docs/hardware-integration/pinctrl.mdx deleted file mode 100644 index 67dec613..00000000 --- a/docs/docs/hardware-integration/pinctrl.mdx +++ /dev/null @@ -1,573 +0,0 @@ ---- -title: Board Pin Control -sidebar_label: Pin Control ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import InterconnectTabs from "@site/src/components/interconnect-tabs"; -import Metadata from "@site/src/data/hardware-metadata.json"; - -This page exists to provide a guide to [Pin Control](https://docs.zephyrproject.org/4.1.0/hardware/pinctrl/index.html#pin-control) for ZMK users and designers. Refer to [Zephyr's page on Pin Control](https://docs.zephyrproject.org/4.1.0/hardware/pinctrl/index.html#pin-control) for elaboration and more details on any of the points raised here. - -A basic keyboard design as introduced in the [new shield guide](./new-shield.mdx) only uses its pins for the keyboard matrix. Many keyboard designs make use of advanced components or functionality, such as displays or shift registers. This results in the keyboard making use of communication protocols such as (but not limited to) SPI, I2C, or UART. Configuring pins for the usage of advanced functionality such as drivers for the previously named protocols is referred to as "Pin Control". - -The details of pin control can vary from vendor to vendor. An attempt was made to be as general as possible, but it isn't possible to cover all possible cases. The approaches for the nRF52840 and RP2040 MCUs/SoCs are documented in their entirety below. For other MCUs/SoCs, please refer to the [Zephyr documentation](https://docs.zephyrproject.org/4.1.0/index.html) and the examples and other files found in-tree of [ZMK](https://github.com/zmkfirmware/zmk/tree/main/app/boards) and [ZMK's fork of Zephyr](https://github.com/zmkfirmware/zephyr). - -## Boards, Shields, and Modules - -Pin control is always defined for a _board_, never for a shield: - -- If you are defining a keyboard that is a _board_, then you will be editing and adding on to the files in your keyboard's folder as usual. -- If your keyboard consists of a _board and a shield_, then you should define a new folder inside of your shield's folder called `boards`. You will need to add a `.overlay` for each board to be used with said shield. Take for example the file structure of the "sofle" shield: - ```plaintext - boards/shields/sofle/ - ├── boards/ - │ ├── nice_nano_nrf52840_zmk.overlay - │ ├── nrfmicro_nrf52840_zmk_1_3_0.overlay - └── - ``` - Note that you will need to define a separate overlay _for each_ of the boards to be used with the shield. - -Assume that the shield that you are using is found in-tree of ZMK or within an external module, and _does not_ contain the overlay for the board that you wish to use. -If this is the case, then you should fork the source repository and add the overlay to the fork. Use said fork to build your firmware, and potentially submit a PR to upstream. - -## Predefined Nodes - -Many boards will already have some pins configured for particular protocols. We recommend using these pins whenever possible. - - - -Note that some boards may have these pins configured to fit the above pinouts, rather than the capabilities of the MCU. Most notably, boards using the nRF52840 often end up putting low-frequency pins at the locations of the SPI buses above. More on low-frequency pins in the next section. - -## Pin Selection - -Prior to setting up pin control, you will want to make sure that the pins you use are suitable for the driver that you are using. For this purpose, you will most likely need to consult the datasheet of your MCU/SoC directly. Different MCUs/SoCs have different restrictions in regards to this. The nRF52840 and RP2040 are excellent examples: - -- The nRF52840 has its pins marked as either low frequency or high frequency. - - Using low frequency pins at a frequency of over 10KHz can cause reliability issues with the wireless antenna, making them unideal for I2C, UART, and (most of) SPI. - - High frequency pins can be used for almost all protocols that the nRF52840 is capable of, without restrictions. The exception is QSPI, which is restricted to specific high frequency pins (QSPI is mostly irrelevant for keyboard designs). -- The RP2040 supports two SPI buses labeled SPI0 and SPI1, two I2C buses labeled I2C0 and I2C1, and two UART buses labeled UART0 and UART1. It restricts its pins to particular functions for each of these. For example, pin 0 can be used as the RX pin of SPI0, the TX pin of UART0, or the SDA pin of I2C0.

You will need to make sure that the pins you select all lie on the same bus and fulfil each of the functions necessary for the bus to function. So for a fully functioning SPI0 bus, you would need to select a SPI0 RX pin, a SPI0 TX pin, and a SPI0 SCK pin.

The RP2040 also comes with programmable input/output blocks (PIO) that can be used to emulate protocols such as (but not limited to) the previously named protocols. Using PIO adds some complexity though, and there are a limited number of PIO blocks, so it is recommended that you stick to the predefined buses where possible. - -Note that not all peripherals require all pins to be defined - for example, there are plenty of SPI devices which do not require either the MISO (Main In, Sub Out) or the MOSI (Main Out, Sub In) pin. - -## Pin Control File - -Pin control consists of two parts: - -1. Defining and grouping the pins together for a driver -2. Augmenting a driver/bus node and assigning pin groups to it - -It is standard to do this in two separate files. Create a file called `-pinctrl.dtsi`, which will be used for the first part. This file will later be imported into your board's `.dts`. If you are configuring pin control for a [shield](#boards-shields-and-modules), it is common to write the contents of both parts into the `.overlay` file directly. - -### MCU/SoC Pinctrl Bindings Files - -The specifics of pin control for a particular MCU/SoC are presented via a [devicetree bindings](https://docs.zephyrproject.org/latest/build/dts/bindings-intro.html) file, found under `zephyr/dts/bindings/pinctrl/`. - -- The nRF52840 uses the `zephyr/dts/bindings/pinctrl/nordic,nrf-pinctrl.yaml` file. -- The RP2040 uses the `zephyr/dts/bindings/pinctrl/raspberrypi,pico-pinctrl.yaml` file. - -These files often contain useful comments on pin control for their devices, and so can be worth a read in addition to this page. - -### MCU/SoC Pinctrl Bindings Headers - -MCUs/SoCs will also have pinctrl header files found under `zephyr/include/zephyr/dt-bindings/pinctrl/`. You will want to make sure that the header file corresponding to your MCU/SoC is imported into your board's `.dts`/`.overlay`. For the nRF52840, your board should already be importing a file such as `nordic/nrf52840_qiaa.dtsi`, which includes the pinctrl header via the following inclusions: - -```plaintext -nrf-pinctrl.h -> nrf_common.dtsi -> nrf52840.dtsi -> nrf52840_qiaa.dtsi -``` - -The corresponding file for the RP2040 (`rpi_pico/rp2040.dtsi`), however, does not include the pinctrl header. Hence you will need to import said header at the top of your `-pinctrl.dtsi` file: - -```dts title="-pinctrl.dtsi" -#include -``` - -If you are configuring pin control for a [shield](#boards-shields-and-modules), then this file may already be imported by the board's definition, in which case you shouldn't re-include it here. - -:::info -Some MCUs/SoCs may have their headers located in a Zephyr HAL module. See for example the [Atmel HAL module](https://github.com/zephyrproject-rtos/hal_atmel/tree/master/include/dt-bindings/pinctrl). -::: - -### Pinctrl Node - -All of your configuration will happen by adjusting the `pinctrl` node. Changes are made like so: - -```dts title="-pinctrl.dtsi" -&pinctrl { - /* your modifications go here */ -}; -``` - -Within said node, you will configure one or more child nodes for the buses. You will want to define the child nodes according to the instructions in the `pinctrl.yaml` file. -The child nodes that you define should be named appropriately. The common naming schema is `usageNumber_state`. For example, `uart0_default`. - -Child nodes are (generally, there are [exceptions](https://docs.zephyrproject.org/4.1.0/hardware/pinctrl/index.html#pin-configuration)) expected to contain one or more subnodes typically named "groupX". These are for grouping together pins that should be assigned the same state, such as enabling an internal pull-up. -Below are some examples of SPI child nodes for the nRF52840 and the RP2040. Further examples are contained within the comments of the respecting `pinctrl.yaml` files. - - - -```dts title="-pinctrl.dtsi" -&pinctrl { - /* configuration for spi0 device, default state */ - spi0_default: spi0_default { - /* node name is arbitrary */ - group1 { - /* main role: configure P0.01 as SPI clock, P0.02 as SPI MOSI, P0.03 as SPI MISO */ - psels = , - , - ; - }; - }; - - /* configuration for spi0 device, sleep state */ - spi0_sleep: spi0_sleep { - group1 { - /* main role: configure P0.01 as SPI clock, P0.02 as SPI MOSI, P0.03 as SPI MISO */ - psels = , - , - ; - low-power-enable; - }; - }; - -}; - -```` -Pins are always selected via assignments to `psels`. `NRF_PSEL` is a helper macro with the following arguments: -- Pin function configuration. This is the `name` portion of one of the `NRF_FUNC_{name}` macros found in `zephyr/include/zephyr/dt-bindings/pinctrl/nrf-pinctrl.h`. -- Port (0 or 1). -- Pin (0 to 31). - -The following pin properties can be assigned to groups: - -- `bias-disable`: Disable pull-up/down (default behavior, not required). -- `bias-pull-up`: Enable pull-up resistor. -- `bias-pull-down`: Enable pull-down resistor. -- `low-power-enable`: Configure pin as an input with input buffer disconnected. - -Note that bias options are mutually exclusive. - -There is an additional child node for the "sleep" state, configuring the pins for low power. More on states will be explained later. - - -```dts title="-pinctrl.dtsi" -&pinctrl { - /* configuration for spi0 device, default state */ - spi0_default: spi0_default { - group1 { - /* configure P18 as SPI0 clock, P19 as SPI0 MOSI */ - pinmux = , ; - }; - group2 { - /* configure P16 as SPI0 MISO */ - pinmux = ; - /* enable input on pin 1 */ - input-enable; - }; - }; - - /* configuration for an spi device using PIO0, default state */ - pio0_spi_default: pio0_spi_default { - group1 { - /* Configure P13 and P14 for PIO, to be used for MOSI and SCK */ - pinmux = , ; - }; - group2 { - /* Configure P16 for PIO to be used for MISO with input */ - pinmux = ; - input-enable; - }; - }; -}; -```` - -The values that can be listed in `pinmux` to assign functionality to pins are listed in `zephyr/include/zephyr/dt-bindings/pinctrl/rpi-pico-rp2040-pinctrl.h`. - -The following pin properties can be assigned to groups: - -- `bias-disable`: Disable pull-up/down (default, not required). -- `bias-pull-up`: Enable pull-up resistor. -- `bias-pull-down`: Enable pull-down resistor. -- `input-enable`: Enable input from the pin. -- `input-schmitt-enable`: Enable input hysteresis. -- `drive-strength`: Set the drive strength of the pin, in milliamps. Possible values are: 2, 4, 8, 12 (default: 4mA) -- `slew-rate`: If set to 0, slew rate is set to slow. If set to 1, it is set to fast. - - - - -## Driver/Bus Node - -Once pin control for a driver/bus has been defined, you'll need to adjust another node defining the driver/bus. This adjustment can be done in a number of places by convention: - -- If defining a unique board, `.dts` -- If defining boards with multiple revisions/versions that share pin control, `-common.dtsi` (which is then included by each `_.dtsi`) -- If [configuring boards for a shield](#boards-shields-and-modules), directly in the `.overlay` file - -You'll want to identify the correct node for you to be changing. The nRF52840 has nodes defined in `dts/arm/nordic/nrf52840.dtsi`, while the RP2040 has nodes defined in `dts/arm/rpi_pico/rp2040.dtsi`. Always be aware of and account for other devices on your node, there may be some which you did not add yourself. - -Adjust the node like so: - - - -```dts title=".dts" -&spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; -}; -``` - - -```dts title=".dts" -&spi0 { - pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; -}; -``` - - -This assigns the pins defined in the previous section's examples to the `spi0` node. - -Notice that the nRF52840 assigns two items. This is because nodes making use of pin control come with two states by default (though they can have more), a `default` state and a `sleep` state. The nRF52840 can put pins into a "low power state", to reduce power consumption while on sleep. If the RP2040 node made use of pullup or pulldown resistors which had a risk of power leakage while asleep, then it would also define an additional `pinctrl` child node and assign it like in the nRF52840 example. - -The nRF52840 example also changes the `compatible` assignment to use SPIM rather than SPI, since it is taking on the "main" role. Check the datasheet for more information about SPIM. The RP2040 makes no such distinction. - -### Alias - -You may wish to provide an alias to the node for various reasons: - -- Compatibility with other boards, if defining for a shield -- Compatibility with an interconnect -- Easier personal use - -Aliases are assigned like so: - -```dts - my_alias_spi: &spi0 {}; -``` - -### Usage - -Once you have defined your node, you make use of it by further adjusting the node. You will most likely need to enable the node, as most nodes come disabled: - -```dts -&spi0 { - status = "okay"; -}; -``` - -You would then want to make any adjustments to the node that are necessary, for example adjusting the clock speed. See the Zephyr API documentation for your `compatible` property to see the available properties for customisation. It is recommended to read through the [description of important properties](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#dt-important-props), potentially with the addition of [this blog post](https://interrupt.memfault.com/blog/practical_zephyr_dt#zephyrs-dts-skeleton-and-addressing) if `#address-cells` is confusing you. - -For SPI specifically, you would create a child node within your SPI bus for each device making use of the SPI bus. - -```dts -&spi0 { - cs-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>, <&gpio0 17 GPIO_ACTIVE_LOW>; - device1: device@0 { - compatible = "manufacturer,device"; - reg = <0>; - spi-max-frequency = <1000000>; /* conservatively set to 1MHz */ - }; - device2: device@1 { - compatible = "manufacturer,device"; - reg = <1>; - spi-max-frequency = <1000000>; /* conservatively set to 1MHz */ - }; -}; -``` - -Additional information on configuring specific devices for use with SPI buses or similar can be found in other pages of the ZMK documentation, or in the Zephyr documentation. - -### RP2040 PIO - -The [previous RP2040 example](#pinctrl-node) also configured pins for use with an RP2040 PIO block. To use PIO with SPI (or another purpose) you'll need to adjust the `pio0` or `pio1` nodes as follows: - -```dts title=".dts" -#include "-pinctrl.dtsi" - -&pio0 { - /* enables this PIO block */ - status = "okay"; - pio0_spi: pio0_spi { - /* Assign pinctrl to node */ - pinctrl-0 = <&pio0_spi_default>; - pinctrl-names = "default"; - compatible = "raspberrypi,pico-spi-pio"; - #address-cells = <1>; - #size-cells = <0>; - clocks = <&system_clk>; - clock-frequency = <4000000>; - /* These pins should be the same as in pinctrl */ - miso-gpios = <&gpio0 12 0>; - clk-gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>; - mosi-gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - - cs-gpios = <...>; // List of chip select gpios, one for each device - /* Nodes using the bus go here */ - }; -}; -``` - -Depending on the desired usage for PIO, you will want to adjust the `compatible` property and the SPI-specific properties (`miso-gpios`, `clk-gpios`, `mosi-gpios`). See the Zephyr API documentation for information about alternative PIO drivers. Once defined, SPI can be used via PIO as presented in the previous subsection, referring to `pio0_spi` (or similar) instead of `spi0`. - -### Additional examples - -Below are examples for UART and I2C, as the other two most common usages for pin control. - -#### UART nRF52840 - -In the pin control file: - -```dts -&pinctrl { - /* configuration for uart0 device, default state */ - uart0_default: uart0_default { - group1 { - /* configure P0.1 as UART_TX and P0.2 as UART_RTS */ - psels = , ; - }; - group2 { - /* configure P0.3 as UART_RX and P0.4 as UART_CTS */ - psels = , ; - /* both P0.3 and P0.4 are configured with pull-up */ - bias-pull-up; - }; - }; - - uart0_default: uart0_default { - group1 { - psels = , // EXT1 - ; // EXT2 - }; - }; - - uart0_sleep: uart0_sleep { - group1 { - /* configure P0.1 as UART_TX and P0.2 as UART_RTS */ - psels = , ; - low-power-enable; - }; - group2 { - /* configure P0.3 as UART_RX and P0.4 as UART_CTS */ - psels = , ; - /* both P0.3 and P0.4 are configured with pull-up */ - bias-pull-up; - low-power-enable; - }; - }; -}; -``` - -In the main file: - -```dts -#include "-pinctrl.dtsi" - -&uart0 { - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; -``` - -On designs using wired split on nRF52840, using asynchronous UART APIs with DMA will help ensure that the interrupts used to handle timing sensitive BT interactions can respond when needed. - -This can be accomplished by overwriding the `compatible` property to `"nordic,nrf-uarte"`, e.g.: - -```dts -&uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; -``` - -In addition to this `compatible` override, a setting needs to be tweaked to ensure that the UART isn't selected for interrupt mode when async is prefered. - -The following should be added to the board's/shield's `Kconfig.defconfig`: - -```dts -config UART_0_INTERRUPT_DRIVEN - depends on !ZMK_SPLIT_WIRED_UART_MODE_ASYNC -``` - -for the correct `UART_#` prefix matching the numbered UART being used. - -#### UART rp2040 - -In the pin control file: - -```dts -#include - -&pinctrl { - /* configuration for the usart0 "default" state */ - uart0_default: uart0_default { - group1 { - /* configure P0 as UART0 TX */ - pinmux = ; - }; - group2 { - /* configure P1 as UART0 RX */ - pinmux = ; - /* enable input on pin 1 */ - input-enable; - }; - }; -}; -``` - -In the main file: - -```dts -#include "-pinctrl.dtsi" - -&uart0 { - pinctrl-0 = <&uart0_default>; - pinctrl-names = "default"; -}; -``` - -#### UART RP2040 PIO - -In the pin control file: - -```dts -#include - -&pinctrl { - /* configuration for the uart0 "default" state */ - pio0_uart_default: pio0_uart_default { - /* tx pin, NAME IS NOT ARBITRARY */ - tx_pins { - /* configure P0 as UART0 TX */ - pinmux = ; - }; - /* rx pin, NAME IS NOT ARBITRARY */ - rx_pins { - /* configure P1 as UART0 RX */ - pinmux = ; - /* enable input on pin 1 */ - input-enable; - bias-pull-up; - }; - }; -}; -``` - -In the main file: - -```dts -#include "-pinctrl.dtsi" - -&pio0 { - status = "okay"; - - pio0_uart: serial { - status = "okay"; - compatible = "raspberrypi,pico-uart-pio"; - pinctrl-0 = <&pio0_uart_default>; - pinctrl-names = "default"; - current-speed = <115200>; - }; -}; -``` - -#### I2C nRF52840 - -Specifically for an I2C controller, aka Nordic TWIM. - -In the pin control file: - -```dts -&pinctrl { - /* configuration for i2c0 device, default state */ - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; - - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; -}; -``` - -In the main file: - -```dts -#include "-pinctrl.dtsi" - -&i2c0 { - compatible = "nordic,nrf-twim"; // I2C controller instead of generic - status = "okay"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; - clock-frequency = ; - - /* Nodes using the bus go here */ -}; -``` - -#### I2C RP2040 - -In the pin control file: - -```dts -#include - -&pinctrl { - /* configuration for the i2c0 "default" state */ - i2c0_default: i2c0_default { - group1 { - pinmux = , ; - input-enable; - input-schmitt-enable; - }; - }; -}; -``` - -In the main file: - -```dts -#include "-pinctrl.dtsi" - -&i2c0 { - status = "okay"; - pinctrl-0 = <&i2c0_default>; - pinctrl-names = "default"; - clock-frequency = ; - - /* Nodes using the bus go here */ -}; -``` - -#### I2C RP2040 PIO - -Zephyr currently does not have support for I2C using RP2040 PIO. diff --git a/docs/docs/hardware-integration/pointing.mdx b/docs/docs/hardware-integration/pointing.mdx deleted file mode 100644 index cad34272..00000000 --- a/docs/docs/hardware-integration/pointing.mdx +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: Pointing Devices -toc_max_heading_level: 2 ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -ZMK's pointing device support builds upon the Zephyr [input API](https://docs.zephyrproject.org/4.1.0/services/input/index.html) to offer pointing/mouse functionality with various hardware. -A limited number of input drivers are available in the Zephyr version currently used by ZMK, but additional drivers can be found in [external modules](../features/modules.mdx) for a variety of hardware. - -Pointing devices are also supported on split peripherals, with some additional configuration using the [input split device](../config/pointing.md#input-split). -The configuration details will thus vary depending on if you are adding a pointing device to a [split peripheral](../features/split-keyboards.md#central-and-peripheral-roles) as opposed to a unibody keyboard or split central part. - -export const SplitTabs = (props) => ( - - - {/* eslint-disable-next-line */} - {props.children} - - - -); - -## Input Device - -First, we must define the pointing device itself. The specifics of where this node goes will depend on the specific hardware. -_Most_ pointing hardware uses either SPI or I2C for communication, and will be nested under a properly configured bus node, e.g. `&pro_micro_i2c` or for a complete onboard setup, `&i2c3`. -See the documentation on [pin control](./pinctrl.mdx) if you need to configure the pins for an I2C or SPI bus. - -This node should always be set up in the `.overlay`/`.dts` file for the keyboard side that has the device attached to it. - - - - -For example, if setting up an [SPI device](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/dts/bindings/spi/spi-device.yaml), a node like following would be added to the `.overlay`/`.dts` file for the keyboard, like `.overlay`: - - - - -For example, if setting up an [SPI device](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/dts/bindings/spi/spi-device.yaml) on a central part, a node like following would be added to the `.overlay`/`.dts` file for the central part of the keyboard, like `.overlay`: - - - - -For example, if setting up an [SPI device](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/dts/bindings/spi/spi-device.yaml) on one of the peripheral parts, a node like following would be added to the `.overlay`/`.dts` file for that peripheral part, like `.overlay`: - - - - -```dts -&pro_micro_spi { - status = "okay"; - cs-gpios = <&pro_micro 19 GPIO_ACTIVE_LOW>; - - glidepoint: glidepoint@0 { - compatible = "cirque,pinnacle"; - reg = <0>; - spi-max-frequency = <1000000>; - status = "okay"; - dr-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH)>; - - sensitivity = "4x"; - sleep; - no-taps; - }; -}; -``` - -The specifics of the properties required to set for a given driver will vary; always consult the devicetree bindings file for the specific driver to see what properties can be set. - -## Listener and Input Split Device - -Every input device needs an associated listener added that listens for events from the device and processes them before sending the events to the host using a HID mouse report. -See [input listener configuration](../config/pointing.md#input-listener) for the full details. - -If your pointing device is on a split peripheral part, you also need to define and use an input split device on all keyboard parts. - - - - -To add a listener for the above device, add to your `.overlay`/`.dts` file for the keyboard a node like the following: - -```dts title=".overlay" -/ { - glidepoint_listener { - compatible = "zmk,input-listener"; - device = <&glidepoint>; - }; -}; -``` - - - - -### Shared Configuration - -The input listener that is used by the central side is added to the shared `.dtsi` file that is included into both central and peripheral `.overlay`/`.dts` files. - -The input listener is disabled by default, and will be enabled later in the central part's overlay. This is so that keymaps (which are included for both central and peripheral builds) can reference the listener to add input processors without failing with an undefined reference error. - -```dts title=".dtsi" -/ { - glidepoint_listener: glidepoint_listener { - compatible = "zmk,input-listener"; - status = "disabled"; - }; -}; -``` - -If users want to add [input processors](#input-processors) to the listener node, they will use the corresponding node reference (here it is `&glidepoint_listener`) in their keymaps. - -### Central Configuration - -In the central, we do the following: - -- Include the shared .dtsi file. -- Enable the input listener that is created in our shared file. -- Assign the pointing device node to the listener. - -```dts title=".overlay" -// Pull in the shared configuration -#include ".dtsi" - -// Node from the previous Input Device section -&pro_micro_spi { - /* ... */ - - glidepoint: glidepoint@0 { - /* ... */ - }; -}; - -// Overrides for the input listener node -&glidepoint_listener { - status = "okay"; - device = <&glidepoint>; -}; -``` - -### Peripheral Configuration - -Finally, we include the shared file in all peripherals so that the listener node reference is available like mentioned above: - -```dts title=".overlay" -#include ".dtsi" -``` - - - - -### Shared Configuration - -When a pointing device is on a peripheral, both peripheral and central make use of a `zmk,input-split` device, which functions differently depending on where it is used. -To avoid duplicating work, this node can be defined in the shared `.dtsi` file that is included into both central and peripheral `.overlay`/`.dts` files. - -All split pointers are identified using a unique integer value, which is specified using the `reg` property and in the `@#` suffix for the node. If adding multiple peripheral pointers, be sure that each is given a unique identifier. - -Second, the input listener that is used by the central side is added here but disabled by default. This is so that keymaps (which are included for both central and peripheral builds) can reference the listener to add input processors without failing with an undefined reference error. - -:::note - -Input splits need to be nested under a parent node that properly sets `#address-cells = <1>` and `#size-cells = <0>`. These settings are what allow us to use a single integer number for the `reg` value. - -::: - -```dts title=".dtsi" -/ { - split_inputs { - #address-cells = <1>; - #size-cells = <0>; - - glidepoint_split: glidepoint_split@0 { - compatible = "zmk,input-split"; - reg = <0>; - }; - }; - - glidepoint_listener: glidepoint_listener { - compatible = "zmk,input-listener"; - status = "disabled"; - device = <&glidepoint_split>; - }; -}; -``` - -If users want to add [input processors](#input-processors) to the listener node, they will use the corresponding node reference (here it is `&glidepoint_listener`) in their keymaps. - -### Peripheral Configuration - -In the peripheral .overlay/.dts file, we do the following: - -- Include the shared .dtsi file. -- Update the input split with a reference to the new device node that should be proxied. - -```dts title=".overlay" -// Pull in the shared configuration -#include ".dtsi" - -// Node from the previous Input Device section -&pro_micro_spi { - /* ... */ - - glidepoint: glidepoint@0 { - /* ... */ - }; -}; - -// Overrides for the input-split child node -&glidepoint_split { - device = <&glidepoint>; - - // Optional - input-processors = <&zip_xy_transform (INPUT_TRANSFORM_XY_SWAP | INPUT_TRANSFORM_X_INVERT | INPUT_TRANSFORM_Y_INVERT)>; -}; -``` - -The [`input-processors` property](#input-processors) on the input split is optional, and only necessary if the input needs to be fixed up before it is sent to the central. - -### Central Configuration - -On the central, the input split acts as an input device, receiving events from the peripheral and raising them locally. -Here we first include the shared file, and then enable the input listener that is created, but disabled, in our shared file: - -```dts title=".overlay" -#include ".dtsi" - -&glidepoint_listener { - status = "okay"; -}; -``` - - - - -## Input Processors - -Some physical pointing devices may be generating input events that need adjustment before being sent to hosts. -For example a trackpad might be integrated into a keyboard rotated 90° and need the X/Y data adjusted appropriately. -This can be accomplished with [input processors](../keymaps/input-processors/index.md). -As an example, you could enhance the listener defined in the previous section with an input processor that inverts and swaps the X/Y axes: - -```dts -#include - -/ { - glidepoint_listener { - compatible = "zmk,input-listener"; - device = <&glidepoint>; - input-processors = <&zip_xy_transform (INPUT_TRANSFORM_XY_SWAP | INPUT_TRANSFORM_X_INVERT | INPUT_TRANSFORM_Y_INVERT)>; - }; -}; -``` - -## Configuration Setting - -If your keyboard hardware includes a pointing device by default, you can enable the [`ZMK_POINTING` config](../config/pointing.md#general) in your keyboard definition. -You can do that in your [`Kconfig.defconfig` file](new-shield.mdx#kconfigdefconfig), where you can also enable the config for the communication protocol (e.g. [SPI](https://docs.zephyrproject.org/4.1.0/kconfig.html#CONFIG_SPI), [I2C](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/i2c.html#configuration-options)) used by the pointing device: - - - - -```kconfig title="Kconfig.defconfig" -if SHIELD_MY_KEYBOARD - -# Other keyboard settings - -config ZMK_POINTING - default y - -# Assuming pointing device uses SPI -config SPI - default y - -endif -``` - - - - -```kconfig title="Kconfig.defconfig" -if SHIELD_MY_KEYBOARD_ - -# Other settings - -config ZMK_POINTING - default y - -# Assuming pointing device uses SPI -config SPI - default y - -endif -``` - - - - -```kconfig title="Kconfig.defconfig" -if SHIELD_MY_KEYBOARD_ || SHIELD_MY_KEYBOARD_ - -# Other keyboard settings - -config ZMK_POINTING - default y - -endif - -if SHIELD_MY_KEYBOARD_ - -# Assuming pointing device uses SPI -config SPI - default y - -endif -``` - - - - -If the hardware is optional, users should set `CONFIG_ZMK_POINTING=y` manually in their [user configuration file](new-shield.mdx#user-configuration-files), along with the config for the protocol. diff --git a/docs/docs/hardware-integration/shift-registers.md b/docs/docs/hardware-integration/shift-registers.md deleted file mode 100644 index 4a5f02a9..00000000 --- a/docs/docs/hardware-integration/shift-registers.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Configuring Shift Registers -sidebar_label: Shift Registers ---- - -Shift registers are the recommended method of adding additional GPIO pins to MCUs and boards, when a standard matrix results in an insufficient number of keys. They are recommended because they simultaneously have very low power consumption and are quite cheap. This page serves as a (brief) introduction to shift registers, how to use them in your design, and how to configure ZMK to use them correctly. - -:::note -This page assumes that you are using a SIPO shift register with the part number 74HC595. Other shift registers can work as well but this is the most commonly used one. -::: - -To understand how shift registers work, we recommend reading through ["How does the 74HC595 Shift Register work?"](https://lastminuteengineers.com/74hc595-shift-register-arduino-tutorial/#how-does-the-74hc595-shift-register-work). - -## Design Guidelines - -The shift register output pins should act as MCU outputs in your design. All MCU inputs should remain connected directly to MCU/board pins. This is to allow the inputs to trigger "interrupts" on the MCU/board, upon which it will begin scanning the keys. Using a shift register for MCU inputs is also possible, but requires you to use a PISO shift register and will harm your battery life. Note that a [direct kscan](../config/kscan.md#direct-gpio-driver) keyboard does not have any MCU output pins, but a diodeless keyboard is still possible by making use of a single row pin and using the [matrix kscan](../config/kscan.md#matrix-driver) driver. - -:::info -In a diode matrix, MCU output pins are those connected to the [anodes of your diodes](https://learn.sparkfun.com/tutorials/diodes/all#ideal-diodes). You most likely will need to rearrange your matrix to maximize the use of shift register output pins, in order to reduce the total number of GPIO pins connected to your MCU. For example, a 9 column 5 row `col2row` matrix could be rearranged to use 16 columns and 3 rows. -::: - -You will want to make sure that the data and clock pins of the shift register are connected to high frequency/SPI-capable pins on your MCU. Make sure that these lie on the same SPI bus for your microcontroller, if applicable -- for instance RP2040 controllers require this, while nRF52840 ones do not. It is generally recommended that you use the pre-defined pins for SPI, if your board comes with them. - -ZMK allows you to daisy-chain up to four shift registers. Below is a fragment of a schematic showing two shift registers that are daisy-chained. - -![A fragment of a schematic featuring two shift registers daisy chained together.](../assets/hardware-integration/shift-register-daisy.png) - -## Configuration - -In ZMK, the SPI bus of your MCU is used to communicate with shift registers, using MOSI for SIPO shift registers and MISO for PISO shift registers. See [Pin Control](./pinctrl.mdx) for information on configuring the SPI bus. Shift registers can share the SPI bus with other devices with no issues. - -Some boards, such as Seeed Studio's Xiao series, already has particular pins defined and configured for SPI (these can be changed if the MCU allows for alternative selections of SPI pins). Others, such as the nice!nano or any custom board, will need to be configured by you manually. - -### Enable SPI - -Add the following line to `.defconfig`, inside of your device's `if` block: - -```kconfig title=".defconfig" -config SPI - default y -``` - -### Shift Register SPI Device - -To add your shift register as a SPI device, you'll need to overwrite your board's SPI configuration. For example, if your SPI bus has the node label `xiao_spi`, then you would add the following to your `.overlay`: - -```dts title=".overlay" -&xiao_spi { - status = "okay"; - cs-gpios = <&xiao_d 9 GPIO_ACTIVE_LOW>; - shifter: 595@0 { - compatible = "zmk,gpio-595"; - status = "okay"; - gpio-controller; - spi-max-frequency = <200000>; - reg = <0>; - #gpio-cells = <2>; - ngpios = <8>; - }; -}; -``` - -If there is more than one device on the SPI bus, you will need to add additional pins to the `cs-gpios` phandle array - one for each device. The `@0` number marks the index of the `cs-gpios` pin used to control a device. If you have daisy chained multiple shift registers, you'll also want to increase the number of GPIOs that the shift register provides by editing the `ngpios` node - set this to your number of output pins (should be one of 8, 16, 24, 32). You may also need to increase `spi-max-frequency` to a higher value if you have daisy chained shift registers, otherwise quick key presses may on occasion not trigger. - -### Using Shift Register Pins In Kscan - -Once all of this is set up, you can refer to pins from the shift register using `&shifter X` where X is the pin number. Use this to define your kscan, for example: - -```dts title=".overlay" -kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; - col-gpios - = <&shifter 7 GPIO_ACTIVE_HIGH> - , <&shifter 6 GPIO_ACTIVE_HIGH> - , <&shifter 5 GPIO_ACTIVE_HIGH> - , <&shifter 4 GPIO_ACTIVE_HIGH> - , <&shifter 3 GPIO_ACTIVE_HIGH> - , <&shifter 2 GPIO_ACTIVE_HIGH> - ; -}; -``` diff --git a/docs/docs/hardware-integration/soft-off-setup.mdx b/docs/docs/hardware-integration/soft-off-setup.mdx deleted file mode 100644 index 8ca1cbd6..00000000 --- a/docs/docs/hardware-integration/soft-off-setup.mdx +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: Adding Soft Off To A Keyboard -sidebar_label: Soft Off Setup -toc_max_heading_level: 2 ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -import SoftOffBehavior from "./includes/_soft-off-behavior.md"; -import SoftOffWaker from "./includes/_soft-off-waker.md"; -import GpioKeyDirect from "./includes/_gpio-key-direct.md"; -import GpioKeyMatrix from "./includes/_gpio-key-matrix.md"; -import GpioKeyWakeup from "./includes/_gpio-key-wakeup.md"; -import SidebandDirect from "./includes/_sideband-direct.md"; -import SidebandMatrix from "./includes/_sideband-matrix.md"; -import SidebandWakeupDirect from "./includes/_sideband-wakeup-direct.md"; - -Advanced methods of adding [soft off](../features/low-power-states.md#soft-off) to a keyboard are detailed below. The first two tabs describe methods involving hardware changes, while the last describes the firmware changes necessary to define a single specific key switch for waking up. - - - - - - The exact method of reusing a key switch to wake from the soft off state - differs depending on whether said key switch is part of a direct GPIO kscan - or part of a matrix kscan. - - - - - - - -## Hardware Changes - - - - - Add a direct push button between a GPIO pin and ground. This button will act as an on/off switch. - - Alternatively, if you wish to integrate a dedicated GPIO pin into a key switch combination using a direct kscan, tie all of the MCU pins that you wish to combine to the dedicated GPIO pin through an OR gate. All firmware changes then follow identically to the direct push button. - - - - To integrate the dedicated GPIO pin into your matrix, you will need to tie multiple switch outputs in the matrix together through AND gates and connect the result to the dedicated GPIO pin. This way you can use a (hardware defined) key combination in your existing keyboard matrix to trigger soft on/off. - - Ideally the switches used should be driven by the same matrix output pin so that both will be active simultaneously on the AND gate inputs. The alternative is to connect the switch to two MOSFETs that trigger both the regular matrix connect and the connect to the AND gate to ensure both pins are active/high at the same time even if scanning sets them high at different times. - - - - No hardware changes are necessary for this approach. - - - -## Firmware Changes - -Several items work together to make both triggering soft off properly, and setting up the device to _wake_ from soft off work as expected. - - - - - - - - - - -### Soft off behavior - -For this approach, you will need to make sure that the [soft off behavior](../keymaps/behaviors/soft-off.md) is present in your keymap, to trigger soft off. - - - - -### GPIO key - -Zephyr's basic [GPIO Key](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/input/gpio-keys.html) concept is used to configure the soft off GPIO pin. -{/* secrettabs hides this tab selector. GPIO key changes its "orientation" between simple pin and matrix integrated. */} - - - - - - - - - - - - - -GPIO keys are defined using child nodes under the `gpio-keys` compatible node. Each child needs just one property defined: - -- The `gpios` property should be a [phandle-array](https://docs.zephyrproject.org/4.1.0/build/dts/phandles.html#zero-or-more-nodes-with-metadata-phandle-array-type) with a fully defined GPIO pin and with the correct pull up/down and active high/low flags set. - - - - - - - - - - - - - - - - - - - - - - You also need to update the `zmk,kscan` chosen value to point to the new kscan instance: - -```dts -/ { - chosen { - ... - zmk,kscan = &side_band_behavior_triggers; - ... - }; -}; -``` - - - - - - - - - - - - -Finally, we will list the `wakeup_scan` device in an additional configuration section so that the ZMK soft off process knows it needs to enable this device as part of the soft off processing so it can wake the keyboard from soft off when pressed: - -```dts -/ { - soft_off_wakers { - compatible = "zmk,soft-off-wakeup-sources"; - wakeup-sources = <&wakeup_scan>; - }; -}; -``` - -Here are the properties for the node: - -- The `compatible` property for the node must be `zmk,soft-off-wakeup-sources`. -- The `wakeup-sources` property is a [phandle array](../development/devicetree.md#property-types) pointing to all the devices that should be enabled during the shutdown process to be sure they can later wake the keyboard. - -:::tip -If you add your kscan to the `wakeup-sources` array, then your keyboard will wake upon pressing any key in your kscan. Essentially, this causes `&soft_off` to behave like a behavior that puts the keyboard in deep sleep. If you choose to do so, then you can omit everything aside from the `soft_off_wakers` node. -::: diff --git a/docs/docs/hardware.mdx b/docs/docs/hardware.mdx index 770ef2eb..6f377073 100644 --- a/docs/docs/hardware.mdx +++ b/docs/docs/hardware.mdx @@ -11,6 +11,11 @@ import Heading from "@theme/Heading"; import { groupedMetadata } from "@site/src/components/hardware-utils"; export const toc = [ + { + value: "Onboard Controller Keyboards", + id: "onboard", + level: 2, + }, { value: "Composite Keyboards", id: "composite", @@ -23,44 +28,38 @@ export const toc = [ id: interconnect.id, level: 3, })), - { - value: "Onboard Controller Keyboards", - id: "onboard", - level: 2, - }, { value: "Other Hardware", id: "other-hardware", level: 2, }, + { + value: "Contributing", + id: "contributing", + level: 2, + }, ]; -With the solid technical foundation of Zephyr™ RTOS, ZMK can support a wide variety of hardware targets, -including but not limited to Nordic nRF52, Raspberry Pi RP2040/RP2350, most ST STM32 MCUs, and Microchip SAMD21. -ZMK has the potential to run on any hardware supported by Zephyr™, such as those on -the [Zephyr™ supported boards](https://docs.zephyrproject.org/4.1.0/boards/index.html) page, though you may need to do some additional work to configure them for ZMK. -That being said, there are specific boards that have been tested and pre-configured by the ZMK contributors, denoted by the `zmk` board variants below. - -Designing a new keyboard? Check out the [Hardware Integration](hardware-integration/index.mdx) section -for more information on how to configure ZMK to run on your custom hardware. - -:::info[Boards, Board Variants, and Shields] - -ZMK uses the Zephyr concepts of "boards" and "shields" to refer to different parts of a keyboard build that are then combined during a firmware build. -Please see the [explainer on boards & shields](hardware-integration/index.mdx#boards--shields) for more details. - -Zephyr boards come with minimal configuration. ZMK board variants add the necessary configuration to make the board usable out of the box with ZMK. - -::: +With the solid technical foundation of Zephyr™ RTOS, ZMK can support a wide diversity of hardware targets. +That being said, there are currently only a few specific [boards](/docs/faq#what-is-a-board)/[shields](faq.md#what-is-a-shield) that have been implemented and tested by the ZMK contributors. -{/* prettier-ignore */} -Other Hardware + + Other Hardware + -In addition to the basic keyboard functionality, there is also support for additional keyboard hardware such as encoders, RGB underglow, backlight and displays. -Please see pages under the "Features" header in the sidebar for details. +In addition to the basic keyboard functionality, there is some initial support for additional keyboard hardware: -ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only -supports 32-bit and 64-bit platforms. As a result, controllers like the SparkFun Pro Micro, Elite-C, -and Arduino Uno Rev3 are **NOT** supported by ZMK. +- Encoders +- Displays +- RGB Underglow +- Backlight + +Until detailed documentation is available, feel free to ask questions about how these are supported in the [Discord server](https://zmk.dev/community/discord/invite). + + + Contributing + + +If you'd like to add support for a new keyboard shield, head over to the [New Keyboard Shield](development/new-shield.md) documentation. diff --git a/docs/docs/intro.md b/docs/docs/intro.md new file mode 100644 index 00000000..d65ac46e --- /dev/null +++ b/docs/docs/intro.md @@ -0,0 +1,53 @@ +--- +title: Introduction to ZMK +sidebar_label: Introduction +slug: / +--- + +ZMK Firmware is an open source (MIT) keyboard +firmware built on the [Zephyr™ Project](https://zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues. + +## Features + +ZMK is currently missing some features found in other popular firmware. This table compares the features supported by ZMK, BlueMicro and QMK: + +| Legend: | ✅ Supported | 🚧 Under Development | 💡 Planned | +| :------ | :----------- | :------------------- | :--------- | + +| **Feature** | ZMK | BlueMicro | QMK | +| ---------------------------------------------------------------------------------------------------------------------------------- | :-: | :-------: | :-: | +| Low Latency BLE Support | ✅ | ✅ | | +| Multi-Device BLE Support | ✅ | | | +| [USB Connectivity](behaviors/outputs.md) | ✅ | ✅ | ✅ | +| User Configuration Repositories | ✅ | | | +| Split Keyboard Support | ✅ | ✅ | ✅ | +| [Keymaps and Layers](behaviors/layers.md) | ✅ | ✅ | ✅ | +| [Hold-Tap](behaviors/hold-tap.md) (which includes [Mod-Tap](behaviors/mod-tap.md) and [Layer-Tap](behaviors/layers.md/#layer-tap)) | ✅ | ✅ | ✅ | +| [Tap-Dance](behaviors/tap-dance.md) | ✅ | ✅[^2] | ✅ | +| [Keyboard Codes](codes/index.mdx#keyboard) | ✅ | ✅ | ✅ | +| [Media](codes/index.mdx#media-controls) & [Consumer](codes/index.mdx#consumer-controls) Codes | ✅ | ✅ | ✅ | +| [Encoders](features/encoders.md) | ✅ | ✅ | ✅ | +| [Display Support](features/displays.md)[^1] | 🚧 | 🚧 | ✅ | +| [RGB Underglow](features/underglow.md) | ✅ | ✅ | ✅ | +| [Backlight](features/backlight.md) | ✅ | ✅ | ✅ | +| One Shot Keys | ✅ | ✅ | ✅ | +| [Combo Keys](features/combos.md) | ✅ | | ✅ | +| [Macros](behaviors/macros.md) | ✅ | ✅ | ✅ | +| Mouse Keys | 🚧 | ✅ | ✅ | +| Low Active Power Usage | ✅ | | | +| Low Power Sleep States | ✅ | ✅ | | +| [Low Power Mode (VCC Shutoff)](behaviors/power.md) | ✅ | ✅ | | +| Battery Reporting | ✅ | ✅ | | +| Shell over BLE | 💡 | | | +| Realtime Keymap Updating | 💡 | | ✅ | +| AVR/8 Bit | | | ✅ | +| [Wide Range of ARM Chips Supported](https://docs.zephyrproject.org/latest/boards/index.html) | ✅ | | | + +[^2]: Tap-Dances are limited to single and double-tap on BlueMicro +[^1]: OLEDs are currently proof of concept in ZMK. + +## Code Of Conduct + +Please note that this project is released with a +[Contributor Code of Conduct](https://www.contributor-covenant.org/version/2/0/code_of_conduct/). +By participating in this project you agree to abide by its terms. diff --git a/docs/docs/intro.mdx b/docs/docs/intro.mdx deleted file mode 100644 index f73e5b69..00000000 --- a/docs/docs/intro.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Introduction to ZMK -sidebar_label: Introduction -slug: / ---- - -import { Columns, Column } from "@site/src/components/columns"; - -ZMK Firmware is an open source (MIT) keyboard firmware built on the [Zephyr™ Project](https://zephyrproject.org/) Real Time Operating System (RTOS). -ZMK's goal is to provide a modern and powerful firmware that is designed for power-efficiency, flexibility, and broad hardware support. -ZMK is capable of being used for both wired and wireless input devices. - -## Features - -Below table lists major features/capabilities currently supported in ZMK, as well as ones that are currently under development and not planned. - - - - -| Legend: | ✅ Supported | 🚧 Under Development | ❌ Not Planned | -| :------ | :----------- | :------------------- | -------------- | - - - - - - - -| Hardware | Support | -| ------------------------------------------------------------------------------------------------------------- | :-----: | -| [Wireless Split Keyboards](features/split-keyboards.md) | ✅ | -| Wired Split Keyboards | 🚧 | -| [Low Active Power Usage](/power-profiler) | ✅ | -| [Encoders](features/encoders.md) | ✅ | -| [LED-based Lighting](features/lighting.md) | ✅ | -| [Displays](features/displays.md) | 🚧 | -| [Pointing Devices](features/pointing.md) | ✅ | -| Multitouch Touchpads (PTP) | 🚧 | -| [Low Power Sleep States](features/low-power-states.md) | ✅ | -| [Low Power Mode (VCC Shutoff) for Peripherals](keymaps/behaviors/power.md) | ✅ | -| Improved Power Handling for Multiple Peripherals | 🚧 | -| [Battery Level Reporting](features/battery.md) | ✅ | -| [Support for a Wide Range of 32-bit Microcontrollers](https://docs.zephyrproject.org/4.1.0/boards/index.html) | ✅ | -| Support for AVR/8-bit Chips | ❌ | - - - - -| Connectivity | Support | -| --------------------------------------------------------------- | :-----: | -| Low-Latency BLE Support | ✅ | -| [Multi-Device BLE Connectivity](features/bluetooth.md#profiles) | ✅ | -| [USB Connectivity](keymaps/behaviors/outputs.md) | ✅ | - -| Keymap Features | Support | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-----: | -| [User Configuration Repositories](user-setup.mdx) | ✅ | -| [Keymaps and Layers](keymaps/index.mdx) | ✅ | -| [Wide Range of Keycodes](keymaps/list-of-keycodes.mdx) | ✅ | -| [Flexible Behavior System](keymaps/behaviors/index.mdx) | ✅ | -| [Hold-Taps](keymaps/behaviors/hold-tap.mdx) (including [Mod-Tap](keymaps/behaviors/hold-tap.mdx#mod-tap) and [Layer-Tap](keymaps/behaviors/hold-tap.mdx#layer-tap)) | ✅ | -| [Tap-Dances](keymaps/behaviors/tap-dance.mdx) | ✅ | -| [Sticky (One Shot) Keys](keymaps/behaviors/sticky-key.md) | ✅ | -| [Combos](keymaps/combos.md) | ✅ | -| [Macros](keymaps/behaviors/macros.md) | ✅ | -| [Mouse Keys](keymaps/behaviors/mouse-emulation.md) | ✅ | -| [Realtime Keymap Updating](features/studio.md) | 🚧 | - - - - -## Code of Conduct - -Please note that this project is released with a [Contributor Code of Conduct](https://www.contributor-covenant.org/version/2/0/code_of_conduct/). -By participating in this project you agree to abide by its terms. diff --git a/docs/docs/keymap-example-file.md b/docs/docs/keymap-example-file.md new file mode 100644 index 00000000..91213f15 --- /dev/null +++ b/docs/docs/keymap-example-file.md @@ -0,0 +1,26 @@ +```dts +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | +// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | +// | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; +}; +``` diff --git a/docs/docs/keymap-example.md b/docs/docs/keymap-example.md index 1b5bdae5..e526d542 100644 --- a/docs/docs/keymap-example.md +++ b/docs/docs/keymap-example.md @@ -2,35 +2,20 @@ keymap { compatible = "zmk,keymap"; - default_layer { // Layer 0 - display-name = "Base"; -// ---------------------------------------------- -// | Z | M | K | -// | &mo 1 | LEFT SHIFT | &mo 2 | + default_layer { +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | +// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | +// | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | bindings = < - &kp Z &kp M &kp K - &mo 1 &kp LSHIFT &mo 2 - >; - }; - abc { // Layer 1 - display-name = "ABC"; -// ---------------------------------------------- -// | A | B | C | -// | &trans | &trans | &trans | - bindings = < - &kp A &kp B &kp C - &trans &trans &trans - >; - }; - xyz { // Layer 2 - display-name = "XYZ"; -// ---------------------------------------------- -// | X | Y | Z | -// | LEFT CTRL | LEFT ALT | &trans | - bindings = < - &kp X &kp Y &kp Z - &kp LCTRL &kp LALT &trans + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; }; ``` diff --git a/docs/docs/keymaps/_footnotes/macos-editing.mdx b/docs/docs/keymaps/_footnotes/macos-editing.mdx deleted file mode 100644 index 76c67d7f..00000000 --- a/docs/docs/keymaps/_footnotes/macos-editing.mdx +++ /dev/null @@ -1,2 +0,0 @@ -On macOS, `K_CUT`, `K_COPY`, and `K_PASTE` are recognized as key presses, -but do nothing by default. diff --git a/docs/docs/keymaps/_footnotes/macos-international.mdx b/docs/docs/keymaps/_footnotes/macos-international.mdx deleted file mode 100644 index b0cd7c85..00000000 --- a/docs/docs/keymaps/_footnotes/macos-international.mdx +++ /dev/null @@ -1 +0,0 @@ -On macOS in Japanese mode, `INTERNATIONAL1` is ろ (ro, bottom right on the Apple Japanese keyboard) and `INTERNATIONAL3` is ¥ (yen, top right). diff --git a/docs/docs/keymaps/_footnotes/macos-language.mdx b/docs/docs/keymaps/_footnotes/macos-language.mdx deleted file mode 100644 index 2d7822e3..00000000 --- a/docs/docs/keymaps/_footnotes/macos-language.mdx +++ /dev/null @@ -1 +0,0 @@ -On macOS in Japanese mode, `LANG1` is かな (kana, to turn on Japanese IME) and `LANG2` is 英数 (eisuu, to turn off the IME). diff --git a/docs/docs/keymaps/_footnotes/macos-undo-redo.mdx b/docs/docs/keymaps/_footnotes/macos-undo-redo.mdx deleted file mode 100644 index 0e2c1538..00000000 --- a/docs/docs/keymaps/_footnotes/macos-undo-redo.mdx +++ /dev/null @@ -1,2 +0,0 @@ -On macOS, `K_UNDO` and `K_REDO` are recognized as key presses, -but do nothing by default. diff --git a/docs/docs/keymaps/behaviors/hold-tap.mdx b/docs/docs/keymaps/behaviors/hold-tap.mdx deleted file mode 100644 index c4d27d9d..00000000 --- a/docs/docs/keymaps/behaviors/hold-tap.mdx +++ /dev/null @@ -1,468 +0,0 @@ ---- -title: Hold-Tap Behavior -sidebar_label: Hold-Tap ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -## Summary - -A hold-tap behavior is defined using a "hold" behavior and a "tap" behavior. -When the key is held, then it will output the hold behavior, and when it is tapped it will output the tap behavior. - -Various configuration options exist to allow fine-tuning of whether a particular key press will resolve in a hold or in a tap. -Such configuration options determine how to treat "interrupts" when one key is pressed while a hold-tap has not been released yet, or how long a key should be held before being treated as a hold instead of a tap, and so on. - -ZMK predefines two hold-tap behaviors: [mod-tap](#mod-tap) and [layer-tap](#layer-tap). - -## Mod-Tap - -The "mod-tap" behavior sends a different [key press](key-press.md), depending on whether it's held or tapped. - -- If you hold the key for longer than 200ms or press any other key while it is held, the first keycode ("mod") is sent. -- If you tap the key (release before 200ms), the second keycode ("tap") is sent. - -![Simple behavior](../../assets/hold-tap/case1_2.svg) - -By default, mod-tap is configured with the ["hold-preferred" `flavor`](#interrupt-flavors). - -### Behavior Binding - -- Reference: `&mt` -- Parameter #1: The keycode to be sent when held (usually a modifier), e.g. `LSHIFT` -- Parameter #2: The keycode to sent when used as a tap, e.g. `A`, `B`. - -Example: - -```dts -&mt LSHIFT A -``` - -### Configuration - -You can adjust the default [properties](#custom-hold-tap-configuration) of the mod-tap behavior using its node like so: - -```dts -&mt { - tapping-term-ms = <200>; // This is the value already set by default -}; -``` - -Note that you can also [define a custom hold-tap](#custom-hold-tap-examples) and use that, instead of adjusting the properties of the mod-tap/`&mt` behavior. - -## Layer-Tap - -The "layer-tap" behavior works similarly to the mod-tap behavior, but instead of outputting one of two keys, it activates a specified layer as its "hold" action. - -By default, layer-tap is configured with the ["tap-preferred" `flavor`](#interrupt-flavors). - -### Behavior Binding - -- Reference: `<` -- Parameter: The layer number to enable while held, e.g. `1` -- Parameter: The keycode to send when tapped, e.g. `A` - -Example: - -```dts -< 1 A -``` - -### Configuration - -You can adjust the default [properties](#custom-hold-tap-configuration) of the layer-tap behavior using its node like so: - -```dts -< { - tapping-term-ms = <200>; // This is the value already set by default -}; -``` - -Note that you can also [define a custom hold-tap](#custom-hold-tap-examples) and use that, instead of adjusting the properties of the layer-tap/`<` behavior. - -## Custom Hold-Tap Examples - -To see what specific configuration options do, please see the [configuration options](#custom-hold-tap-configuration). -The below examples are intended for you to copy-paste as desired, and then tune with the configuration options. - - - - - -The default configuration of mod-tap and layer-tap can be found below: - -```dts title="Mod-tap" -#include - -/ { - behaviors { - mt: mod_tap { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <200>; - bindings = <&kp>, <&kp>; - display-name = "Mod-Tap"; - }; - }; -}; - -``` - -```dts title="Layer-tap" -#include - -/ { - behaviors { - lt: layer_tap { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - bindings = <&mo>, <&kp>; - display-name = "Layer-Tap"; - }; - }; -}; - -``` - -If you copy-paste these as-is, you will overwrite the predefined behaviors. -Name and label them something else, e.g. `my_mt: my_mod_tap`, to avoid this. -You'll then be able to use your new behavior with `&my_mt`. - - - - -The most popular form of home-row mods is known as "timeless home-row mods", configured to minimize the dependency on timing. -Timeless home-row mods define both a "left hand" and a "right hand" behavior. - -Below is an example of configuration to achieve this: - -```dts -/ { - behaviors { - hml: home_row_mod_left { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "balanced"; - require-prior-idle-ms = <150>; - tapping-term-ms = <280>; - quick-tap-ms = <175>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = < ... >; // List of keys on the right side of the keyboard - hold-trigger-on-release; - }; - hmr: home_row_mod_right { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "balanced"; - require-prior-idle-ms = <150>; - tapping-term-ms = <280>; - quick-tap-ms = <175>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = < ... >; // List of keys on the left side of the keyboard - hold-trigger-on-release; - }; - }; -}; -``` - -If you wish to use this configuration of home-row mods, you will need to define the corresponding left and right behaviors as above, then use `&hml` for home-row keys on the left side of the keyboard, and `&hmr` for ones on the right side. - -Below is a brief overview of the options set. - -- The ["balanced" flavor](#interrupt-flavors) produces a "hold" if another key is both pressed and released within the tapping-term. - This interrupt flavor is primarily used to decide between hold and tap, rather than using [tapping-term-ms](#tapping-term-ms). - This matches how modifiers are used a majority of the time (hold shift, tap a key, release shift). -- [`require-prior-idle-ms`](#require-prior-idle-ms) is set to 125ms to resolve to taps immediately when typing at speed, which helps eliminate typing delay. -- [Positional hold taps](#positional-hold-tap-and-hold-trigger-key-positions) with [`hold-trigger-on-release`](#hold-trigger-on-release) are used to avoid accidental hold resolutions when typing sequences of letters all with the same hand. -- [`tapping-term-ms`](#tapping-term-ms) is set to a higher value of 280ms, but not unreasonably high, so that same hand modifiers can still be used with intention. -- [`quick-tap-ms`](#quick-tap-ms) is set to 175ms, for the event where a tapped key may wish to be held down. - -Depending on your typing behavior, you may wish to adjust this configuration. For example, you can adjust the specific timings used, or define another set of hold-taps for more dextrous fingers like the index with different parameters. You may even want to switch the flavor to `tap-preferred` or `tap-unless-interrupted`. - - - - - -A popular method of implementing Autoshift in ZMK involves a C-preprocessor macro, commonly defined as `AS(keycode)`. This macro applies the `LSHIFT` modifier to the specified `keycode` when `AS(keycode)` is held, and simply performs a [keypress](key-press.md), `&kp keycode`, when the `AS(keycode)` binding is tapped. This simplifies the use of Autoshift in a keymap, as the complete hold-tap bindings for each desired Autoshift key, as in `&as LS() &as LS() ... &as LS() `, can be quite cumbersome to use when applied to a large portion of the keymap. - -```dts title="Hold-Tap Example: Autoshift" -#include -#include - -#define AS(keycode) &as LS(keycode) keycode // Autoshift Macro - -/ { - behaviors { - as: auto_shift { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - tapping-term-ms = <135>; - quick-tap-ms = <0>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys - >; - }; - }; -}; -``` - - - - - -This hold-tap example implements a [momentary-layer](layers.md#momentary-layer) when the keybind is held and a [toggle-layer](layers.md#toggle-layer) when it is tapped. Similar to the Autoshift and Sticky Hold use-cases, a `MO_TOG(layer)` macro is defined such that the `&mo` and `&tog` behaviors can target a single layer. - -```dts title="Hold-Tap Example: Momentary layer on Hold, Toggle layer on Tap" -#include -#include - -#define MO_TOG(layer) &mo_tog layer layer // Macro to apply momentary-layer-on-hold/toggle-layer-on-tap to a specific layer - -/ { - behaviors { - mo_tog: behavior_mo_tog { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <200>; - bindings = <&mo>, <&tog>; - }; - }; - - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap - MO_TOG(3) // &mo 3 on hold, &tog 3 on tap - >; - }; - }; -}; -``` - - - - - -## Custom Hold-Tap Configuration - -### `tapping-term-ms` - -This value defines how long a key must be pressed to trigger the "hold" behavior, alongside other factors described in [interrupt flavors](#interrupt-flavors). The default is 200ms. - -```dts -&mt { - tapping-term-ms = <140>; -}; -``` - -### Using different behavior types with hold-taps - -You can create instances of hold-taps invoking most [behavior types](../index.mdx#behaviors) for hold or tap actions, by referencing their node labels in the `bindings` value. -The two parameters that are passed to the hold-tap in your keymap will be forwarded to the referred behaviors, first one to the hold behavior and second one to the tap. - -If you use behaviors that accept no parameters such as [mod-morphs](mod-morph.md) or [tap-dances](tap-dance.mdx), you can pass a dummy parameter value such as `0` to the hold-tap when you use it in your keymap. -For instance, a hold-tap with node label `caps` and `bindings = <&kp>, <&caps_word>;` can be used in the keymap as below to send the caps lock keycode on hold and invoke the [caps word behavior](caps-word.md) on tap: - -```dts -&caps CAPS 0 -``` - -:::info -You cannot use behaviors that expect more than one parameter such as [`&bt`](bluetooth.md) and [`&rgb_ug`](underglow.md) with hold-taps, due to the limitations of the [devicetree keymap format](../../config/index.md#devicetree-files). -One workaround is to create a [macro](macros.md) that invokes those behaviors and use the macro as the hold or tap action. -::: - -### Interrupt Flavors - -By default, when another key is pressed while a hold-tap is held, it will trigger the "hold" behavior even if `tapping-term-ms` has not been exceeded yet. -We refer to the interaction of pressing one key while another is held as the "interrupt", and the way the hold-tap resolves is referred to as its "interrupt flavor". - -This default interrupt flavor is called "hold-preferred". While this flavor may work well for a ctrl/escape key, it might not be well suited for home-row mods or layer-taps. For this reason, ZMK defines multiple interrupt flavors which hold-tap behaviors can be configured with, listed below: - -- The "hold-preferred" flavor triggers the hold behavior when the `tapping-term-ms` has expired or another key is pressed. -- The "balanced" flavor will trigger the hold behavior when the `tapping-term-ms` has expired or another key is pressed _and_ released while the hold-tap is held. -- The "tap-preferred" flavor triggers the hold behavior when the `tapping-term-ms` has expired. Pressing another key within `tapping-term-ms` does not affect the decision. -- The "tap-unless-interrupted" flavor triggers a hold behavior only when another key is pressed before `tapping-term-ms` has expired. It triggers the tap behavior in all other situations. Note that this flavor _inverts_ the decision logic with respect to the tapping term. - -When the hold-tap key is released and the hold behavior has not been triggered, the tap behavior will trigger. - -![Hold-tap comparison](../../assets/hold-tap/comparison.svg) - -#### Comparison to QMK - -The `hold-preferred` flavor works similarly to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. -The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default. - -```dts -&mt { - flavor = "balanced"; -}; -``` - -### `quick-tap-ms` - -If you press a tapped hold-tap again within `quick-tap-ms` milliseconds of the first press, it will always trigger the tap behavior. -This is useful for keys like backspace, where a quick tap-then-hold can be used to hold it down to delete long parts of text. -By default this behavior is disabled. - -```dts -&mt { - quick-tap-ms = <150>; -}; -``` - -#### Comparison to QMK - -QMK has a parameter called `QUICK_TAP_TERM`, but its semantics are slightly different. In QMK, it is the time interval between releasing the first key and pressing the second key whereas in ZMK, it is the time interval between pressing the first and second keys. Therefore you might want to use a larger value for `quick-tap-ms` compared to the value used in QMK. - -### `require-prior-idle-ms` - -If a hold-tap is pressed within `require-prior-idle-ms` of another non-modifier _key_ (not behavior), then the hold-tap will always resolve in a tap. -This effectively disables the hold-tap when typing quickly, which can be quite useful for home-row mods. -It can also have the effect of removing the input delay when typing quickly, since the hold-tap immediately resolves to a tap on key press. - -
- The following hold-tap configuration enables `require-prior-idle-ms` with a 125 millisecond term, alongside `quick-tap-ms` with a 200 millisecond term. -```dts -rpi: require_prior_idle { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <200>; - require-prior-idle-ms = <125>; - bindings = <&kp>, <&kp>; -}; -``` - -If you press `&kp A` and then `&rpi LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. -Importantly, `b` will be output immediately since it was within the `require-prior-idle-ms`, without waiting for a timeout or an interrupting key. -In other words, the `&rpi LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** the previous key press; otherwise it will act like `&kp B`. - -Note that the greater the value of `require-prior-idle-ms` is, the harder it will be to invoke the hold behavior, making this feature less applicable for use-cases like capitalizing letters while typing normally. -However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. - -
- -### Positional hold-tap and `hold-trigger-key-positions` - -Including `hold-trigger-key-positions` in your hold-tap definition turns on the positional hold-tap feature. With positional hold-tap enabled, if you press any key **not** listed in `hold-trigger-key-positions` before `tapping-term-ms` expires, it will produce a tap. - -In all other situations, positional hold-tap will not modify the behavior of your hold-tap. Positional hold-tap is useful when used with home-row modifiers: for example, if you have a home-row modifier key in the left hand, by including only key positions from the right hand in `hold-trigger-key-positions`, you will only get hold behaviors during cross-hand key combinations unless you exceed `tapping-term-ms` when using "balanced" or "hold-preferred" flavors. - -`hold-trigger-key-positions` is an array of key position indexes. Key positions are numbered sequentially according to your keymap, starting with 0. So if the first key in your keymap is Q, this key is in position 0. The next key (probably W) will be in position 1, et cetera. - -For home-row mods, it is recommended to use this property with `hold-trigger-on-release` so that modifiers on the same hand can be combined. - -
- The following example uses a hold-tap behavior definition configured with the `hold-preferred` flavor, and with positional hold-tap enabled: - -```dts -#include -#include - -/ { - behaviors { - pht: positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <400>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <1>; // <---[[the W key]] - }; - }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - // position 0 position 1 position 2 - &pht LEFT_SHIFT Q &kp W &kp E - >; - }; - }; -}; -``` - -- The sequence `(pht_down, E_down, E_up, pht_up)` produces `qe`. The normal hold behavior (LEFT_SHIFT) **IS** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `E key`, which is in position 2, which **is NOT** included in `hold-trigger-key-positions`. -- The sequence `(pht_down, W_down, W_up, pht_up)` produces `W`. The normal hold behavior (LEFT_SHIFT) **is NOT** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `W key`, which is in position 1, which **IS** included in `hold-trigger-key-positions`. -- If the `LEFT_SHIFT / Q key` is held by itself for longer than `tapping-term-ms`, a hold behavior is produced. This is because positional hold-tap only modifies the behavior of a hold-tap if another key is pressed before the `tapping-term-ms` period expires. - -By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after -the hold-tap. For home-row mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. - -
-#### `hold-trigger-on-release` - -If set, instead of the keys **not** listed in `hold-trigger-key-positions` producing a tap when _pressed_ before `tapping-term-ms` expires, they instead produce a tap when _released_ before `tapping-term-ms` expires. - -```dts -&mt { - hold-trigger-on-release; -}; -``` - -### `hold-while-undecided` - -If enabled, the hold behavior will immediately be held on hold-tap press, and will release before the behavior is sent in the event the hold-tap resolves into a tap. With most modifiers this will not affect typing, and is useful for using modifiers with the mouse. - -```dts -&mt { - hold-while-undecided; -}; -``` - -:::warning[Interactions with combos] -If the key position that has the hold-tap assigned is _also_ used in any combos, the `hold-while-undecided` behavior isn't immediate with key-down, but waits until all those combo timeouts have expired. -::: - -#### `hold-while-undecided-linger` - -If your tap behavior activates the same modifier as the hold behavior, and you want to avoid a double tap when transitioning from the hold to the tap, you can use `hold-while-undecided-linger`. When enabled, the hold behavior will continue to be held until _after_ the tap behavior is released. - -For example, if the hold is `&kp LGUI` and the tap is `&sk LGUI`, then with `hold-while-undecided-linger` enabled, the host will see `LGUI` held down continuously until the sticky key is finished, instead of seeing a release and press when transitioning from hold to sticky key. - -```dts -&mt { - hold-while-undecided-linger; -}; -``` - -:::info[Alt/Win/Cmd behavior] -In some applications/desktop environments, pressing Alt keycodes by itself will have its own behavior like activate a menu and Gui keycodes will bring up the start menu or an application launcher. -::: - -### `retro-tap` - -If `retro-tap` is enabled, the tap behavior is triggered when releasing the hold-tap key if no other key was pressed in the meantime. The hold key does not activate until another key is pressed, meaning that it cannot be used for mouse events like Shift Click to select from your cursor position to mouse position. - -For example, if you press `&mt LEFT_SHIFT A` and then release it without pressing another key, it will output `a`. - -```dts -&mt { - retro-tap; -}; -``` diff --git a/docs/docs/keymaps/behaviors/index.mdx b/docs/docs/keymaps/behaviors/index.mdx deleted file mode 100644 index 5eb5668b..00000000 --- a/docs/docs/keymaps/behaviors/index.mdx +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Behavior Overview -sidebar_label: Overview ---- - -# Behaviors Overview - -"Behaviors" are bindings that are assigned to and triggered by key positions on keymap layers, sensors (like an encoder) or combos. They describe what happens e.g. when a certain key position is pressed or released, or an encoder triggers a rotation event. They can also be recursively invoked by other behaviors, such as macros. - -Below is a summary of pre-defined behavior bindings and user-definable behaviors available in ZMK, with references to documentation pages describing them. - -## Key Press Behaviors - -| Binding | Behavior | Description | -| ------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `&kp` | [Key Press](key-press.md) | Send keycodes to the connected host when a key is pressed | -| `&mt` | [Mod Tap](hold-tap.mdx#mod-tap) | Sends a different key press depending on whether a key is held or tapped | -| `&kt` | [Key Toggle](key-toggle.md) | Toggles the press of a key. If the key is not currently pressed, key toggle will press it, holding it until the key toggle is pressed again or the key is released in some other way. If the key is currently pressed, key toggle will release it | -| `&sk` | [Sticky Key](sticky-key.md) | Stays pressed until another key is pressed, then is released. It is often used for modifier keys like shift, which allows typing capital letters without holding it down | -| `&gresc` | [Grave Escape](mod-morph.md#behavior-binding) | Sends Grave Accent `` ` `` keycode if shift or GUI is held, sends Escape keycode otherwise | -| `&caps_word` | [Caps Word](caps-word.md) | Behaves similar to caps lock, but automatically deactivates when any key not in a continue list is pressed, or if the caps word key is pressed again | -| `&key_repeat` | [Key Repeat](key-repeat.md) | Sends again whatever keycode was last sent | - -## Miscellaneous Behaviors - -| Binding | Behavior | Description | -| -------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `&trans` | [Transparent](misc.md#transparent) | Passes the key press down to the next active layer in the stack for processing | -| `&none` | [None](misc.md#none) | Swallows and stops the key press, no keycode will be sent nor will the key press be passed down to the next active layer in the stack | - -## Layer Navigation Behaviors - -| Binding | Behavior | Description | -| ------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -| `&mo` | [Momentary Layer](layers.md#momentary-layer) | Enables a layer while a key is pressed | -| `<` | [Layer-tap](layers.md#layer-tap) | Enables a layer when a key is held, and outputs a key press when the key is only tapped for a short time | -| `&to` | [To Layer](layers.md#to-layer) | Enables a layer and disables all other layers except the default layer | -| `&tog` | [Toggle Layer](layers.md#toggle-layer) | Enables a layer until the layer is manually disabled | -| `&sl` | [Sticky Layer](sticky-layer.md) | Activates a layer until another key is pressed, then deactivates it | - -## Mouse Emulation Behaviors - -| Binding | Behavior | Description | -| ------- | ----------------------------------------------------------- | ------------------------------- | -| `&mkp` | [Mouse Button Press](mouse-emulation.md#mouse-button-press) | Emulates pressing mouse buttons | -| `&mmv` | [Mouse Move](mouse-emulation.md#mouse-move) | Emulates mouse movement | -| `&msc` | [Mouse Scroll](mouse-emulation.md#mouse-scroll) | Emulates mouse scrolling | - -## Reset Behaviors - -| Binding | Behavior | Description | -| ------------- | --------------------------------------- | ---------------------------------------------------------------------------------------- | -| `&sys_reset` | [Reset](reset.md#reset) | Resets the keyboard and re-runs the firmware flashed to the device | -| `&bootloader` | [Bootloader](reset.md#bootloader-reset) | Resets the keyboard and puts it into bootloader mode, allowing you to flash new firmware | - -## Output Selection Behaviors - -| Binding | Behavior | Description | -| ------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| `&bt` | [Bluetooth](bluetooth.md#bluetooth-behavior) | Completes a bluetooth action given on press, for example switching between devices | -| `&out` | [Output Selection](outputs.md#output-selection-behavior) | Allows selecting whether output is sent to the USB or bluetooth connection when both are connected | - -## Lighting Behaviors - -| Binding | Behavior | Description | -| --------- | ---------------------------------------------- | ---------------------------------------------------------------------------- | -| `&rgb_ug` | [RGB Underglow](underglow.md#behavior-binding) | Controls the RGB underglow, usually placed underneath the keyboard | -| `&bl` | [Backlight](backlight.md#behavior-binding) | Controls the keyboard backlighting, usually placed through or under switches | - -## Power Management Behaviors - -| Binding | Behavior | Description | -| ------------ | --------------------------------------------- | --------------------------------------------------------------- | -| `&ext_power` | [Power management](power.md#behavior-binding) | Allows enabling or disabling the VCC power output to save power | -| `&soft_off` | [Soft off](soft-off.md#behavior-binding) | Turns the keyboard off. | - -## ZMK Studio Behaviors - -| Binding | Behavior | Description | -| ---------------- | ------------------------------------------------------ | --------------------------------------------------------- | -| `&studio_unlock` | [ZMK Studio Unlock](studio-unlock.md#behavior-binding) | Unlocks the device so that ZMK Studio UI can make changes | - -## User-Defined Behaviors - -| Behavior | Description | -| ----------------------------------- | --------------------------------------------------------------------------------------------------- | -| [Macros](macros.md) | Allows configuring a list of other behaviors to invoke when the key is pressed and/or released | -| [Hold-Tap](hold-tap.mdx) | Invokes different behaviors depending on key press duration or interrupting keys. | -| [Tap Dance](tap-dance.mdx) | Invokes different behaviors corresponding to how many times a key is pressed | -| [Mod-Morph](mod-morph.md) | Invokes different behaviors depending on whether a specified modifier is held during a key press | -| [Sensor Rotation](sensor-rotate.md) | Invokes different behaviors depending on whether a sensor is rotated clockwise or counter-clockwise | diff --git a/docs/docs/keymaps/behaviors/key-toggle.md b/docs/docs/keymaps/behaviors/key-toggle.md deleted file mode 100644 index 173087ca..00000000 --- a/docs/docs/keymaps/behaviors/key-toggle.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Key Toggle Behavior -sidebar_label: Key Toggle ---- - -## Summary - -The key toggle behavior toggles the press of a key. -If the key is not currently pressed, key toggle will press it, holding it until the key toggle is pressed again or the key is released in some other way. -If the key _is_ currently pressed, key toggle will release it. - -Example uses for key toggle include shift lock, or `ALT-TAB` window switching without holding down the `ALT` modifier. - -### Behavior Binding - -- Reference: `&kt` -- Parameter: The [keycode](../list-of-keycodes.mdx), e.g. `LALT` or `DOWN_ARROW` - -Example: - -```dts -&kt LALT -``` - -You can use any keycode that works for `&kp` as parameter to `&kt`, however, [modified keys](../modifiers.mdx#modifier-functions) such as `LA(A)` will be toggled based on the status of the base keycode (in this case `A`). -In other words, modifiers are ignored when determining whether or not the key is currently pressed. - -### Configuration - -#### Toggle mode - -If you wish to ensure that a key is pressed or released, rather than merely toggling, then you can do so with the `toggle-mode` property. -Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`: - -```dts -/ { - behaviors { - kt_on: key_toggle_on_only { - compatible = "zmk,behavior-key-toggle"; - #binding-cells = <1>; - display-name = "Key Toggle On"; - toggle-mode = "on"; - }; - }; -}; -``` - -You can then use `&kt_on` in place of `&kt` whenever you wish to only toggle a key on, and not toggle it off. An `"off"` version of the behavior can be defined similarly. diff --git a/docs/docs/keymaps/behaviors/layers.md b/docs/docs/keymaps/behaviors/layers.md deleted file mode 100644 index 37b23e88..00000000 --- a/docs/docs/keymaps/behaviors/layers.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Layer Behaviors -sidebar_label: Layers ---- - -## Summary - -Often, you may want a certain key position to alter which layers are enabled, change the default layer, etc. -Below are the list of behaviors that can be used to activate and deactivate layers. - -:::note -Multiple layers can be active at the same time and activating a layer will not deactivate layers higher up in the "layer stack". - -Layer numbers start at 0 following the order they are defined in the keymap node, for example `&mo 3` would activate the 4th layer node defined in the keymap. -See [Layers](../index.mdx#layers) for more information. -::: - -## Momentary Layer - -The "momentary layer" behavior enables a layer while a certain key is pressed. Immediately upon -activation of the key, the layer is enabled, and immediately upon release of the key, the layer is disabled -again. - -### Behavior Binding - -- Reference: `&mo` -- Parameter: The layer number to enable while held, e.g. `1` - -Example: - -```dts -&mo 3 -``` - -## Layer-Tap - -The ["layer-tap" behavior](hold-tap.mdx#layer-tap) enables a layer when a key is held, and outputs a [key press](key-press.md) when the key is only tapped for a short time. -See linked documentation for details. - -## To Layer - -The "to layer" behavior enables a layer and disables _all_ other layers _except_ the default layer. - -### Behavior Binding - -- Reference: `&to` -- Parameter: The layer number to enable, e.g. `1` - -Example: - -```dts -&to 3 -``` - -## Toggle Layer - -The "toggle layer" behavior enables a layer if it is currently disabled, or disables it if enabled. - -### Behavior Binding - -- Reference: `&tog` -- Parameter: The layer number to enable/disable, e.g. `1` - -Example: - -```dts -&tog 3 -``` - -### Configuration - -#### Toggle mode - -If you wish to ensure that a layer is toggled on or off specifically, rather than switching between the two states, then you can do so with the `toggle-mode` property. -Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`: - -```dts -/ { - behaviors { - tog_on: toggle_layer_on_only { - compatible = "zmk,behavior-toggle-layer"; - #binding-cells = <1>; - display-name = "Toggle Layer On"; - toggle-mode = "on"; - locking; - }; - }; -}; -``` - -You can then use `&tog_on` in place of `&tog` whenever you wish to only toggle a layer on, and not toggle it off. An `"off"` version of the behavior can be defined similarly. - -## Layer Locking - -When the behaviors `&to` and `&tog` toggle a layer on, they will "lock" the layer in the active state. This prevents the layer from being deactivated by any behavior which is not a `&to` or a `&tog`. - -In particular, if you activate a layer momentarily using e.g. `&mo 1`, tapping e.g. `&tog 1` as defined above will prevent the layer from deactivating after releasing `&mo 1`. You can then press `&tog 1` again to deactivate the layer. - -For custom toggle, to, and momentary layer behaviors, this can be enabled by giving your behavior the `locking;` property. - -## Conditional Layers - -The "conditional layers" feature enables a particular layer when all layers in a specified set are active. -For more information, see [conditional layers](../conditional-layers.md). - -## Defines to Refer to Layers - -When working with layers, you may have several different key positions with bindings that enable/disable those layers. -To make it easier to refer to those layers in your key bindings, and to change which layers are where later, you can -add a set of `#define`s at the top of your keymap file, and use those defines in your keymap. - -For example, if you have three layers, you can add the following to the top of your keymap: - -```dts -#define DEFAULT 0 -#define LOWER 1 -#define RAISE 2 -``` - -This allows you to use those defines, e.g. `LOWER` later in your keymap. - -```dts -&mo LOWER // equivalent to &mo 1 -``` diff --git a/docs/docs/keymaps/behaviors/mod-morph.md b/docs/docs/keymaps/behaviors/mod-morph.md deleted file mode 100644 index 879db998..00000000 --- a/docs/docs/keymaps/behaviors/mod-morph.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Mod-Morph Behavior -sidebar_label: Mod-Morph ---- - -## Summary - -The mod-morph behavior invokes a different behavior depending on whether any of the specified modifiers are being held during the key press. - -- If you tap the key by itself, the first behavior binding is activated. -- If you tap the key while holding (any of) the specified modifier(s), the second behavior binding is activated. - -## Mod-Morph - -### Configuration - -Below is an example of how to implement the mod-morph "Grave Escape". When assigned to a key, pressing the key on its own will send an -Escape keycode but pressing it while a shift or GUI modifier is held sends the grave `` ` `` keycode instead: - -```dts -/ { - behaviors { - gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; - mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; -}; -``` - -Note that this specific mod-morph exists in ZMK by default using the binding `&gresc`. - -### Behavior Binding - -- Reference: `&gresc` -- Parameter: None - -Example: - -```dts -&gresc -``` - -### Mods - -This is how you determine what modifiers will activate the morphed version of the keycode. - -Available Modifiers: - -- `MOD_LSFT` -- `MOD_RSFT` -- `MOD_LCTL` -- `MOD_RCTL` -- `MOD_LALT` -- `MOD_RALT` -- `MOD_LGUI` -- `MOD_RGUI` - -Example: - -```dts -mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; -``` - -### Advanced Configuration - -#### `keep-mods` - -When a modifier specified in `mods` is being held, it won't be sent along with the morphed keycode unless it is also specified in `keep-mods`. By default `keep-mods` equals `0`, which means no modifier specified in `mods` will be sent along with the morphed keycode. - -For example, the following configuration morphs `LEFT_SHIFT` + `BACKSPACE` into `DELETE`, and morphs `RIGHT_SHIFT` + `BACKSPACE` into `RIGHT_SHIFT` + `DELETE`. - -```dts -/ { - behaviors { - bspc_del: backspace_delete { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp BACKSPACE>, <&kp DELETE>; - mods = <(MOD_LSFT|MOD_RSFT)>; - keep-mods = <(MOD_RSFT)>; - }; - }; -}; -``` - -#### Trigger conditions with multiple modifiers - -Any modifier used in the `mods` property will activate a mod-morph; it isn't possible to require that multiple modifiers are held _together_ in order to activate it. -However, you can nest multiple mod-morph behaviors to achieve more complex decision logic, where you use one (or two) mod-morph behaviors in the `bindings` fields of another mod-morph. - -As an example, consider the following two mod-morphs: - -```dts -/ { - behaviors { - morph_BC: morph_BC { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp B>, <&kp C>; - mods = <(MOD_LCTL|MOD_RCTL)>; - }; - morph_ABC: morph_ABC { - compatible = "zmk,behavior-mod-morph"; - #binding-cells = <0>; - bindings = <&kp A>, <&morph_BC>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - }; -}; -``` - -When you assign `&morph_ABC` to a key position and press it, it will output `A` by default. If you press it while a shift modifier is held it will output `B`, and if you are also holding a control modifier it will output `C` instead. - -:::note[Karabiner-Elements (macOS) interfering with mod-morphs] - -If the first modified key press sends the modifier along with the morphed keycode and [Karabiner-Elements](https://karabiner-elements.pqrs.org/) is running, disable the "Modify Events" toggle from Karabiner's "Devices" settings page for the keyboard running ZMK. - -::: diff --git a/docs/docs/keymaps/behaviors/mouse-emulation.md b/docs/docs/keymaps/behaviors/mouse-emulation.md deleted file mode 100644 index dcd1fb70..00000000 --- a/docs/docs/keymaps/behaviors/mouse-emulation.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -title: Mouse Emulation Behaviors -sidebar_label: Mouse Emulation ---- - -## Summary - -Mouse emulation behaviors send mouse events, including mouse button presses, cursor movement and scrolling. - -:::warning[Refreshing the HID descriptor] - -Enabling or disabling the mouse emulation feature modifies the HID report descriptor and requires it to be [refreshed](../../features/bluetooth.md#refreshing-the-hid-descriptor). -The mouse functionality will not work over BLE until that is done. - -::: - -## Configuration Option - -To use any of the behaviors documented here, the ZMK mouse feature must be enabled explicitly via a config option: - -```ini -CONFIG_ZMK_POINTING=y -``` - -## Mouse Emulation Defines - -To make it easier to encode the HID mouse button and move/scroll speed numeric values, include -the [`dt-bindings/zmk/pointing.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/pointing.h) header -provided by ZMK near the top: - -```dts -#include -``` - -Should you wish to override the default movement or scrolling max velocities, you can define the defaults before including the header, e.g.: - -```c -#define ZMK_POINTING_DEFAULT_MOVE_VAL 1500 // default: 600 -#define ZMK_POINTING_DEFAULT_SCRL_VAL 20 // default: 10 - -#include -``` - -## Mouse Button Press - -This behavior can press/release up to 5 mouse buttons. - -### Behavior Binding - -- Reference: `&mkp` -- Parameter: A `uint8` with bits 0 through 4 each referring to a button. - -The following defines can be passed for the parameter: - -| Define | Action | -| :------------ | :------------- | -| `MB1`, `LCLK` | Left click | -| `MB2`, `RCLK` | Right click | -| `MB3`, `MCLK` | Middle click | -| `MB4` | Mouse button 4 | -| `MB5` | Mouse button 5 | - -Mouse buttons 4 and 5 typically map to "back" and "forward" actions in most applications. - -### Examples - -The following will send a left click press when the binding is triggered: - -```dts -&mkp LCLK -``` - -This example will send press of the fourth mouse button when the binding is triggered: - -```dts -&mkp MB4 -``` - -### Input Processors - -If you want to apply any [input processors](../input-processors/index.md#input-processors-overview) to `&mkp` you can do so by referencing `&mkp_input_listener`, e.g.: - -```dts -&mkp_input_listener { - input-processors = <&zip_temp_layer 2 2000>; -} -``` - -## Mouse Move - -This behavior sends mouse X/Y movement events to the connected host. - -### Behavior Binding - -- Reference: `&mmv` -- Parameter: A `uint32` with 16-bits each used for vertical and horizontal max velocity. - -The following predefined values can be passed for the parameter: - -| Define | Action | -| :----------- | :--------- | -| `MOVE_UP` | Move up | -| `MOVE_DOWN` | Move down | -| `MOVE_LEFT` | Move left | -| `MOVE_RIGHT` | Move right | - -Additionally, if you want to pass a different max speed than the default for the `MOVE_*` defines, custom X and Y velocity values can be passed with `MOVE_X` and `MOVE_Y`, e.g. `MOVE_X(100)` or `MOVE_Y(-100)`. Positive values indicate movement directions right or down. Note that the default value of the max speed depends on [the value of `ZMK_POINTING_DEFAULT_MOVE_VAL`](#mouse-emulation-defines). - -### Examples - -The following will send a down mouse movement event to the host when pressed/held: - -```dts -&mmv MOVE_DOWN -``` - -The following will send a left mouse movement event to the host when pressed/held: - -```dts -&mmv MOVE_LEFT -``` - -### Input Processors - -If you want to apply any [input processors](../input-processors/index.md#input-processors-overview) to `&mmv` you can do so by referencing `&mmv_input_listener`, e.g.: - -```dts -&mmv_input_listener { - input-processors = <&zip_temp_layer 2 2000>; -} -``` - -## Mouse Scroll - -This behavior sends vertical and horizontal scroll events to the connected host. - -### Behavior Binding - -- Reference: `&msc` -- Parameter: A `uint32` with 16-bits each used for vertical and horizontal velocity. - -The following defines can be passed for the parameter: - -| Define | Action | -| :----------- | :----------- | -| `SCRL_UP` | Scroll up | -| `SCRL_DOWN` | Scroll down | -| `SCRL_LEFT` | Scroll left | -| `SCRL_RIGHT` | Scroll right | - -Additionally, if you want to pass a different max speed than the default for the `SCRL_*` defines, custom X and Y velocity values can be passed with `MOVE_X` and `MOVE_Y`, e.g. `MOVE_X(5)` or `MOVE_Y(-5)`. Positive values indicate scroll directions right or up. Note that the default value of the max speed depends on [the value of `ZMK_POINTING_DEFAULT_SCRL_VAL`](#mouse-emulation-defines). - -### Examples - -The following will send a scroll down event to the host when pressed/held: - -```dts -&msc SCRL_DOWN -``` - -The following will send a scroll left event to the host when pressed/held: - -```dts -&msc SCRL_LEFT -``` - -:::note - -If you enabled [smooth scrolling](../../config/pointing.md#kconfig) then you will want to use the same `MOVE_UP`, `MOVE_DOWN`, etc values instead of the smaller `SCRL_*` parameters for more sensible scroll speeds. - -::: - -### Input Processors - -If you want to apply any [input processors](../input-processors/index.md#input-processors-overview) to `&msc` you can do so by referencing `&msc_input_listener`, e.g.: - -```dts -&msc_input_listener { - input-processors = <&zip_temp_layer 2 2000>; -} -``` - -## Advanced Configuration - -Both `&mmv` and `&msc` are instances of the `"zmk,behavior-input-two-axis"` behavior and can be modified using the [two axis input behavior](../../config/behaviors.md#two-axis-input) configuration properties. The default settings are as follows: - -### Mouse Move - -```dts -&mmv { - x-input-code = ; - y-input-code = ; - time-to-max-speed-ms = <300>; - acceleration-exponent = <1>; -}; -``` - -### Mouse Scroll - -```dts -&msc { - x-input-code = ; - y-input-code = ; - time-to-max-speed-ms = <300>; - acceleration-exponent = <0>; -}; -``` diff --git a/docs/docs/keymaps/behaviors/soft-off.md b/docs/docs/keymaps/behaviors/soft-off.md deleted file mode 100644 index 0b664df2..00000000 --- a/docs/docs/keymaps/behaviors/soft-off.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Soft Off Behavior -sidebar_label: Soft Off ---- - -## Summary - -The soft off behavior is used to force the keyboard into an off state. Depending on the specific keyboard hardware, the keyboard can be turned back on again either with a dedicated on/off button that is available, or using the reset button found on the device. - -Refer to the [soft off config](../../config/power.md#low-power-states) for details on enabling soft off in order to use this behavior. - -For more information, see the [soft off section](../../features/low-power-states.md) of the low power states feature page. - -### Behavior Binding - -- Reference: `&soft_off` - -Example: - -``` -&soft_off -``` - -### Configuration - -#### Hold time - -By default, the keyboard will be turned off as soon as the key bound to the behavior is released, even if the key is only tapped briefly. If you would prefer that the key need be held a certain amount of time before releasing, you can set the `hold-time-ms` to a non-zero value in your keymap: - -``` -&soft_off { - hold-time-ms = <5000>; // Only turn off it the key is held for 5 seconds or longer. -}; - -/ { - keymap { - ... - }; -}; -``` - -The peripheral half of a [split keyboard](../../features/split-keyboards.md) will always enter the soft off state immediately when triggering the behavior, regardless of the `hold-time-ms` setting. This is to ensure reliability, as otherwise the central may enter the soft off state before notifying the peripheral that it should also do so. - -If you wish to change this setting, and thus accept the potential for reliability issues, you may remove the `split-peripheral-off-on-press` flag from the behavior: - -```dts -&soft_off { - /delete-property/ split-peripheral-off-on-press; -}; -``` diff --git a/docs/docs/keymaps/behaviors/studio-unlock.md b/docs/docs/keymaps/behaviors/studio-unlock.md deleted file mode 100644 index 32502b7c..00000000 --- a/docs/docs/keymaps/behaviors/studio-unlock.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: ZMK Studio Unlock Behavior -sidebar_label: ZMK Studio Unlock ---- - -## Summary - -## ZMK Studio Unlock - -The ZMK Studio unlock behavior is used to grant [ZMK Studio](../../features/studio.md) access to make changes to your ZMK device. The device will remain unlocked until a certain amount of time of inactivity in ZMK Studio, or on disconnect. Those trigger events for relocking can be configured with [studio configuration](../../config/studio.md). - -### Behavior Binding - -- Reference: `&studio_unlock` -- Parameters: None - -Example: - -```dts -&studio_unlock -``` diff --git a/docs/docs/keymaps/input-processors/behaviors.md b/docs/docs/keymaps/input-processors/behaviors.md deleted file mode 100644 index 032774c7..00000000 --- a/docs/docs/keymaps/input-processors/behaviors.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Behaviors Input Processor -sidebar_label: Behaviors ---- - -## Overview - -The behaviors input processor is used invoke standard behaviors when certain input events occur; most frequently this is used to trigger behaviors when certain mouse buttons are triggered by physical pointing devices. - -This input processor is primarily intended for `INPUT_EV_KEY` type of events that have a binary on/off state, not vector types for relative or absolute movements. - -:::note[Source-specific behaviors on split keyboards] -Invoking a [source-specific behavior](../../features/split-keyboards.md#source-locality-behaviors) such as one of the [reset behaviors](../behaviors/reset.md) using this input processor will always trigger it on the central side of the keyboard, regardless of the side includes the input device that originally generated the input event. -::: - -## Usage - -When used, this input processor takes no parameters, as the event code to behavior mapping is specified in the definition of the specific processor instance, e.g.: - -```dts -&zip_button_behaviors -``` - -## Pre-Defined Instances - -One pre-defined instance of the out-of-band behaviors input processor is available: - -| Reference | Description | -| ----------------------- | -------------------------------------------------- | -| `&zip_button_behaviors` | Maps left/right/middle clicks to a given behavior. | - -Should you wish to update the existing instance to trigger different behaviors for each mouse button, you can override the `bindings` property, e.g.: - -```dts -&zip_button_behaviors { - bindings = <&kp A &kp B &kp C>; -}; -``` - -By default, the `bindings` property maps all the buttons to [`&none`](../behaviors/misc.md#none), so you will want to override the `bindings` property like above if you use this processor by assigning it to an [input listener](usage.md). - -## User-Defined Instances - -Users can define new instances of the out-of-band behaviors input processor if they want to target different codes or assign different behaviors. - -### Example - -Below example maps the left mouse button code to the middle mouse button. - -```dts -#include - -/ { - input_processors { - zip_right_click_trigger_paste: zip_right_click_trigger_paste { - compatible = "zmk,input-processor-behaviors"; - #input-processor-cells = <0>; - codes = ; - bindings = <&kp LC(V) >; - }; - }; -} -``` - -### Compatible - -The behaviors input processor uses a `compatible` property of `"zmk,input-processor-behaviors"`. - -### Standard Properties - -- `#input-processor-cells` - required to be constant value of `<0>`. - -### User Properties - -- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to scale. Usually, this is `INPUT_EV_KEY` for key/button events. The default value if omitted is `INPUT_EV_KEY`. -- `codes` - The specific codes of the given type to capture, e.g. [button event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L188). This list must be the same length as the `bindings` property. -- `bindings` - The bindings to trigger when an event with the corresponding code is processed. diff --git a/docs/docs/keymaps/input-processors/code-mapper.md b/docs/docs/keymaps/input-processors/code-mapper.md deleted file mode 100644 index 05e0bc84..00000000 --- a/docs/docs/keymaps/input-processors/code-mapper.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Code Mapper Input Processor -sidebar_label: Code Mapper ---- - -## Overview - -The code mapper input processor is used to map the code of an event to a new one, e.g. changing a vertical Y movement event into a scroll event. - -## Usage - -When used, a code mapper takes no parameters, as the code mappings are specified in the definition of the specific mapper instance, e.g.: - -```dts -&zip_xy_to_scroll_mapper -``` - -## Pre-Defined Instances - -Three pre-defined instance of the code mapper input processor are available: - -| Reference | Description | -| -------------------------- | ----------------------------------------------------------------------- | -| `&zip_xy_to_scroll_mapper` | Map X/Y movement events to horizontal wheel/wheel events, respectively. | -| `&zip_xy_swap_mapper` | Map X to Y, and Y to X for movements. | - -Note that swapping X and Y movements can also be accomplished with the [transformer](transformer.md#pre-defined-instances) processors. - -## User-Defined Instances - -Users can define new instances of the code mapper input processor if they want to target different codes. - -### Example - -Below example maps the left mouse button code to the middle mouse button. - -```dts -#include - -/ { - input_processors { - zip_click_to_middle_click_mapper: zip_click_to_middle_click_mapper { - compatible = "zmk,input-processor-code-mapper"; - #input-processor-cells = <0>; - type = ; - map = ; - }; - }; -} -``` - -### Compatible - -The code mapper input processor uses a `compatible` property of `"zmk,input-processor-code-mapper"`. - -### Standard Properties - -- `#input-processor-cells` - required to be constant value of `<0>`. - -### User Properties - -- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to scale. Usually, this is `INPUT_EV_REL` for relative events and `INPUT_EV_KEY` for key/button events. -- `map` - The specific codes of the given type to map, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258). This list must be an even number of entries which is processed as a list of pairs of codes. The first code in the pair is the source code, and the second is the code to map it to. diff --git a/docs/docs/keymaps/input-processors/index.md b/docs/docs/keymaps/input-processors/index.md deleted file mode 100644 index 16d774cb..00000000 --- a/docs/docs/keymaps/input-processors/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Input Processor Overview -sidebar_label: Overview ---- - -## Input Processors Overview - -"Input processors" are small pieces of functionality that process and optionally modify events generated from emulated and physical pointing devices. Processors can do things like scaling movement values to make them larger or smaller for detailed work, swapping the event types to turn movements into scroll events, or temporarily enabling an extra layer while the pointer is in use. - -## Usage - -For information on using input processors with a given pointing device, see [input processor usage](usage.md). - -## Available Processors - -Below is a summary of pre-defined input processors and user-definable input processors available in ZMK, with references to documentation pages describing them. - -### Pre-Defined Processors - -A set of predefined input processors is available by adding the following at the top of your keymap/overlay file: - -```dts -#include -``` - -Once included, you can use the following: - -| Binding | Processor | Description | -| -------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------ | -| `&zip_xy_scaler` | [XY Scaler](scaler.md#pre-defined-instances) | Scale the X/Y input events using a multiplier and divisor | -| `&zip_x_scaler` | [X Scaler](scaler.md#pre-defined-instances) | Scale the X input events using a multiplier and divisor | -| `&zip_y_scaler` | [Y Scaler](scaler.md#pre-defined-instances) | Scale the Y input events using a multiplier and divisor | -| `&zip_scroll_scaler` | [Scroll Scaler](scaler.md#pre-defined-instances) | Scale wheel/horizontal wheel input events using a multiplier and divisor | -| `&zip_xy_transform` | [XY Transform](transformer.md#pre-defined-instances) | Transform X/Y values, e.g. inverting or swapping | -| `&zip_scroll_transform` | [Scroll Transform](transformer.md#pre-defined-instances) | Transform wheel/horizontal wheel values, e.g. inverting or swapping | -| `&zip_xy_to_scroll_mapper` | [XY To Scroll Mapper](code-mapper.md#pre-defined-instances) | Map X/Y values to scroll wheel/horizontal wheel events | -| `&zip_xy_swap_mapper` | [XY Swap Mapper](code-mapper.md#pre-defined-instances) | Swap X/Y values | -| `&zip_temp_layer` | [Temporary Layer](temp-layer.md#pre-defined-instances) | Temporarily enable a layer during pointer use | -| `&zip_button_behaviors` | [Mouse Button Behaviors](behaviors.md#pre-defined-instances) | Trigger behaviors when certain mouse buttons are pressed | - -### User-Defined Processors - -Several of the input processors that have predefined instances, e.g. `&zip_xy_scaler` or `&zip_xy_to_scroll_mapper` can also have new instances created with custom properties around which input codes to scale, or which codes to map, etc. - -| Compatible | Processor | Description | -| --------------------------------- | ------------------------------------------------------- | --------------------------------------------------------- | -| `zmk,input-processor-scaler` | [Scaler](scaler.md#user-defined-instances) | Scale value of input events | -| `zmk,input-processor-transform` | [Transform](transformer.md#user-defined-instances) | Perform various transforms like inverting values | -| `zmk,input-processor-code-mapper` | [Code Mapper](code-mapper.md#user-defined-instances) | Map one event code to another type | -| `zmk,input-processor-behaviors` | [Behaviors](behaviors.md#user-defined-instances) | Trigger behaviors for certain matching input events | -| `zmk,input-processor-temp-layer` | [Temporary layer](temp-layer.md#user-defined-instances) | Temporarily enable a layer when input events are received | - -## External Processors - -Much like behaviors, custom input processors can also be added to [external modules](../../features/modules.mdx) to allow complete control of the processing operation. See [`input_processor.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/drivers/input_processor.h) for the definition of the driver API. diff --git a/docs/docs/keymaps/input-processors/scaler.md b/docs/docs/keymaps/input-processors/scaler.md deleted file mode 100644 index 2d0a30cf..00000000 --- a/docs/docs/keymaps/input-processors/scaler.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Scaler Input Processor -sidebar_label: Scaler ---- - -## Overview - -The scaler input processor is used to scale the value of an input event that has a code matching the codes set on the scaler. Events with other codes will be ignored. Values are scaled by multiplying by the multiplier parameter, and then dividing by the divisor parameter. - -## Usage - -When used, a scaler takes two parameters that are positive integers, a multiplier and a divisor, e.g.: - -```dts -&zip_xy_scaler 2 1 -``` - -which will double all the X/Y movement, or: - -```dts -&zip_xy_scaler 1 3 -``` - -which will make movements more granular by reducing the speed to one third. - -:::warning - -A maximum value of `16` should be used for the multiplier and divisor parameters to avoid overflows. - -::: - -## Pre-Defined Instances - -Three pre-defined instance of the scaler input processor are available: - -| Reference | Description | -| -------------------- | --------------------------------------------- | -| `&zip_xy_scaler` | Scale X- and Y-axis values by the same amount | -| `&zip_x_scaler` | Scale X-axis values | -| `&zip_y_scaler` | Scale Y-axis values | -| `&zip_scroll_scaler` | Scale wheel and horizontal wheel values | - -## User-Defined Instances - -Users can define new instances of the scaler input processor if they want to target different codes. - -### Example - -```dts -#include - -/ { - input_processors { - zip_wheel_scaler: zip_wheel_scaler { - compatible = "zmk,input-processor-scaler"; - #input-processor-cells = <2>; - type = ; - codes = ; - track-remainders; - }; - }; -} -``` - -### Compatible - -The scaler input processor uses a `compatible` property of `"zmk,input-processor-scaler"`. - -### Standard Properties - -- `#input-processor-cells` - required to be constant value of `<2>`. -- `track-remainders` - boolean flag that indicates callers should allow the processor to track remainders between events. - -### User Properties - -- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to scale. Usually, this is `INPUT_EV_REL` for relative events. -- `codes` - The specific codes within the given type to scale, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) diff --git a/docs/docs/keymaps/input-processors/temp-layer.md b/docs/docs/keymaps/input-processors/temp-layer.md deleted file mode 100644 index 47f2fe6d..00000000 --- a/docs/docs/keymaps/input-processors/temp-layer.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Temporary Layer Input Processor -sidebar_label: Temporary Layer ---- - -## Overview - -The temporary layer input processor is used to enable a layer when input events are received, and automatically disable it when no further events are received in the given timeout duration. This most frequently is used to temporarily enable a layer with a set of [mouse button emulation behaviors](../behaviors/mouse-emulation.md#mouse-button-press) on it, so you can press various mouse buttons with the normal keyboard keys while using a physical pointer device for X/Y movement. - -## Usage - -When used, the temporary layer input processor takes two parameters, the layer index to enable and a timeout value in milliseconds: - -```dts -&zip_temp_layer 2 2000 -``` - -Above example enables the third layer and automatically disables it again after 2 seconds with no events from this pointing device. - -## Pre-Defined Instances - -One pre-defined instance of the temporary layer input processor is available: - -| Reference | Description | -| ----------------- | --------------------------------------------------------------- | -| `&zip_temp_layer` | Enable a certain layer temporarily until no events are received | - -## User-Defined Instances - -Users can define new instances of the temporary layer input processor to use different settings. - -### Example - -```dts -#include - -/ { - /omit-if-no-ref/ zip_temp_layer: zip_temp_layer { - compatible = "zmk,input-processor-temp-layer"; - #input-processor-cells = <2>; - require-prior-idle-ms = <2000>; - excluded-positions = <1 2 3>; - }; -}; -``` - -### Compatible - -The temp layer input processor uses a `compatible` property of `"zmk,input-processor-temp-layer"`. - -### Standard Properties - -- `#input-processor-cells` - required to be constant value of `<2>`. - -### User Properties - -- `require-prior-idle-ms` - Only activate the layer if there have not been any key presses for at least the set number of milliseconds before the pointing device event -- `excluded-positions` - List of (zero-based) key positions to exclude from deactivating the layer once it is active. diff --git a/docs/docs/keymaps/input-processors/transformer.md b/docs/docs/keymaps/input-processors/transformer.md deleted file mode 100644 index 65feb920..00000000 --- a/docs/docs/keymaps/input-processors/transformer.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Transformer Input Processor -sidebar_label: Transformer ---- - -## Overview - -The transformer input processor is used to perform various transforms on the value of an input event that has a code matching the codes set on the transformer. Events with other codes will be ignored. - -## Available Transforms - -The following transforms are available, by including -the [`dt-bindings/zmk/input_transform.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/input_transform.h) header -provided by ZMK near the top of your keymap/overlay: - -```dts -#include -``` - -- `INPUT_TRANSFORM_XY_SWAP` - When encountering a value with matching type, swap the type of the event to the other axis, e.g. change an event of type `INPUT_REL_X` to type `INPUT_REL_Y`. -- `INPUT_TRANSFORM_X_INVERT` - Invert the values of any events that match the configured `x-codes` of the processor, by multiplying by negative one. -- `INPUT_TRANSFORM_Y_INVERT` - Invert the values of any events that match the configured `y-codes` of the processor, by multiplying by negative one. - -## Usage - -When used, a transformer takes one parameter, a combination of flags indicating which transforms to apply: - -```dts -&zip_xy_transform (INPUT_TRANSFORM_X_INVERT | INPUT_TRANSFORM_Y_INVERT) -``` - -## Pre-Defined Instances - -Three pre-defined instance of the scaler input processor are available: - -| Reference | Description | -| ----------------------- | ------------------------------------------------------------- | -| `&zip_xy_transform` | Applies the given transforms to X/Y movement events | -| `&zip_scroll_transform` | Applies the given transforms to wheel/horizontal wheel events | - -## User Defined Instances - -Users can define new instances of the transform input processor if they want to target different codes. - -### Example - -```dts -#include - -/ { - input_processors { - my_rotation_event_transform: my_rotation_event_transform { - compatible = "zmk,input-processor-transform"; - #input-processor-cells = <1>; - type = ; - x-codes = ; - y-codes = ; - }; - }; -} -``` - -### Compatible - -The transform input processor uses a `compatible` property of `"zmk,input-processor-transform"`. - -### Standard Properties - -- `#input-processor-cells` - required to be constant value of `<1>`. - -### User Properties - -- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to transform. Usually, this is `INPUT_EV_REL` for relative events. -- `x-codes` - The specific X codes within the given type to transform, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) -- `y-codes` - The specific Y codes within the given type to transform, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) diff --git a/docs/docs/keymaps/input-processors/usage.md b/docs/docs/keymaps/input-processors/usage.md deleted file mode 100644 index 907066e9..00000000 --- a/docs/docs/keymaps/input-processors/usage.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Input Processor Usage -sidebar_label: Usage ---- - -Input processors are used by assigning them to a given [input listener](../../features/pointing.md#input-listeners). A base set of processors is assigned to a listener, and then overrides can be set that are only active when certain [layers](../index.mdx#layers) are active. The examples in the following assume you are adding processors to the `&trackpad` device which is set up with a `&trackpad_listener`. - -### Base Processors - -Base processors are assigned in the `input-processors` property, and when events are generated, the events are process in the sequence in the order the processors are listed. For example, if you wanted your trackpad to always scale the values to increase the movements, you would assign the [scaler](scaler.md#pre-defined-instances) input processor to the property: - -```dts -#include - -&trackpad_listener { - input-processors = <&zip_xy_scaler 3 2>; -} -``` - -### Layer Specific Overrides - -Additional overrides can be added that only apply when the associated layer is active. For example, to make the trackpad work as a scroll device when your layer `1` is active, nest a child node on the listener and set the `layers` and `input-processors` properties: - -```dts -#include - -&trackpad_listener { - input-processors = <&zip_xy_scaler 3 2>; - - scroller { - layers = <1>; - input-processors = <&zip_xy_to_scroll_mapper>; - }; -} -``` - -:::note - -Overrides are processed in the order they are declared, from top to bottom, followed by the base processors in the parent node. Their application order is _not_ in any way tied to the layers specified in the `layers` property. - -::: - -By default, the first-defined override node that matches the layer specification will apply, in which case and any other overrides or the base processors will be skipped. If you add the `process-next;` property to a child node, the other processors will continue to be checked and applied even if that node's layer filter matches. - -```dts -#include - -&trackpad_listener { - input-processors = <&zip_xy_scaler 3 2>; - - scroller { - layers = <1>; - input-processors = <&zip_xy_to_scroll_mapper>; - process-next; - }; -} -``` - -For more details, see the [Input Listener configuration](../../config/pointing.md#input-listener) section. diff --git a/docs/docs/keymaps/list-of-keycodes.mdx b/docs/docs/keymaps/list-of-keycodes.mdx deleted file mode 100644 index 3ee88367..00000000 --- a/docs/docs/keymaps/list-of-keycodes.mdx +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: List of Keycodes -sidebar_label: List of Keycodes ---- - -import OsLegend from "@site/src/components/codes/OsLegend"; -import ToastyContainer from "@site/src/components/codes/ToastyContainer"; -import Table from "@site/src/components/codes/Table"; - -This is the reference page for keycodes used by behaviors. Use the table of contents (on the right or the top) for easy navigation. - -:::info[Keyboard vs. Consumer keycodes] -In the below tables, there are keycode pairs with similar names where one variant has a `K_` prefix and another `C_`. -These variants correspond to similarly named usages from different [HID usage pages](https://usb.org/sites/default/files/hut1_2.pdf#page=16), -namely the "keyboard/keypad" and "consumer" ones respectively. - -In practice, some OS and applications might listen to only one of the variants. -You can use the values in the compatibility columns below to assist you in selecting which one to use. -::: - - - - -## Keyboard - -### Letters - -
- -### Numbers - -
- -### Symbols / Punctuation - -
- -### Control & Whitespace - -
- -### Navigation - -
- -### Locks - -
- -### F Keys - -
- -### International - -
- -### Language - -
- -### Miscellaneous - -
- -## Modifiers - -The [Modifiers](modifiers.mdx) page includes further information. - -
- -## Keypad - -
- -### Numbers - -
- -### Symbols / Operations - -
- -## Editing - -### Cut, Copy, Paste - -
- -### Undo, Redo - -
- -## Media - -### Sound / Volume - -
- -### Display - -
- -### Media Controls - -
- -### Consumer Menus - -
- -### Consumer Controls - -
- -## Applications - -### Application Controls - -
- -### Applications (Launch) - -
- -## Input Assist - -
- -## Power & Lock - -
diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md new file mode 100644 index 00000000..1418f327 --- /dev/null +++ b/docs/docs/troubleshooting.md @@ -0,0 +1,108 @@ +--- +title: Troubleshooting +sidebar_title: Troubleshooting +--- + +The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). + +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page for issues related to bluetooth. + +### File Transfer Error + +Variations of the warnings shown below occur when flashing the `.uf2` onto the microcontroller. This is because the microcontroller resets itself before the OS receives confirmation that the file transfer is complete. Errors like this are normal and can generally be ignored. Verification of a functional board can be done by attempting to pair your newly flashed keyboard to your computer via Bluetooth or plugging in a USB cable if `ZMK_USB` is enabled in your Kconfig.defconfig. + +| ![Example Error Screen](../docs/assets/troubleshooting/filetransfer/windows.png) | +| :------------------------------------------------------------------------------: | +| An example of the file transfer error on Windows 10 | + +| ![Example Error Screen](../docs/assets/troubleshooting/filetransfer/linux.png) | +| :----------------------------------------------------------------------------: | +| An example of the file transfer error on Linux | + +| ![Example Error Screen](../docs/assets/troubleshooting/filetransfer/mac.png) | +| :--------------------------------------------------------------------------: | +| An example of the file transfer error on macOS | + +### macOS Ventura error + +macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. Issue is fixed in macOS version 13.1. + +### CMake Error + +An error along the lines of `CMake Error at (zmk directory)/zephyr/cmake/generic_toolchain.cmake:64 (include): include could not find load file:` during firmware compilation indicates that the Zephyr Environment Variables are not properly defined. +For more information, click [here](../docs/development/setup.md#environment-variables). + +### West Build Errors + +West build errors usually indicate syntax problems in the `.keymap` file during the compilation process. The following are some examples and root causes. + +:::note +If you are reviewing these errors in the GitHub Actions tab, they can be found in the `West Build` step of the build process. +::: + +#### devicetree error + +A `devicetree error` followed by a reference to the line number on `.keymap` refers to an issue at the exact line position in that file. For example, below error message indicates a missing `;` at line 109 of the `cradio.keymap` file: + +``` +devicetree error: /__w/zmk-config/zmk-config/config/cradio.keymap:109 (column 4): parse error: expected ';' or ',' +``` + +#### devicetree_unfixed.h error + +A `devicetree_unfixed.h` error that follows with an "undeclared here" string indicates a problem with key bindings, like behavior nodes (e.g. `&kp` or `&mt`) with incorrect number of parameters: + +``` +/__w/zmk-config/zmk-config/build/zephyr/include/generated/devicetree_unfixed.h:3756:145: error: 'DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label' undeclared here (not in a function); did you mean 'DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_16_PH'? +``` + +In this example, the error string `DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label` indicates a problem with the key binding in position `12` in the `symbol_layer` of the keymap. + +:::info +Key positions are numbered starting from `0` at the top left key on the keymap, incrementing horizontally, row by row. +::: + +:::tip +A common mistake that leads to this error is to use [key press keycodes](behaviors/key-press.md) without the leading `&kp` binding. That is, having entries such as `SPACE` that should have been `&kp SPACE`. +::: + +### Split Keyboard Halves Unable to Pair + +Split keyboard halves pairing issue can be resolved by flashing a settings reset firmware to both controllers. You will first need to acquire the reset UF2 image file with one of the following options: + +#### Option 1: Build Reset UF2 in 'zmk-config' + +Find the `build.yaml` file in your `zmk-config` folder and add an additional settings reset build for the board used by your split keyboard. For example assuming that the config repo is setup for nice!nano v2 with Corne, append the `settings_reset` shield to the `build.yaml` file as follows: + +```yml +include: + - board: nice_nano_v2 + shield: corne_left + - board: nice_nano_v2 + shield: corne_right + - board: nice_nano_v2 + shield: settings_reset +``` + +Save the file, commit the changes and push them to GitHub. Download the new firmware zip file build by the latest GitHub Actions job. In it you will find an additional `settings_reset` UF2 image file. + +#### Option 2: Download Reset UF2 from ZMK's Workflow + +1. [Open the GitHub `Actions` tab and select the `Build` workflow](https://github.com/zmkfirmware/zmk/actions?query=workflow%3ABuild+branch%3Amain+event%3Apush). +1. Find one of the 'results' for which the core-coverage job was successfully run, indicated by a green checkmark in the core-coverage bubble like the image example below. +1. From the next page under "Artifacts", download and unzip the `-settings_reset-zmk` zip file for the UF2 image. + +| ![Successful core-coverage Job](../docs/assets/troubleshooting/splitpairing/corecoverage.png) | +| :-------------------------------------------------------------------------------------------: | +| An example of a successful core-coverage job which will produce a settings_reset firmware. | + +#### Reset Split Keyboard Procedure + +Perform the following steps to reset both halves of your split keyboard: + +1. Put each half of the split keyboard into bootloader mode. +1. Flash one of the halves of the split with the downloaded settings reset UF2 image. Immediately after flashing the chosen half, put it into bootloader mode to avoid accidental bonding between the halves. +1. Repeat step 2 with the other half of the split keyboard. +1. Flash the actual image for each half of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half). + +After completing these steps, pair the halves of the split keyboard together by resetting them at the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons at the same time. diff --git a/docs/docs/troubleshooting/building-issues.md b/docs/docs/troubleshooting/building-issues.md deleted file mode 100644 index ca53e9bf..00000000 --- a/docs/docs/troubleshooting/building-issues.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: Building Issues -sidebar_label: Building Issues -description: Troubleshooting issues when compiling ZMK firmware. ---- - -## CMake Error - -An error along the lines of `CMake Error at (zmk directory)/zephyr/cmake/generic_toolchain.cmake:64 (include): include could not find load file:` during firmware compilation indicates that the Zephyr Environment Variables are not properly defined. -For more information, see [Zephyr's CMake Package](https://docs.zephyrproject.org/4.1.0/build/zephyr_cmake_package.html). - -## West Build Errors - -West build errors usually indicate syntax problems in the `.keymap` file during the compilation process. The following are some examples and root causes. - -:::note -If you are reviewing these errors in the GitHub Actions tab, they can be found in the `West Build` step of the build process. -::: - -### Keymap Error - -If you get an error stating `Keymap node not found, check a keymap is available and is has compatible = "zmk,keymap" set` this is an indication that the build process cannot find the keymap. Double check that the `.keymap` file is present and has been discovered by the build process. This can be checked by looking for a line in the build log stating `-- Using keymap file: /path/to/keymap/file/.keymap`. Inside the keymap file ensure the keymap node has `compatible = zmk,keymap` and it's not misspelled. For more information see the [Keymaps](keymaps/index.mdx) and [Config](config/index.md) documentation. - -### Devicetree Errors - -#### "parse error" - -A `devicetree error` followed by a reference to the line number on `.keymap` refers to an issue at the exact line position in that file. For example, below error message indicates a missing `;` at line 109 of the `cradio.keymap` file: - -``` -devicetree error: /__w/zmk-config/zmk-config/config/cradio.keymap:109 (column 4): parse error: expected ';' or ',' -``` - -Note that the provided number for the column corresponds to the numbering after the preprocessor expansion and it will likely not match the column numbers in your keymap. - -#### "lacks #binding-cells" - -A `devicetree error` followed by an `empty_file.c` reference with `lacks #binding-cells` string indicates possible problems with improper parameters for specific bindings: - -``` -devicetree error: lacks #binding-cells -``` - -This error can be triggered by incorrect binding syntax such as `&kp BT_SEL 0` instead of `&bt BT_SEL 0`. - -#### "devicetree_generated.h[...] undeclared here" - -A `devicetree_generated.h` error that follows with an "undeclared here" string indicates a problem with key bindings, like behavior nodes (e.g. `&kp` or `&mt`) with incorrect number of parameters: - -``` -/__w/zmk-config/zmk-config/build/zephyr/include/generated/devicetree_generated.h:3756:145: error: 'DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label' undeclared here (not in a function); did you mean 'DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_16_PH'? -``` - -In this example, the error string `DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label` indicates a problem with the key binding in position `12` in the `symbol_layer` of the keymap. - -Key positions are numbered starting from `0` at the top left key on the keymap, incrementing horizontally, row by row. - -:::tip -A common mistake that leads to this error is to use [key press keycodes](keymaps/behaviors/key-press.md) without the leading `&kp` binding. That is, having entries such as `&kp A SPACE &kp B` that should have been `&kp A &kp SPACE &kp B`. -::: - -## Diagnosing Unexpected Build Results - -### Configuration Setting Issues - -If you want to ensure that the [configuration settings](../config/index.md#kconfig-files) you intend to change are changed in the build, you can check the final compiled Kconfig file that the firmware build process produces. -This file will display values for all set configurations and includes user, board, shield (if used in build), ZMK, and Zephyr-level settings. - -When using GitHub Actions to build your firmware, the contents of this file are displayed in the "`` Kconfig file" step in your build job: - -![](../assets/troubleshooting/building/kconfig-step.png) - -If you are building locally, this file can be found inside the build folder at `/zephyr/.config`. - -Additionally, the build command (in "West Build (``)" step in GitHub Actions) logs what configuration files were found and used in the build: - -``` -+ west build -s zmk/app -d /tmp/tmp.8cJefinXCb -b corneish_zen_left@2 -- -DZMK_CONFIG=/tmp/zmk-config/config -DZMK_EXTRA_MODULES=/__w/zmk-config/zmk-config -... --- ZMK Config Kconfig: /tmp/zmk-config/config/corneish_zen.conf -... -``` - -### Devicetree-related Issues - -If you want to ensure that your [devicetree files](../config/index.md#devicetree-files) are processed as you expect, you can check the final compiled devicetree file that the firmware build process produces. -This file will contain a single devicetree that combines all of user, board, and shield (if used in build) devicetree files. -Note that while it will include your keymap contents in it, [keycodes](../keymaps/list-of-keycodes.mdx) like `SPACE` will be displayed instead as hexadecimal numbers like `0x7002a`. - -When using GitHub Actions to build your firmware, the contents of this file are displayed in the "`` Devicetree file" step in your build job: - -![](../assets/troubleshooting/building/devicetree-step.png) - -If you are building locally, this file can be found inside the build folder at `/zephyr/zephyr.dts`. - -Additionally, the build command (in "West Build (``)" step in GitHub Actions) logs what devicetree files were found and used in the build: - -``` -+ west build -s zmk/app -d /tmp/tmp.8cJefinXCb -b corneish_zen_left@2 -- -DZMK_CONFIG=/tmp/zmk-config/config -DZMK_EXTRA_MODULES=/__w/zmk-config/zmk-config -... --- Found BOARD.dts: /tmp/zmk-config/zmk/app/boards/lowprokb/corneish_zen/corneish_zen_left.dts --- Found devicetree overlay: /tmp/zmk-config/zmk/app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0.overlay --- Found devicetree overlay: /tmp/zmk-config/config/corneish_zen.keymap -... -``` diff --git a/docs/docs/troubleshooting/connection-issues.mdx b/docs/docs/troubleshooting/connection-issues.mdx deleted file mode 100644 index 83cdd478..00000000 --- a/docs/docs/troubleshooting/connection-issues.mdx +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Connection Issues -sidebar_label: Connection Issues -description: Troubleshooting wireless connection issues of ZMK devices. ---- - -:::tip -[USB logging](../development/usb-logging.mdx) can be very helpful for diagnosing issues with ZMK. However, when connected to USB your ZMK device will output to USB by default. To troubleshoot wireless connection issues using logging, you will need to [change the preferred output endpoint](../keymaps/behaviors/outputs.md). -::: - -## Split Keyboard Parts Unable to Pair - -[Split keyboard](../features/split-keyboards.md) parts will automatically pair with one another, but there are some cases where this breaks and the pairing needs to be reset, for example: - -- Changing which part is the central. -- Replacing the controller for one of the parts. - -These issues can be resolved by flashing a settings reset firmware to both controllers to clear the stored pairing information. -See [persistent settings documentation](../config/settings.md) for more information. - -:::warning - -This procedure will erase all settings, such as Bluetooth profiles, output selection, RGB underglow color, etc. - -::: - -### Building a Reset Firmware - -If you are using GitHub Actions to build your firmware as described in the [user setup](../user-setup.mdx), find the `build.yaml` file in your `zmk-config` folder and add an additional settings reset build for the board used by your split keyboard. For example, assuming that the config repo is setup for nice!nano v2 with Corne, append the `settings_reset` shield to the `build.yaml` file as follows: - -```yml -include: - - board: nice_nano - shield: corne_left - - board: nice_nano - shield: corne_right - - board: nice_nano - shield: settings_reset -``` - -If you are building for an onboard controller keyboard that doesn't use a shield, add a new `shield:` field to its `board:` entry. - -Save the file, commit the changes and push them to GitHub. Download the new firmware zip file that is built by the latest GitHub Actions job. In it you will find an additional `settings_reset` firmware file. - -If you use a [local development environment](../development/local-toolchain/setup/index.md) to build firmware instead of GitHub Actions, pass the `-DSHIELD=settings_reset` argument when [building](../development/local-toolchain/build-flash.mdx), omitting all other `-DSHIELD` arguments. - -### Reset Split Keyboard Procedure - -Perform the following steps to reset **_all_** parts of your split keyboard: - -1. Put each part of the split keyboard into bootloader mode. -1. Flash one of the parts of the split with the settings reset firmware. -1. Repeat step 2 with the other parts of the split keyboard. -1. Flash the actual image for each part of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half). - -If the central and a peripheral has not paired after completing these steps, it can help to reset the central and the peripheral at around the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons, or turning both off then on with a power switch. - -Once this is done, you should remove/forget the keyboard on any paired host device and pair it again, since the pairing information for them will also have been cleared from the keyboard. - -:::info - -The settings reset firmware has Bluetooth disabled to prevent the two sides from automatically re-pairing until you are done resetting them both. You will not be able to pair your keyboard or see it in any Bluetooth device lists until you have flashed the normal firmware again. - -::: - -## Unable to Connect to Device - -### Bluetooth Profiles - -A very common issue is that the wrong Bluetooth profile has been selected, or the Bluetooth profile already has a saved connection. Learn more about Bluetooth profiles [here](../features/bluetooth.md), and learn how to adjust Bluetooth profiles via the `&bt` behavior [here](../keymaps/behaviors/bluetooth.md). - -### Hardware Issues - -For connectivity problems caused by hardware, please see [the appropriate section of the hardware issues page](hardware-issues.mdx#hardware-related-wireless-connectivity-issues). - -### Additional Bluetooth Options - -Some devices and operating systems may have additional restrictions that they require be met before allowing a bluetooth peripheral to pair with them. If your keyboard is visible to your host but you are having issues trouble connecting or no input is registered, this might be the cause. Some of ZMK's [experimental bluetooth settings](../config/bluetooth.md) may suffice to resolve the issue. In particular: - -- Disabling PHY 2Mbps ([`CONFIG_BT_CTLR_PHY_2M=n`](https://docs.zephyrproject.org/4.1.0/kconfig.html#CONFIG_BT_CTLR_PHY_2M)) helps to pair and connect for certain wireless chipset firmware versions, particularly on Windows (Realtek and Intel chips) and older Intel Macs with Broadcom chipsets. -- Enabling passkey entry ([`CONFIG_ZMK_BLE_PASSKEY_ENTRY=y`](../config/bluetooth.md)) helps for certain Windows computers (work-managed ones in particular). This may also manifest in not sending keystrokes. - -### Issues With Dual Boot Setups - -Since ZMK associates pairing/bond keys with hardware addresses of hosts, you cannot pair to two different operating systems in a dual boot system at the same time. -While you can find [documented workarounds](https://wiki.archlinux.org/title/bluetooth#Dual_boot_pairing) that involve copying pairing keys across operating systems and use both OS with a single profile, they can be fairly involved and should be followed with caution. - -### Mitigating a Faulty Oscillator - -Rarely, due to a manufacturing error, a device may have a faulty oscillator. This prevents it from functioning correctly wirelessly and can be difficult to diagnose. Some microcontrollers such as the `nRF52840` allow for the usage of an internal oscillator instead of an external one. This results in increased power draw but can be a solution if your device does indeed have a faulty oscillator. - -For the `nRF52840`, the flag to set to use the internal oscillator is: - -``` -CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y -``` - -Other microcontrollers may have similar configuration options [found in the Zephyr documentation](https://docs.zephyrproject.org/4.1.0/search.html?q=CONFIG_CLOCK_CONTROL&check_keywords=yes&area=default). Do note that not all microcontrollers allow for the use of an internal oscillator, though. - -## Issues While Connected - -### Unreliable/Weak Connection - -Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a [metal enclosure on the keyboard or host](hardware-issues.mdx#hardware-related-wireless-connectivity-issues), or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: - -```ini -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -``` - -For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/4.1.0/kconfig.html#CONFIG_BT_CTLR_TX_PWR) - -:::info -This setting can also improve the connection strength between the keyboard halves for split keyboards. -::: - -### Using Bluetooth Output With USB Power - -If you want to test Bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../keymaps/behaviors/outputs.md) to prefer sending keystrokes over Bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. - -### macOS Connected but Not Working - -If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding issue, macOS may report the keyboard as connected, but fail to actually work. If this occurs: - -1. Remove the keyboard from macOS using the Bluetooth control panel. -1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. -1. Try connecting again from macOS. - -### Windows Connected but Not Working - -Occasionally pairing the keyboard to a Windows device might result in a state where the keyboard is connected but does not send any key strokes. -If this occurs: - -1. Remove the keyboard from Windows using the Bluetooth settings. -1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the Windows device is active, by pressing the correct keys for your particular keymap. -1. Turn off Bluetooth from Windows settings, then turn it back on. -1. Pair the keyboard to the Windows device. - -If this doesn't help, try following the procedure above but replace step 3 with one of the following: - -- Restart the Windows device -- Open "Device Manager," turn on "Show hidden devices" from the "View" menu, then find and delete the keyboard under the "Bluetooth" item - -Some Windows devices may also require passkey entry, described under ["Unable to Connect to Device"](#unable-to-connect-to-device). diff --git a/docs/docs/troubleshooting/flashing-issues.md b/docs/docs/troubleshooting/flashing-issues.md deleted file mode 100644 index 699555d5..00000000 --- a/docs/docs/troubleshooting/flashing-issues.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Flashing Issues -sidebar_label: Flashing Issues -description: Troubleshooting issues when flashing ZMK firmware to devices. ---- - -## File Transfer Error - -Variations of the warnings shown below occur when flashing the `.uf2` onto the microcontroller. This is because the microcontroller resets itself before the OS receives confirmation that the file transfer is complete. Errors like this are normal and can generally be ignored. Verification of a functional board can be done by attempting to pair your newly flashed keyboard to your computer via Bluetooth or plugging in a USB cable if `ZMK_USB` is enabled in your Kconfig.defconfig. - -| ![Example Error Screen](../../docs/assets/troubleshooting/filetransfer/windows.png) | -| :---------------------------------------------------------------------------------: | -| An example of the file transfer error on Windows 10 | - -| ![Example Error Screen](../../docs/assets/troubleshooting/filetransfer/linux.png) | -| :-------------------------------------------------------------------------------: | -| An example of the file transfer error on Linux | - -| ![Example Error Screen](../../docs/assets/troubleshooting/filetransfer/mac.png) | -| :-----------------------------------------------------------------------------: | -| An example of the file transfer error on macOS | - -## macOS Ventura Error - -macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. Issue is fixed in macOS version 13.1. - -## macOS Sonoma Error - -macOS 14.x (Sonoma) Finder may report an "Error code -36" when copying `.uf2` files into microcontrollers. A similar "fcopyfile failed: Input/output error" will also be reported when copying is performed using Terminal command line. These errors can be ignored because they are reported when the bootloader disconnects automatically after the uf2 file is copied successfully. diff --git a/docs/docs/troubleshooting/hardware-issues.mdx b/docs/docs/troubleshooting/hardware-issues.mdx deleted file mode 100644 index fc234e7c..00000000 --- a/docs/docs/troubleshooting/hardware-issues.mdx +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: Hardware Issues -sidebar_label: Hardware Issues -description: Troubleshooting common hardware issues. ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -export const TesterTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -export const PinTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - - -); - -:::warning -This page contains _general and non-comprehensive advice_ for troubleshooting hardware issues. -ZMK is a _firmware_ project, not hardware. -Your first move should always be to reach out to the product's vendor or manufacturer. - -ZMK contributors cannot provide official support for hardware products they did not create, though the wider community may be able to help as a last resort. -::: - -## Electrical Net Connections - -Problems with your electrical net can manifest in a number of ways. The most common way is through one or more keyswitches not working, often an entire row or column. If this is the case, then (assuming you have access to it) you could use your keyboard's schematic to help identify which pins you need to check. - -### Identifying Issues - -There are three general approaches we recommend for identifying potential issues with the electrical net (pins & connections between components) of your device. - - - -ZMK's main repository currently has "tester" shields for [Pro Micro](https://cdn.sparkfun.com/assets/9/c/3/c/4/523a1765757b7f5c6e8b4567.png) and [Seeed Studio XIAO](https://files.seeedstudio.com/wiki/Seeeduino-XIAO/img/Seeeduino-XIAO-pinout-1.jpg) compatible boards. These will help you test your GPIO pins, but cannot be used to troubleshoot power pins. -#### Acquiring tester firmware - - - -Find the `build.yaml` file in your `zmk-config` folder and add an additional `tester_pro_micro` build for your board: - -```yml title="build.yaml" -include: - # ------------------- - # Your keyboards here - # ------------------- - - board: nice_nano # Replace with the Pro Micro-compatible board you're using - shield: tester_pro_micro -``` - -Save the file, commit the changes and push them to GitHub. Download the new firmware zip file build by the latest GitHub Actions job. In it you will find an additional `tester_pro_micro` UF2 image file. Flash this file to your board. - -The pinout of the pro micro interconnect is shown below: - -![Pro Micro Interconnect pinout](../assets/interconnects/pro_micro/pinout.png) - - - -Find the `build.yaml` file in your `zmk-config` folder and add an additional `tester_xiao` build for your board: - -```yml title="build.yaml" -include: - # ------------------- - # Your keyboards here - # ------------------- - - board: xiao_ble # Replace with the Xiao-compatible board you're using - shield: tester_xiao -``` - -Save the file, commit the changes and push them to GitHub. Download the new firmware zip file build by the latest GitHub Actions job. In it you will find an additional `tester_xiao` UF2 image file. Flash this file to your board. - -The pinout of the Seeed Studio XIAO interconnect is shown below: - -![Seeed Studio XIAO Interconnect pinout](../assets/interconnects/seeed_xiao/pinout.png) - - - -:::danger -Do not short a positive voltage pin (5V, RAW, 3V3, VCC, Battery+ aka B+) to ground or GPIO pins when using the tester. Doing so may permanently damage your device or even cause battery fires. -::: - -After flashing, open a text editor of your choice. Shorting a GPIO pin to ground (with e.g. a wire or tweezers, hold one end go ground and tap the pin with the other end) will now trigger the keyboard to send an informative message on which pins were triggered. - -- If one pin was triggered, then the pin is working fine. -- If two were triggered at once, then these pins are shorted together on your device. -- If no pin was triggered, try shorting a working pin to the pin you were trying to trigger to test if it is shorted to ground on your device. Otherwise, the pin is disconnected or broken. - -Once you have identified _which_ pins have issues, if any, it is recommended that you resort to visual inspection or trial and error with this shield/a multimeter to identify where the faulty connection is. - - - -A multimeter is the most reliable tool for troubleshooting hardware issues. If you're not familiar with how to use one or just need a refresher, consider reading through SparkFun's [*How to Use a Multimeter*](https://learn.sparkfun.com/tutorials/how-to-use-a-multimeter) tutorial. - -Here is a checklist for you to use while probing your device with the multimeter: - -- Are any of the pins shorted that shouldn't be shorted? -- Are all the diodes/components working and in the correct orientation? -- Does pressing a keyswitch close the affected circuit? -- When the device is plugged in, are all the pins at the expected voltage? (Typically ground or 3V3, which is where depends on the design and firmware) -- Are there any failed solder joints? - -Do note that as you need to have access to both sides of a connection, you cannot use a multimeter to troubleshoot pins which are underneath a chip. If the chip in question is your MCU, then you should use a tester shield instead. - -:::tip -To check a solder joint, it is best to probe the two points either side of it if you can. - -
-Example - -![A 3D PCB render with three circled solder joints.](../assets/troubleshooting/multimeter/schematic_probe_example.png) - -To check if the joint marked in red is faulty, measure [the forward voltage drop](https://www.fluke.com/en-us/learn/blog/digital-multimeters/how-to-test-diodes) of the diode, then take the same measurement between the joints circled in purple. If you get the same results as probing the diode directly, there is no problem with the joint. - -
-::: - -
- -Visual inspection is generally less reliable, but a lot easier than either of the other approaches. Generally, you want to be looking for solder bridges, exposed copper, broken PCB traces, lifted pads, and similar artifacts. - -For through-hole soldering specifically, the below infographic can be quite helpful. -![A helpful soldering infographic. Source: Sparkfun](https://cdn.sparkfun.com/assets/c/d/a/a/9/523b1189757b7fb36e8b456b.jpg) - -To confirm that something you've identified is indeed a problem, you'll want to make use of a multimeter or our tester shield. -:::tip -The above image was taken from [Sparkfun's guide on soldering through-hole components](https://learn.sparkfun.com/tutorials/how-to-solder-through-hole-soldering), which may be of use if you are less experienced with soldering. -::: - - -
- -### Resolving Issues - -Many issues can be resolved by reworking the affected solder joints (Look up a tutorial on how to do so for your component). Sometimes a pin ends up broken though, in which case you will need to "bodge" (solder) a wire from a spare GPIO pin to the connection in need of a working pin. - -Once you have done so, you will need to adjust the `kscan` of your keyboard slightly. The recommended approach to doing so is via your `zmk-config`: - -1. Search through the files defining your board/shield for the definition of the keyboard's `kscan`. This is typically a `.dts`, `.dtsi`, or an `.overlay` file. -2. Add a [phandle](https://docs.zephyrproject.org/latest/build/dts/phandles.html) to your `.keymap` pointing at your `kscan`, copying in the property of your `kscan` where the broken GPIO pin appears. Depending on your `kscan` driver this could be `input-gpios`, `row-gpios`, etc. If you are using a [split keyboard](../features/split-keyboards.md) and the issue is only affecting one part, you'll need to create separate keymap files for each part (`keyboard_left.keymap` and `keyboard_right.keymap`, for example), removing the shared one, and only edit the affected one. -3. Edit the node to replace the old GPIO key with the new. For example: - -```dts -&kscan0 { - input-gpios - = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; -}; -``` - -could have the pin `&pro_micro 6` (D6 in the [Pro Micro pinout](../hardware-integration/new-shield.mdx#shield-overlays)) replaced with `&gpio0 8` (P0.08 for nRF MCUs). - -```dts title=".keymap" -&kscan0 { - input-gpios - = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpio0 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; -}; -``` - -You can then build and flash using your config as usual. - -:::note -If the affected pin is not in your `kscan`, you will want to copy over and overwrite the node that it is in instead. -::: - -## Hardware-Related Wireless Connectivity Issues - -Under ideal conditions, a Bluetooth connection can be stable at even a 100 meter distance. However, there are many things which can affect the effective range of the antenna. In no particular order, the most common issues you will encounter are: - -- Solid material near an antenna or between the two communicating antennas (metal is _particularly_ bad) -- Interference from other nearby 2.4GHz connections -- The antenna makes use of malfunctioning hardware such as a [faulty oscillator](connection-issues.mdx#mitigating-a-faulty-oscillator) -- Not enough [power being provided to the antenna](connection-issues.mdx#unreliableweak-connection) -- A missing external antenna for motherboard-integrated or PCIe wireless adapters -- Interference from [USB 3 devices](https://www.bluetoothandusb3.com/the-explanation) -- Keyboard design flaws, including - - Using low frequency nRF52840 pins for high frequency purposes such as WS2812 RGB LEDs - - Improperly tuned antenna - -It is expected that your antenna will have some interference -- hence why most household devices using Bluetooth have an effective range of 5-10 meters. - -### Identifying & Resolving Issues - -Troubleshooting wireless connectivity issues caused by hardware can only really be done via trial and error. - -A good initial approach is: - -1. Make sure you have firmware flashed to your device that has BLE enabled, with at least one [Bluetooth profile](../features/bluetooth.md#profiles) free and no uncleared profiles previously paired to the host device. -2. Select the free profile. -3. Remove as many physical objects between your ZMK device and a host device as possible. -4. Switch off as many other nearby wireless devices as possible. -5. Hold the antenna as close to the host's antenna as possible, minimizing material near the ZMK antenna and between the two antennas. - -If your host cannot find the ZMK device under these conditions, then your antenna likely has a more significant problem and you should contact your vendor, manufacturer, or designer. - -If your host _can_ find the ZMK device, then you can narrow down the solution to one or more of the points above. The previously linked documentation sections may be of use for that. diff --git a/docs/docs/troubleshooting/index.mdx b/docs/docs/troubleshooting/index.mdx deleted file mode 100644 index 45a93191..00000000 --- a/docs/docs/troubleshooting/index.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Troubleshooting -sidebar_label: Troubleshooting ---- - -import DocCardList from "@theme/DocCardList"; - -The following pages provide suggestions for common errors that may occur while setting up or using devices running ZMK. If the information provided is insufficient to resolve an issue, feel free to seek out additional help from the [ZMK Discord](https://zmk.dev/community/discord/invite). - - diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md new file mode 100644 index 00000000..2532fe8b --- /dev/null +++ b/docs/docs/user-setup.md @@ -0,0 +1,229 @@ +--- +title: Installing ZMK +sidebar_label: Installing ZMK +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Unlike other keyboard firmwares, ZMK Firmware has been built from the ground up to allow users to manage +their own keyboard configurations, including keymaps, specific hardware details, etc. all outside of the +core ZMK Firmware source repository. + +In addition to this, most users will not need to install any complicated toolchains or tools to build ZMK. GitHub Actions is used instead to automatically build the user's configured firmware for them. + +## Summary + +The following steps can be taken to obtain an installable firmware image for your device, without the need +to install any compiler or specialized toolchain. This is possible by leveraging [GitHub Actions](https://github.com/features/actions) +to build your firmware for you in the cloud, which you can then download and flash to your device. + +Following the steps in this guide, you will: + +1. Create a new repository in GitHub that will contain your user config. +1. Download and run a small shell script that will automate most of the setup. The script will: + 1. Prompt you for which board (e.g. nice!nano) and shield (e.g. Lily58 or Kyria) you want to create a configuration for. + 1. Prompt you for your GitHub username and repo where the config should be pushed. + 1. Use `git` to clone a template repository that will be the basis for your user's config repository. + 1. Use the given board and shield to update the included GitHub Action to build for the correct hardware. + 1. Commit the initial version. + 1. (If info was provided) Push the local repo to your GitHub repository. +1. Add your own keymap overlay (`keymap.overlay`) file to the repository, and change your keymap. +1. Update the configuration flags for your user config, to enable/disable any ZMK features you would like to include. +1. Commit and push the updates to trigger a new GitHub Action run. + +## Prerequisites + +The remainder of this guide assumes the following prerequisites: + +1. You have an active, working [GitHub](https://github.com/) account. +1. You have installed and configured the [`git`](https://git-scm.com/) version control tool. +1. You have locally configured git to access your github account. If using [personal access tokens](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token), please be sure it was created with the "workflow" scope option selected. + +:::note +If you need to, a quick read of [Learn The Basics Of Git In Under 10 Minutes](https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/) will help you get started. +::: + +## GitHub Repo + +Before running the setup script, you will first need to create a new GitHub repository to host the config. + +1. Navigate to [https://github.com/new](https://github.com/new) +1. When prompted for the repo name, enter `zmk-config`. +1. The repository can be public or private +1. Do **not** check any of the options to initialize the repository with a README or other files. +1. Click "Create repository" + +## User Config Setup Script + +To start the setup process, run the following from your command line prompt: + + + + +```bash +bash -c "$(curl -fsSL https://zmk.dev/setup.sh)" +``` + + + + +```bash +bash -c "$(wget https://zmk.dev/setup.sh -O -)" '' --wget +``` + + + + +```powershell +powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://zmk.dev/setup.ps1'))" +``` + + + + +### Keyboard Selection + +When prompted, enter the number for the corresponding keyboard you would like to target: + +``` +Keyboard Selection: + 1) 2% Milk 19) Ferris 0.2 37) Nibble + 2) A. Dux 20) Fourier Rev. 1 38) nice!60 + 3) BAT43 21) Helix 39) Osprette + 4) BDN9 Rev2 22) Hummingbird 40) Pancake + 5) BFO-9000 23) Iris 41) Planck Rev6 + 6) Boardsource 3x4 Macropad 24) etc... +Pick an keyboard: +``` + +:::note For a keyboard not in the included list: +If you are building firmware for a new keyboard that is not included in the built-in +list of keyboards, you can choose any keyboard from the list that is similar to yours (e.g. in terms of unibody/split and [onboard controller](hardware.mdx#onboard)/[composite](hardware.mdx#composite)) to generate the repository, +and edit / add necessary files. You can follow the [new shield guide](development/new-shield.md) if you are adding support for a composite keyboard. +::: + +### MCU Board Selection + +If the keyboard selected uses an onboard controller you will skip this step. +When prompted, enter the number for the corresponding MCU board you would like to target: + +``` +MCU Board Selection: +1) BlueMicro840 v1 5) nRF52840 M.2 Module 9) QMK Proton-C +2) Mikoto 5.20 6) nRFMicro 1.1 (flipped) 10) Seeeduino XIAO +3) nice!nano v1 7) nRFMicro 1.1/1.2 11) Seeeduino XIAO BLE +4) nice!nano v2 8) nRFMicro 1.3/1.4 12) Quit +Pick an MCU board: +``` + +### Keymap Customization + +At the next prompt, you have an opportunity to decide if you want the stock keymap file copied in +for further customization: + +``` +Copy in the stock keymap for customization? [Yn]: +``` + +Hit `Enter` or type `yes`/`y` to accept this. If you want to keep the stock keymap, or write a keymap +from scratch, type in `no`/`n`. + +### GitHub Details + +In order to have your new configuration automatically pushed, and then built using GitHub Actions, enter +some information about your particular GitHub info: + +``` +GitHub Username (leave empty to skip GitHub repo creation): petejohanson +GitHub Repo Name: zmk-config +GitHub Repo: https://github.com/petejohanson/zmk-config.git +``` + +Only the GitHub username is required; if you are happy with the defaults offered in the square brackets, you can simply hit `Enter`. + +:::note +If you are using SSH keys for git push, change GitHub Repo field to the SSH scheme, e.g. `git@github.com:petejohanson/zmk-config.git`. +::: + +### Confirming Selections + +The setup script will confirm all of your selections one last time, before performing the setup: + +``` +Preparing a user config for: +* MCU Board: nice_nano +* Shield: kyria +* GitHub Repo To Push (please create this in GH first!): https://github.com/petejohanson/zmk-config.git + +Continue? [Yn]: +``` + +After hitting `Enter` or typing `y`, the script will create an initial config in a directory named after the repo name, +update the GitHub Action YAML file, commit the initial version, and then push to your repo. + +:::info + +If you used the default GitHub repo URL using the `https://` scheme, you may be prompted for your username + password in order to +push the initial commit. + +::: + +## Installing The Firmware + +### Download The Archive + +Once the setup script is complete and the new user config repository has been pushed, GitHub will automatically run the action +to build your keyboard firmware files. You can view the actions by clicking on the "Actions" tab on your GitHub repository. + +![](./assets/user-setup/github-actions-link.png) + +Once you have loaded the Actions tab, select the top build from the list. Once you load it, the right side panel will include +a link to download the `firmware` upload: + +![](./assets/user-setup/firmware-archive.png) + +Once downloaded, extract the zip and you can verify it should contain one or more `uf2` files, which will be copied to +your keyboard. + +### Flashing UF2 Files + +To flash the firmware, first put your board into bootloader mode by double clicking the reset button (either on the MCU board itself, +or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. + +Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass +storage device. Once the flash is complete, the controller should unmount the USB storage, automatically restart and load your newly +flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to +connect to it wirelessly. + +:::caution Split keyboards + +For split keyboards, only the central half (typically the left side) will send keyboard outputs over USB or advertise to other devices +over bluetooth. Peripheral half will only send keystrokes to the central once they are paired and connected. For this reason it is +recommended to test the left half of a split keyboard first. + +::: + +## Wirelessly Connecting Your Keyboard + +ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. + +ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. If you don't make use of the mentioned behaviors you will have issues pairing your keyboard to other devices. + +### Connecting Split Keyboard Halves + +For split keyboards, after flashing each half individually you can connect them together by resetting them at the same time. Within a few seconds of resetting, both halves should automatically connect to each other. + +:::note + +If you have issues connecting the halves, make sure that both sides are getting powered properly through USB or batteries, then follow the +[recommended troubleshooting procedure](troubleshooting.md#split-keyboard-halves-unable-to-pair). This is typically necessary if you +swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa. + +::: diff --git a/docs/docs/user-setup.mdx b/docs/docs/user-setup.mdx deleted file mode 100644 index ba96b489..00000000 --- a/docs/docs/user-setup.mdx +++ /dev/null @@ -1,402 +0,0 @@ ---- -title: Installing ZMK -sidebar_label: Installing ZMK ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -export const OsTabs = (props) => ( - - {/* eslint-disable-next-line */} - {props.children} - -); - -Unlike other keyboard firmwares, ZMK Firmware has been built from the ground up to allow users to manage -their own keyboard configurations, including keymaps, specific hardware details, etc. all outside of the -core ZMK Firmware source repository. - -In addition to this, most users will not need to install any complicated toolchains or tools to build ZMK. GitHub Actions is used instead to automatically build the user's configured firmware for them. - -:::info[Something Isn't Working?] - -If you run into any issues when following these instructions, please [file an issue on GitHub](https://github.com/zmkfirmware/zmk-cli/issues) or [join us on Discord](https://zmk.dev/community/discord/invite) and let us know what went wrong so we can improve ZMK CLI and this guide. - -::: - -## Summary - -The following steps can be taken to obtain an installable firmware image for your device, without the need -to install any compiler or specialized toolchain. This is possible by leveraging [GitHub Actions](https://github.com/features/actions) -to build your firmware for you in the cloud, which you can then download and flash to your device. - -Following the steps in this guide, you will: - -1. Install ZMK CLI, a command line tool for setting up ZMK. -1. Create a new repository in GitHub that will contain your user config. -1. Use ZMK CLI to clone the repo to your computer so you can edit the files. -1. Select a keyboard to use and update the `build.yaml` file so GitHub will build firmware for that keyboard. -1. Add your own `.keymap` and `.conf` files to customize your keymap and enable/disable other ZMK features. -1. Commit and push the updates to trigger a new GitHub Action run to build the firmware. - -## Prerequisites - -You will need to install a few tools before you can get started. - -Many instructions in this guide use commands that need to be run in a terminal application. On most operating systems, the program is simply named "Terminal". - -On Windows, get [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) from the Microsoft Store if it isn't already installed. - -### Install Git - -Open a terminal and run the following command. If Git is already installed, it will print out a version number. - -```sh -git --version -``` - -If it prints an error instead, install Git from https://git-scm.com/install/. Close and reopen your terminal and run the `git --version` command again to check if it installed correctly. - -:::note -This guide will have you run several more `git` commands later. If you aren't familiar with Git, check out [Learn The Basics Of Git In Under 10 Minutes](https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/) to help you get started. -::: - -### Set Up a GitHub Account - -You will need a GitHub account. [Create an account](https://github.com/signup) if you don't have one yet. - -Next, you will need to authenticate your local Git installation with GitHub. There are several ways to do this, but the following two are the simplest. Pick whichever seems easiest to you: - -#### Authenticate with GitHub CLI - -Install [GitHub CLI](https://cli.github.com/) and run the following command in a terminal. Follow the instructions it gives you, and it will open GitHub in a web browser for you to log in. - -```sh -gh auth login -``` - -#### Authenticate with a Personal Access Token - -Create a [personal access token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) and make sure to create it with the "workflow" scope option selected. - -When running `git` commands later in this guide, Git will ask for your username and password. Enter your GitHub username, but **do not enter your password**. Instead, paste your access token where it asks for the password. You won't be able to see the token again after you create it, so keep the page open until you've done this and/or copy it to a secure location. If you lose the token, simply create another one. - -### Install uv - -[uv](https://github.com/astral-sh/uv) is a Python package manager which can install ZMK CLI and a supported version of Python if necessary. The instructions for installing uv differ depending on your operating system. Select the tab for your OS below. - -If installation fails, see [https://docs.astral.sh/uv/getting-started/installation/](https://docs.astral.sh/uv/getting-started/installation/) for more detailed instructions and alternative installation methods. - -
- Other package managers - -ZMK CLI can also be installed with other Python package managers such as [pipx](https://pipx.pypa.io/stable/). If you have a different package manager you prefer, install the ["zmk" package](https://pypi.org/project/zmk/) and skip to [Config Repo Setup](#config-repo-setup). - -
- - - - -Open a terminal and run the following command: - -```sh -curl -LsSf https://astral.sh/uv/install.sh | sh -``` - -If you get an error like "curl: command not found", try using wget: - -```sh -wget -qO- https://astral.sh/uv/install.sh | sh -``` - -If that doesn't work either, install [curl](https://curl.se/) and try again. For example, on Ubuntu and other Debian-based Linux distributions, run: - -```sh -sudo apt update -sudo apt install curl -curl -LsSf https://astral.sh/uv/install.sh | sh -``` - -If the install script prints the following, close and reopen your terminal. - -``` -To add $HOME/.local/bin to your PATH, either restart your shell or run: - - source $HOME/.local/bin/env (sh, bash, zsh) - source $HOME/.local/bin/env.fish (fish) -``` - - - - -Open a terminal and run the following command: - -```sh -winget install --id astral-sh.uv -e --source winget -``` - -If this prints the text that is highlighted below, close and reopen your terminal. - -``` -// highlight-next-line -Path environment variable modified; restart your shell to use the new value. -Command line alias added: "uvx" -Command line alias added: "uv" -Command line alias added: "uvm" -Successfully installed -``` - - - - -Open a terminal and run the following command: - -```sh -curl -LsSf https://astral.sh/uv/install.sh | sh -``` - -If the install script prints the following, close and reopen your terminal. - -``` -To add $HOME/.local/bin to your PATH, either restart your shell or run: - - source $HOME/.local/bin/env (sh, bash, zsh) - source $HOME/.local/bin/env.fish (fish) -``` - - - - -### Install ZMK CLI - -Finally, we'll install ZMK CLI. Open a terminal and run: - -```sh -uv tool install zmk -``` - -
- I get an "executable already exists" error - -Earlier versions of this guide used pipx. If you get an error like this... - -``` -error: Executable already exists: zmk.exe (use `--force` to overwrite) -``` - -...run the following commands to remove the pipx version and reinstall it with uv: - -```sh -python3 -m pipx uninstall zmk -uv tool install zmk -``` - -
- -This will likely print a message like ``warning: `/home/username/.local/bin` is not on your PATH``. To fix that, run: - -```sh -uv tool update-shell -``` - -Close and reopen your terminal to apply the changes, then run the following command. It should print a version number if everything installed correctly. - -```sh -zmk --version -``` - -## Config Repo Setup - -Now that ZMK CLI is installed, you can use it to initialize a repository. - -The `zmk init` command walks you through creating a GitHub repository, then clones it to your computer so you can edit it. - -
- I already cloned my repo - -If you have already created a repo and cloned it to your computer, for example with the old ZMK setup script, you do not need to do this. Instead, run the following command to point ZMK CLI to your repo, replacing `/path/to/zmk-config` with the actual path to the repo folder. - -```sh -zmk config user.home "/path/to/zmk-config" -``` - -Then, [skip to the next step](#add-a-keyboard). - -
- -Open a terminal and use the `cd` command to move to a folder where you'd like to place the ZMK files (it will create a new folder in this location), then run `zmk init`. For example: - -```sh -cd ~/Documents -zmk init -``` - -Follow the instructions it gives you. If you already have a ZMK config repo on GitHub, select "Clone an existing repo" and enter its URL when prompted, for example: - -``` -Repository URL: https://github.com/myusername/zmk-config -``` - -Otherwise, select "Create a new ZMK config repo", and follow the instructions to create a new repo. - -After this finishes, you will have a copy of the repo stored on your computer. All `zmk` commands will run on this repo (unless the working directory is inside a different repo). If you ever forget where the repo is located, you can run `zmk cd` to find it. - -### Add a Keyboard - -To start building firmware for a new keyboard, run the following command: - -```sh -zmk keyboard add -``` - -Follow the instructions to select a keyboard (and controller board if necessary). It will add the keyboard to your repo's `build.yaml` file so GitHub knows to build it, and it will create `config/.keymap` and `config/.conf` files for you to edit. - -
- My keyboard isn't listed - -If ZMK doesn't support your keyboard by default, you have two options: - -**Add a Module** - -ZMK can be extended with [modules](features/modules.mdx) to add new keyboards. If someone has already created a module for your keyboard, run the following command to add it, replacing `` with the URL of the Git repository for the module: - -```sh -zmk module add -``` - -For example, `zmk module add https://github.com/cannonkeys/zmk-cannonkeys-keyboards` would add support for CannonKeys keyboards. - -Run `zmk keyboard add` again, and the new keyboards should appear in the list. - -**Create It Yourself** - -If nobody has created a module for your keyboard yet, or if it is your own custom design, you will need to set it up yourself. Your config repo is already set up as a module, so you can define new keyboards there. See ZMK's [new keyboard shield guide](hardware-integration/new-shield.mdx) for more information. - -ZMK CLI can also help generate some of the boilerplate for defining a new keyboard: - -```sh -zmk keyboard new -``` - -
- -### Edit Your Keymap and Configuration - -See the [customizing ZMK](customization.md) documentation for instructions on editing your keymap and configuring ZMK settings. - -As a shortcut to open your keymap in a text editor, you can run the following command, replacing `` with the ID of the keyboard you chose earlier: - -```sh -zmk code -``` - -If you have an editor like [VS Code](https://code.visualstudio.com/) that can open a folder, you can also run the command without a keyboard ID to open your config repo directly: - -```sh -zmk code -``` - -The first time you run this command, it will try to identify which text editors you have installed and ask you which one to use. If you want to change this later, change the [`core.editor`](zmk-cli.mdx#coreeditor) setting. - -### Commit and Push to GitHub - -After you've changed your keymap to your liking, you need to commit and push your changes. - -Run the following commands to go to the repo directory, mark all your changed files to be added to the commit, create the commit, and push it to GitHub. - -```sh -zmk cd -git add . -git commit -m "Initial commit" -git push -``` - -The text after `-m` is the "commit message", which gives a name to the commit. This is your first commit, so we're calling it "initial commit" here, but you can name it whatever you like. When you make more commits later, it's a good idea to use the commit message to write a description of the changes you made. - -:::warning - -If the `git push` command asks you for a username and password, enter your GitHub username, but **do not enter your password**. Instead, paste your access token where it asks for the password. (Go back to the [GitHub account setup instructions](#set-up-a-github-account) if you need to create a token.) - -::: - -## Install the Firmware - -### Download the Archive - -Once you push a commit, GitHub will automatically run the action to build your keyboard firmware files. Run the following command to open the GitHub Actions page in your browser: - -```sh -zmk download -``` - -Or, you can manually open your GitHub repository in your browser and click the "Actions" tab at the top. - -![](./assets/user-setup/github-actions-link.png) - -Once you have loaded the Actions tab, select the top build from the list. If the build was successful, the right side panel will include -a link to download the `firmware` upload: - -![](./assets/user-setup/firmware-archive.png) - -:::info[Fixing build errors] - -If you see a red X instead of a link to download the firmware, the build failed, likely due to an error in your repo. See the [troubleshooting page](./troubleshooting/building-issues.md) for help fixing the error. After making changes, [commit and push](#commit-and-push-to-github) again and GitHub will start a new build. - -::: - -Once downloaded, extract the zip and you can verify it should contain one or more `.uf2` or `.hex` files, which contain the firmware you need to write to your keyboard. - -### Flash UF2 Files - -If your firmware contains a `.uf2` file, then you flash the new firmware by putting the keyboard into bootloader mode and copying the file directly to it in file explorer. - -First, put your keyboard into bootloader mode by double clicking the reset button (either on the MCU board itself, or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. - -Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should unmount the USB storage, automatically restart and load your newly -flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to -connect to it wirelessly. - -:::warning[Split keyboards] - -For split keyboards, only the central half (typically the left side) will send keyboard outputs over USB or advertise to other devices -over bluetooth. Peripheral half will only send keystrokes to the central once they are paired and connected. For this reason it is -recommended to test the left half of a split keyboard first. -Please refer to [split keyboards documentation](features/split-keyboards.md) for more information. - -::: - -### Flash Hex Files - -If your firmware contains a `.hex` file, then you will use DFU to flash the firmware. [QMK Toolbox](https://qmk.fm/toolbox) is an easy-to-use tool with support for DFU flashing. - -Open QMK Toolbox, click the "Open" button, and select the correct `.hex` file (e.g. left or right if working on a split). Consult the documentation for your keyboard to figure out how to enter bootloader or DFU mode (often this is done by pressing a pair of buttons on the keyboard or by holding a specific key as you plug in the USB cable), and once QMK Toolbox detects the keyboard, click "Flash" to flash the firmware. - -## Wirelessly Connecting Your Keyboard - -ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. - -ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](keymaps/behaviors/bluetooth.md) section for detailed explanations on how to use them. If you don't make use of the mentioned behaviors you will have issues pairing your keyboard to other devices. - -### Connecting Split Keyboard Halves - -For split keyboards, after flashing each half individually you can connect them together by resetting them at the same time. Within a few seconds of resetting, both halves should automatically connect to each other. -Please refer to [the pairing section in the split keyboards documentation](features/split-keyboards.md#pairing-for-wireless-split-keyboards) for more information. - -:::note - -If you have issues connecting the halves, make sure that both sides are getting powered properly through USB or batteries, then follow the -[recommended troubleshooting procedure](troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair). This is typically necessary if you -swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa. - -::: diff --git a/docs/docs/zmk-cli.mdx b/docs/docs/zmk-cli.mdx deleted file mode 100644 index 1e278d39..00000000 --- a/docs/docs/zmk-cli.mdx +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: ZMK CLI -sidebar_label: ZMK CLI ---- - -ZMK CLI is a command line tool which helps with setting up a ZMK config repo and automates some common tasks such as adding new keyboards to your repository. - -See the [ZMK installation guide](user-setup.mdx#prerequisites) for instructions on installing ZMK CLI. - -The instructions below contain commands that need to be run in a terminal program. On most operating systems, the program is simply named "Terminal". - -On Windows, get [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) from the Microsoft Store if it isn't already installed. - -## Updating ZMK CLI - -To update to the latest version of ZMK, run the following command in a terminal: - -```sh -uv tool upgrade zmk -``` - -## Using ZMK CLI - -All ZMK CLI commands start with `zmk`. Run `zmk --help` for general usage instructions. For help with a specific subcommand, add `--help` after the subcommand, e.g. `zmk init --help`. - -### Initialize a Repository - -The `zmk init` command walks you through creating a GitHub repository, then clones it to your computer so you can edit it. See the [ZMK installation guide](user-setup.mdx#config-repo-setup) for more details on this command. - -### Keyboard Management - -#### Add a keyboard - -To start building firmware for a new keyboard, run `zmk keyboard add`. Follow the instructions to select a keyboard (and controller board if necessary), and it will add it to the list of firmware to build and copy a default keymap into your repo. - -You can then run `zmk code ` to open the keymap in a text editor. - -This command reads from a local copy of ZMK to determine the supported keyboards. If the keyboard you want to use isn't listed, try running `zmk update` to update the local copy to the latest version of ZMK. If it still isn't listed, you may be able to find a [Zephyr module](#module-management) that provides it, or you may need to [create it yourself](#create-a-new-keyboard). - -#### Remove a keyboard - -To remove a keyboard from the build, run `zmk keyboard remove` and select the item to remove. For a split keyboard, you will need to run this twice and remove the left and right sides. - -This simply removes a keyboard from the `build.yaml` file. It does not delete any `.keymap` or `.conf` files. - -#### List supported keyboards - -Run `zmk keyboard list` to print a list of supported keyboard hardware. - -#### Create a new keyboard - -If ZMK doesn't support your keyboard yet, you can run `zmk keyboard new` to create a new keyboard from a template. - -This won't walk you through all of the details of adding support for a new keyboard, but it will generate most of the boilerplate for you. See the [New Keyboard Shield](hardware-integration/new-shield.mdx) guide for how to finish writing the keyboard files. - -### Module Management - -[Modules](features/modules.mdx) can add support for new keyboards, behaviors, and other features to ZMK. Use the `zmk module` command to install modules into your repo: - -```sh -zmk module add # Add a module -zmk module add # Add a module given the URL of the repo -zmk module remove # Remove an installed module -zmk module list # List the installed modules -zmk update # Update the local copies of ZMK and modules to their latest versions -``` - -:::note - -ZMK CLI stores a copy of ZMK and any modules in a `.zmk` folder so it can read board and shield information from them. This folder is only used by ZMK CLI and is not necessary for building firmware, therefore ZMK CLI will automatically add it to your repo's `.gitignore` file. - -::: - -### Edit Keymap and Config Files - -The `zmk code` command will open ZMK files in a text editor: - -```sh -zmk code # Open the repo directory in an editor -zmk code # Open .keymap in an editor -zmk code --conf # Open .conf in an editor -zmk code --build # Open build.yaml in an editor -``` - -The first time you run this command, it will ask you which editor you want to use. If you want to change this choice later or use an editor that wasn't listed, see the [core.editor](#coreeditor) and [code.explorer](#coreexplorer) settings. - -### Push Changes to GitHub - -Run `zmk cd` to go to the repo directory. From here, you can run `git` commands manage the repo. - -For example, after adding a keyboard to your repo and editing its keymap, you can run the following commands to push your changes to GitHub and trigger a firmware build: - -```sh -git add . -git commit -git push -``` - -You will need to [authenticate with GitHub](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-authentication-to-github#authenticating-with-the-command-line) before the `git push` command will work. The easiest way to do this is to install the [GitHub CLI](https://cli.github.com/) and run - -```sh -gh auth login -``` - -but you can also use a [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens). If using an access token, make sure you create it with the "workflow" scope option selected. - -### Download Firmware from GitHub - -After pushing changes, GitHub will automatically build the firmware for you. Run `zmk download` (or `zmk dl` for short) to open the GitHub actions page in your browser. - -From this page, you can click on a build (the latest is at the top) to view its status. If the build succeeded, you can download the firmware from the "Artifacts" section at the bottom of the build summary page. - -### Configuration - -The `zmk config` command manages settings for ZMK CLI: - -```sh -zmk config # List all settings -zmk config # Print the value of the setting -zmk config # Set to -zmk config --unset # Remove the setting -``` - -By default, these settings are stored in a file in your user profile directory. Run `zmk config --path` to get the location of this file. You can change where the settings file is stored by setting a `ZMK_CLI_CONFIG` environment variable to the new path to use, or by adding a `--config-file=` argument when running `zmk`. - -Other commands use the following settings: - -#### user.home - -The path to the repository to use whenever `zmk` is run and the working directory is not inside a ZMK config repository. - -For example, to point ZMK CLI to an existing repo at `~/Documents/zmk-config`, run: - -```sh -zmk config user.home ~/Documents/zmk-config -``` - -#### core.editor - -Command line for a text editor to use with the `zmk code` command. - -For example, so set Visual Studio Code as the editor and make it always open a new window, run: - -```sh -zmk config core.editor "code --new-window" -``` - -#### core.explorer - -Command line for a file explorer to use with the `zmk code` command when opening a directory. - -If this setting is not set, the `core.editor` tool will be run instead. Set this setting when using a text editor that does not support opening directories. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 535e3e49..20e6a75c 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,34 +1,6 @@ -const { execSync } = require("child_process"); const path = require("path"); const theme = require("./src/theme/prism/themes/github"); const darkTheme = require("./src/theme/prism/themes/github-dark-dimmed"); -const { releaseVersions } = require("./zmk-release-versions.json"); - -const gitBranch = - process.env.BRANCH || - execSync("git branch --show-current", { encoding: "utf-8" }).trim(); -const isDevelopmentVersion = - gitBranch === "main" || !/^v\d+\.\d+-branch$/.test(gitBranch); -const versionNavbarItems = [ - { - label: "Pre-Release", - description: "Current active development branch (main)", - href: "https://zmk.dev/docs/", - }, - ...releaseVersions.map((r) => ({ - label: "v" + r, - description: "Stable release v" + r, - href: `https://v${r.replaceAll(".", "-")}-branch.zmk.dev/docs/`, - })), -]; - -const versionDropDownLabel = ( - isDevelopmentVersion - ? versionNavbarItems[0] - : versionNavbarItems.find((item) => { - return item.label === gitBranch.replace("-branch", ""); - }) -).label; module.exports = { title: "ZMK Firmware", @@ -39,16 +11,12 @@ module.exports = { trailingSlash: "false", organizationName: "zmkfirmware", // Usually your GitHub org/user name. projectName: "zmk", // Usually your repo name. - customFields: { - isDevelopmentVersion, - releaseVersions, - }, plugins: [ - "@docusaurus/theme-mermaid", path.resolve(__dirname, "src/docusaurus-tree-sitter-plugin"), path.resolve(__dirname, "src/hardware-metadata-collection-plugin"), path.resolve(__dirname, "src/hardware-metadata-static-plugin"), path.resolve(__dirname, "src/hardware-schema-typescript-plugin"), + path.resolve(__dirname, "src/setup-script-generation-plugin"), ], themeConfig: { colorMode: { @@ -63,7 +31,6 @@ module.exports = { "linker-script", "log", "powershell", - "diff", ], theme, darkTheme, @@ -82,39 +49,15 @@ module.exports = { label: "Docs", position: "left", }, - isDevelopmentVersion - ? { to: "blog", label: "Blog", position: "left" } - : { href: "https://zmk.dev/blog", label: "Blog", position: "left" }, + { to: "blog", label: "Blog", position: "left" }, { - type: "dropdown", - label: "Tools", + to: "power-profiler", + label: "Power Profiler", position: "left", - items: [ - { - to: "power-profiler", - label: "Power Profiler", - }, - { - to: "keymap-upgrader", - label: "Keymap Upgrader", - }, - ], - }, - { - type: "dropdown", - label: versionDropDownLabel, - position: "right", - items: versionNavbarItems, - }, - { - href: "https://zmk.studio/", - label: "ZMK Studio", - position: "right", }, { href: "https://github.com/zmkfirmware/zmk", - "aria-label": "ZMK GitHub Repository", - className: "header-github-link", + label: "GitHub", position: "right", }, ], @@ -131,7 +74,7 @@ module.exports = { }, { label: "Development", - to: "docs/development/contributing/clean-room", + to: "docs/development/setup/", }, ], }, @@ -149,8 +92,8 @@ module.exports = { "/community/discord/invite", }, { - label: "Mastodon", - href: "https://fosstodon.org/@zmk", + label: "Twitter", + href: "https://twitter.com/ZMKFirmware", }, ], }, @@ -214,13 +157,4 @@ module.exports = { }, ], ], - markdown: { - format: "detect", - mermaid: true, - mdx1Compat: { - comments: false, - admonitions: false, - headingIds: true, - }, - }, }; diff --git a/docs/eslint.config.mjs b/docs/eslint.config.mjs deleted file mode 100644 index c4497075..00000000 --- a/docs/eslint.config.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import { defineConfig, globalIgnores } from "eslint/config"; -import globals from "globals"; -import jseslint from "@eslint/js"; -import tseslint from "typescript-eslint"; -import pluginReact from "eslint-plugin-react"; -import * as mdx from "eslint-plugin-mdx"; - -export default defineConfig([ - globalIgnores([ - ".cache-loader/", - ".docusaurus/", - "build/", - "src/hardware-metadata.d.ts", - ]), - { files: ["**/*.{js,jsx,ts,tsx,md,mdx}"] }, - jseslint.configs.recommended, - tseslint.configs.strict, - mdx.flat, - pluginReact.configs.flat.recommended, - pluginReact.configs.flat["jsx-runtime"], - { - languageOptions: { - globals: { ...globals.browser, ...globals.commonjs, ...globals.node }, - }, - rules: { - "react/no-unescaped-entities": "off", - "@typescript-eslint/no-require-imports": "off", - }, - settings: { - react: { - version: "detect", - }, - }, - }, -]); diff --git a/docs/netlify-ignore-command.sh b/docs/netlify-ignore-command.sh deleted file mode 100755 index aaf44022..00000000 --- a/docs/netlify-ignore-command.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# We deploy main, version branches and deploy previews only -if echo $HEAD | grep -E '^(main|v[[:digit:]]+\.([[:digit:]])+-branch)$' || echo $CONTEXT | grep '^deploy-preview$' -then - echo "Head '$HEAD' matches a deployed branch, or context is deploy preview, checking for git changes." - git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../app/boards/ -else - echo "Head '$HEAD' does not match a deployed branch and is not a deploy preview" - exit 0 -fi \ No newline at end of file diff --git a/docs/netlify.toml b/docs/netlify.toml index b656b9e8..87462006 100644 --- a/docs/netlify.toml +++ b/docs/netlify.toml @@ -1,5 +1,5 @@ [build] - ignore = "bash ./netlify-ignore-command.sh" + ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../app/boards/" [[redirects]] from = "/community/discord/invite" diff --git a/docs/package-lock.json b/docs/package-lock.json index f046e505..6e597372 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -1,363 +1,246 @@ { "name": "docs", "version": "0.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.10.1", - "@docusaurus/preset-classic": "^3.10.1", - "@docusaurus/theme-mermaid": "^3.10.1", - "@fortawesome/fontawesome-svg-core": "^6.7.1", - "@fortawesome/free-solid-svg-icons": "^6.7.1", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", + "@fortawesome/fontawesome-svg-core": "^6.4.2", + "@fortawesome/free-solid-svg-icons": "^6.4.0", "@fortawesome/react-fontawesome": "^0.2.0", - "@mdx-js/react": "^3.1.0", + "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", - "js-yaml": "^4.1.1", - "react": "^18.0.0", + "js-yaml": "^4.1.0", + "react": "^17.0.2", "react-async": "^10.0.1", "react-copy-to-clipboard": "^5.0.3", - "react-dom": "^18.0.0", - "react-toastify": "^10.0.6", - "tree-sitter-devicetree": "^0.12.1", - "web-tree-sitter": "^0.24.3" + "react-dom": "^17.0.2", + "react-toastify": "^7.0.4", + "web-tree-sitter": "^0.20.8" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", - "@eslint/js": "^9.39.2", - "@types/glob": "^8.1.0", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^18.3.12", + "@types/react": "^17.0.58", "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", - "eslint": "^9.39.2", - "eslint-plugin-mdx": "^3.6.2", - "eslint-plugin-react": "^7.37.5", - "globals": "^17.6.0", - "json-schema-to-typescript": "^15.0.3", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-mdx": "^2.0.5", + "eslint-plugin-react": "^7.33.2", + "json-schema-to-typescript": "^13.1.1", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^3.7.4", - "string-replace-loader": "^3.3.0", - "typescript": "^5.9.3", - "typescript-eslint": "^8.52.0", - "webpack": "^5.104.1" - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.1.tgz", - "integrity": "sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "prettier": "^2.8.7", + "string-replace-loader": "^3.1.0", + "typescript": "^5.0.4", + "webpack": "^5.86.0" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", - "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", - "license": "MIT", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", - "@algolia/autocomplete-shared": "1.19.8" + "@algolia/autocomplete-shared": "1.7.4" } }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", - "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", - "license": "MIT", + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "dependencies": { - "@algolia/autocomplete-shared": "1.19.8" + "@algolia/autocomplete-shared": "1.7.4" }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.8", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", - "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", - "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@algolia/client-abtesting": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.1.tgz", - "integrity": "sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ==", - "license": "MIT", + "node_modules/@algolia/autocomplete-shared": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/cache-common": "4.17.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", + "dependencies": { + "@algolia/cache-common": "4.17.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", + "dependencies": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.1.tgz", - "integrity": "sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-common": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.1.tgz", - "integrity": "sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.1.tgz", - "integrity": "sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.1.tgz", - "integrity": "sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.1.tgz", - "integrity": "sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-search": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.1.tgz", - "integrity": "sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/events": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, - "node_modules/@algolia/ingestion": { - "version": "1.52.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.1.tgz", - "integrity": "sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" - } + "node_modules/@algolia/logger-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, - "node_modules/@algolia/monitoring": { - "version": "1.52.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.1.tgz", - "integrity": "sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ==", - "license": "MIT", + "node_modules/@algolia/logger-console": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.1.tgz", - "integrity": "sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/logger-common": "4.17.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.1.tgz", - "integrity": "sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "dependencies": { - "@algolia/client-common": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/requester-common": "4.17.0" } }, - "node_modules/@algolia/requester-fetch": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.1.tgz", - "integrity": "sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" - } + "node_modules/@algolia/requester-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "node_modules/@algolia/requester-node-http": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.1.tgz", - "integrity": "sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "dependencies": { - "@algolia/client-common": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/requester-common": "4.17.0" } }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", + "node_modules/@algolia/transporter": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", - "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", - "dev": true, - "license": "MIT", + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "json5": "^2.2.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -371,77 +254,96 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/types": "^7.19.4", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dependencies": { - "@babel/types": "^7.27.3" + "@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/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "license": "MIT", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -450,24 +352,13 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" }, "engines": { "node": ">=6.9.0" @@ -476,113 +367,140 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -592,97 +510,185 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "license": "MIT", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "dependencies": { + "@babel/types": "^7.19.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "license": "MIT", + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -690,44 +696,12 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -737,14 +711,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -753,27 +726,269 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", - "license": "MIT", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "dependencies": { + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { "node": ">=6.9.0" }, @@ -785,7 +1000,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -793,13 +1007,23 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", - "license": "MIT", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -808,28 +1032,117 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "license": "MIT", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -839,60 +1152,25 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", - "license": "MIT", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -902,14 +1180,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -919,12 +1196,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -934,12 +1210,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -948,50 +1223,20 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1001,13 +1246,11 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1017,13 +1260,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1033,13 +1274,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1049,59 +1289,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1111,27 +1303,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1141,13 +1318,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "license": "MIT", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1157,29 +1332,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1189,27 +1348,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1219,12 +1362,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1234,13 +1376,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1250,13 +1391,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -1266,15 +1407,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", - "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" @@ -1284,13 +1424,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1300,13 +1439,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", - "license": "MIT", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1316,61 +1454,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1380,44 +1468,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1427,45 +1483,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "license": "MIT", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1475,12 +1497,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1490,12 +1511,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", - "license": "MIT", + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1505,12 +1525,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1520,16 +1539,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", - "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-syntax-jsx": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1539,12 +1557,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" + "@babel/plugin-transform-react-jsx": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1571,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1570,12 +1586,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" }, "engines": { "node": ">=6.9.0" @@ -1584,29 +1600,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1616,17 +1615,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -1639,18 +1637,16 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1660,13 +1656,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", - "license": "MIT", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1676,12 +1671,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1691,12 +1685,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1706,12 +1699,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "license": "MIT", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1721,16 +1713,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", - "license": "MIT", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", + "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1740,28 +1729,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "license": "MIT", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1771,13 +1743,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1786,98 +1757,86 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.19.4", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.19.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -1886,54 +1845,40 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "license": "MIT", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1943,16 +1888,13 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "license": "MIT", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1962,1480 +1904,120 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "license": "MIT", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "license": "MIT", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", - "license": "MIT" - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-12.0.0.tgz", - "integrity": "sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==", - "license": "Apache-2.0", + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, "dependencies": { - "@chevrotain/gast": "12.0.0", - "@chevrotain/types": "12.0.0" + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" } }, - "node_modules/@chevrotain/gast": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-12.0.0.tgz", - "integrity": "sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "12.0.0" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-12.0.0.tgz", - "integrity": "sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-12.0.0.tgz", - "integrity": "sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-12.0.0.tgz", - "integrity": "sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==", - "license": "Apache-2.0" - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" } }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-alpha-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-position-area-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-property-rule-prelude-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", - "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", - "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", - "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", - "license": "MIT", - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/@docsearch/css": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", - "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", - "license": "MIT" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "node_modules/@docsearch/react": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", - "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", - "license": "MIT", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "dependencies": { - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.6.3", - "@docsearch/css": "4.6.3" + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", + "algoliasearch": "^4.0.0" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3446,259 +2028,167 @@ }, "react-dom": { "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.19.2" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@docusaurus/babel": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", - "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/bundler": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", - "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.10.1", - "@docusaurus/cssnano-preset": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^7.0.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true } } }, "node_modules/@docusaurus/core": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", - "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "dependencies": { - "@docusaurus/babel": "3.10.1", - "@docusaurus/bundler": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", "combine-promises": "^1.1.0", "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "^5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", + "eta": "^2.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.3", - "react-router": "^5.3.4", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.7", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" }, "bin": { "docusaurus": "bin/docusaurus.mjs" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "@docusaurus/faster": "*", - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", - "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" } }, "node_modules/@docusaurus/logger": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", - "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "dependencies": { "chalk": "^4.1.2", - "tslib": "^2.6.0" + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", - "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" + "webpack": "^5.73.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", - "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "dependencies": { - "@docusaurus/types": "3.10.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" }, "peerDependencies": { "react": "*", @@ -3706,766 +2196,590 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", - "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "cheerio": "1.0.0-rc.12", - "combine-promises": "^1.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", - "fs-extra": "^11.1.1", + "fs-extra": "^10.1.0", "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "webpack": "^5.73.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", - "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@types/react-router-config": "^5.0.7", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", + "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "webpack": "^5.73.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", - "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", - "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", - "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", - "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "tslib": "^2.6.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", - "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@types/gtag.js": "^0.0.20", - "tslib": "^2.6.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", - "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "tslib": "^2.6.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", - "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "fs-extra": "^11.1.1", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "fs-extra": "^10.1.0", "sitemap": "^7.1.1", - "tslib": "^2.6.0" + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", - "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", - "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/plugin-content-blog": "3.10.1", - "@docusaurus/plugin-content-docs": "3.10.1", - "@docusaurus/plugin-content-pages": "3.10.1", - "@docusaurus/plugin-css-cascade-layers": "3.10.1", - "@docusaurus/plugin-debug": "3.10.1", - "@docusaurus/plugin-google-analytics": "3.10.1", - "@docusaurus/plugin-google-gtag": "3.10.1", - "@docusaurus/plugin-google-tag-manager": "3.10.1", - "@docusaurus/plugin-sitemap": "3.10.1", - "@docusaurus/plugin-svgr": "3.10.1", - "@docusaurus/theme-classic": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/theme-search-algolia": "3.10.1", - "@docusaurus/types": "3.10.1" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", - "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/plugin-content-blog": "3.10.1", - "@docusaurus/plugin-content-docs": "3.10.1", - "@docusaurus/plugin-content-pages": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/theme-translations": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.45", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, "node_modules/@docusaurus/theme-common": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", - "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "dependencies": { - "@docusaurus/mdx-loader": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", - "clsx": "^2.0.0", + "clsx": "^1.2.1", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" } }, - "node_modules/@docusaurus/theme-mermaid": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.1.tgz", - "integrity": "sha512-2gxpmln8Pc4EN1oWzshQEx2HTs67jk14v7MmgqGs8ZU7Nm8oihg+fTouof2u4vN8DtB3Fln4cDJu4UprSX1S3Q==", - "license": "MIT", + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/module-type-aliases": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "mermaid": ">=11.6.0", - "tslib": "^2.6.0" + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^2.0.0", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" }, "peerDependencies": { - "@mermaid-js/layout-elk": "^0.1.9", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", + "dependencies": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", + "dependencies": { + "@docusaurus/logger": "2.4.0", + "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" }, "peerDependenciesMeta": { - "@mermaid-js/layout-elk": { + "@docusaurus/types": { "optional": true } } }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", - "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "^1.19.2", - "@docsearch/react": "^3.9.0 || ^4.3.2", - "@docusaurus/core": "3.10.1", - "@docusaurus/logger": "3.10.1", - "@docusaurus/plugin-content-docs": "3.10.1", - "@docusaurus/theme-common": "3.10.1", - "@docusaurus/theme-translations": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", - "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", - "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", - "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", - "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "escape-string-regexp": "^4.0.0", - "execa": "^5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - } - }, "node_modules/@docusaurus/utils-common": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", - "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "dependencies": { - "@docusaurus/types": "3.10.1", - "tslib": "^2.6.0" + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", - "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", + "joi": "^17.6.0", "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" + "tslib": "^2.4.0" }, "engines": { - "node": ">=20.0" + "node": ">=16.14" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" - }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/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, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "dev": true, - "license": "MIT", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "devOptional": true, "dependencies": { - "ajv": "^6.14.0", + "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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==", + "devOptional": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", - "license": "MIT", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", + "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", - "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", - "license": "MIT", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", + "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" + "@fortawesome/fontawesome-common-types": "6.4.2" }, "engines": { "node": ">=6" } }, + "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", + "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", - "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", - "license": "(CC-BY-4.0 AND MIT)", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.6.tgz", - "integrity": "sha512-mtBFIi1UsYQo7rYonYFkjgYKGoL8T+fEH6NGUpvuqtY3ytMsAoDaPo5rk25KuMtKDipY4bGYM/CkmCHA1N3FUg==", - "deprecated": "v0.2.x is no longer supported. Unless you are still using FontAwesome 5, please update to v3.1.1 or greater.", - "license": "MIT", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6 || ~7", - "react": "^16.3 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" } }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "devOptional": true, "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=18.18.0" + "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, - "license": "Apache-2.0", + "devOptional": true, "engines": { "node": ">=12.22" }, @@ -4474,103 +2788,29 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } + "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==", + "devOptional": true }, "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@sinclair/typebox": "^0.24.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", "dependencies": { - "@jest/schemas": "^29.6.3", + "@jest/schemas": "^29.0.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -4582,513 +2822,206 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "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.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.1.tgz", - "integrity": "sha512-YrEi/ZPmgc+GfdO0esBF04qv8boK9Dg9WpRQw/+vM8Qt3nnVIJWIa8HwZ/LXVZ0DB11XUROM8El/7yYTJX+WtA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.1.tgz", - "integrity": "sha512-ooEPvSW/HQDivPDPZMibHGKZf/QS4WRir1czGZmXmp3MsQqLECZEpN0JobrD8iV9BzsuwdIv+PxtWX9WpPLsIA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.1.tgz", - "integrity": "sha512-3YaKhP8gXEKN+2O49GLNfNb5l2gbnCFHyAaybbA2JkkbQP3dpdef7WcUaHAulg/c5Dg4VncHsA3NWAUSZMR5KQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/fs-print": "4.57.1", - "@jsonjoy.com/fs-snapshot": "4.57.1", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.1.tgz", - "integrity": "sha512-XHkFKQ5GSH3uxm8c3ZYXVrexGdscpWKIcMWKFQpMpMJc8gA3AwOMBJXJlgpdJqmrhPyQXxaY9nbkNeYpacC0Og==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.1.tgz", - "integrity": "sha512-pqGHyWWzNck4jRfaGV39hkqpY5QjRUQ/nRbNT7FYbBa0xf4bDG+TE1Gt2KWZrSkrkZZDE3qZUjYMbjwSliX6pg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-fsa": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.1.tgz", - "integrity": "sha512-vp+7ZzIB8v43G+GLXTS4oDUSQmhAsRz532QmmWBbdYA20s465JvwhkSFvX9cVTqRRAQg+vZ7zWDaIEh0lFe2gw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.1" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.1.tgz", - "integrity": "sha512-Ynct7ZJmfk6qoXDOKfpovNA36ITUx8rChLmRQtW08J73VOiuNsU8PB6d/Xs7fxJC2ohWR3a5AqyjmLojfrw5yw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.57.1", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.1.tgz", - "integrity": "sha512-/oG8xBNFMbDXTq9J7vepSA1kerS5vpgd3p5QZSPd+nX59uwodGJftI51gDYyHRpP57P3WCQf7LHtBYPqwUg2Bg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "17.67.0", - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0", - "@jsonjoy.com/json-pointer": "17.67.0", - "@jsonjoy.com/util": "17.67.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/util": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } + "dev": true }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@mdx-js/mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", - "license": "MIT", + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "acorn": "^8.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", @@ -5096,48 +3029,30 @@ } }, "node_modules/@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0" - }, + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" + "react": "^16.13.1 || ^17.0.0" } }, - "node_modules/@mermaid-js/parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.1.tgz", - "integrity": "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==", - "license": "MIT", - "dependencies": { - "langium": "^4.0.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -5150,7 +3065,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -5159,7 +3073,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -5168,510 +3081,35 @@ "node": ">= 8" } }, - "node_modules/@npmcli/config": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", - "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", + "node_modules/@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", "dev": true, - "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/package-json": "^5.1.1", - "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.2.1", - "proc-log": "^4.2.0", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/config/node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", - "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "@peculiar/asn1-x509-attr": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", - "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", - "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", - "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.1", - "@peculiar/asn1-pkcs8": "^2.6.1", - "@peculiar/asn1-rsa": "^2.6.1", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", - "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", - "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.1", - "@peculiar/asn1-pfx": "^2.6.1", - "@peculiar/asn1-pkcs8": "^2.6.1", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "@peculiar/asn1-x509-attr": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", - "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "license": "MIT", - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", - "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", - "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" + "url": "https://opencollective.com/unts" } }, "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -5679,51 +3117,45 @@ "node_modules/@sideway/formula": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "license": "MIT" + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">=6" } }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "license": "MIT", + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5734,12 +3166,11 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5750,12 +3181,11 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5766,12 +3196,11 @@ } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", + "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5782,12 +3211,11 @@ } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", + "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5798,12 +3226,11 @@ } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", + "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5814,12 +3241,11 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", + "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5830,10 +3256,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", + "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", "engines": { "node": ">=12" }, @@ -5846,22 +3271,21 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", + "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", + "@svgr/babel-plugin-transform-svg-component": "^6.5.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5872,19 +3296,18 @@ } }, "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", + "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" + "cosmiconfig": "^7.0.1" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5892,16 +3315,15 @@ } }, "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", + "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" + "@babel/types": "^7.18.4", + "entities": "^4.3.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5909,65 +3331,62 @@ } }, "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", + "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/hast-util-to-babel-ast": "^6.5.0", "svg-parser": "^2.0.4" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@svgr/core": "*" + "@svgr/core": "^6.0.0" } }, "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", + "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@svgr/core": "*" + "@svgr/core": "^6.0.0" } }, "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "license": "MIT", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", + "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "@svgr/plugin-svgo": "^6.5.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { "type": "github", @@ -5975,414 +3394,149 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dependencies": { - "defer-to-connect": "^2.0.1" + "defer-to-connect": "^1.0.1" }, "engines": { - "node": ">=14.16" + "node": ">=6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/docusaurus": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "@types/estree": "*" } }, "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/concat-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.3.tgz", - "integrity": "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==", - "dev": true, - "license": "MIT", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" }, "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dev": true, "dependencies": { "@types/estree": "*" } }, "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "license": "MIT", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", + "@types/express-serve-static-core": "^4.17.18", "@types/qs": "*", - "@types/serve-static": "^1" + "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", - "license": "MIT", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "@types/range-parser": "*" } }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "license": "MIT", "dependencies": { - "@types/minimatch": "^5.1.2", + "@types/minimatch": "*", "@types/node": "*" } }, - "node_modules/@types/gtag.js": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", - "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", - "license": "MIT" - }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "dependencies": { "@types/unist": "*" } @@ -6390,200 +3544,162 @@ "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "license": "MIT", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/is-empty": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz", - "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true, - "license": "MIT" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "dev": true, - "license": "MIT" + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", + "dev": true }, "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dependencies": { "@types/unist": "*" } }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "license": "MIT" - }, "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true }, "node_modules/@types/node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==" }, - "node_modules/@types/prismjs": { - "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", - "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", - "license": "MIT" + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", - "license": "MIT" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "license": "MIT", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.2.2" + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, "node_modules/@types/react-helmet": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", - "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, - "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" } }, "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "license": "MIT", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", - "@types/react-router": "^5.1.0" + "@types/react-router": "*" } }, "node_modules/@types/react-router-dom": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -6591,583 +3707,219 @@ } }, "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "license": "MIT" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "license": "MIT", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/supports-color": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", - "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", - "integrity": "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/type-utils": "8.57.2", - "@typescript-eslint/utils": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.57.2", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.2.tgz", - "integrity": "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", - "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.2", - "@typescript-eslint/types": "^8.57.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", - "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", - "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz", - "integrity": "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2", - "@typescript-eslint/utils": "8.57.2", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", - "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", - "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.57.2", - "@typescript-eslint/tsconfig-utils": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", - "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", - "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.2", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@upsetjs/venn.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", - "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", - "license": "MIT", - "optionalDependencies": { - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1" - } + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/ast": "1.11.5", "@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==", - "license": "BSD-3-Clause" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "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==", - "license": "Apache-2.0" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -7180,7 +3932,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7189,7 +3940,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -7197,20 +3947,10 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, @@ -7218,44 +3958,35 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.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==", "peerDependencies": { - "acorn": "^8.14.0" + "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==", - "license": "MIT", + "devOptional": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "engines": { "node": ">= 10.0.0" } @@ -7264,7 +3995,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -7274,10 +4004,9 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "license": "MIT", + "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", @@ -7293,7 +4022,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -7307,15 +4035,14 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -7325,48 +4052,41 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "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==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/algoliasearch": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.1.tgz", - "integrity": "sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==", - "license": "MIT", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "dependencies": { - "@algolia/abtesting": "1.18.1", - "@algolia/client-abtesting": "5.52.1", - "@algolia/client-analytics": "5.52.1", - "@algolia/client-common": "5.52.1", - "@algolia/client-insights": "5.52.1", - "@algolia/client-personalization": "5.52.1", - "@algolia/client-query-suggestions": "5.52.1", - "@algolia/client-search": "5.52.1", - "@algolia/ingestion": "1.52.1", - "@algolia/monitoring": "1.52.1", - "@algolia/recommend": "5.52.1", - "@algolia/requester-browser-xhr": "5.52.1", - "@algolia/requester-fetch": "5.52.1", - "@algolia/requester-node-http": "5.52.1" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz", - "integrity": "sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA==", - "license": "MIT", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -7378,7 +4098,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", "dependencies": { "string-width": "^4.1.0" } @@ -7386,14 +4105,12 @@ "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7410,7 +4127,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -7419,7 +4135,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -7428,7 +4143,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7439,20 +4153,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", - "license": "ISC", - "engines": { - "node": ">=14" - } + "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==", - "license": "ISC", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -7464,53 +4174,42 @@ "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==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "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==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -7523,62 +4222,20 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7588,36 +4245,30 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, - "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7626,43 +4277,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/async-function": { + "node_modules/asynciterator.prototype": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", "dev": true, - "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "engines": { - "node": ">= 0.4" + "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "funding": [ { "type": "opencollective", @@ -7671,18 +4311,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -7696,14 +4332,10 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "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, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -7711,85 +4343,126 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "license": "MIT", + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "follow-redirects": "^1.14.7" + } + }, + "node_modules/babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 8.9" }, "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" + "@babel/core": "^7.0.0", + "webpack": ">=2" } }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "license": "MIT", "dependencies": { "object.assign": "^4.1.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", - "license": "MIT", + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", - "license": "MIT", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" + "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7798,66 +4471,51 @@ "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==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz", - "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", - "license": "MIT", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", + "bytes": "3.1.2", + "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.15.1", - "raw-body": "~2.5.3", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8", @@ -7868,7 +4526,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7877,35 +4534,22 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "license": "MIT", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -7913,14 +4557,12 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/boxen": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^6.2.0", @@ -7939,31 +4581,29 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", - "license": "MIT", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "funding": [ { "type": "opencollective", @@ -7972,19 +4612,13 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -7996,121 +4630,85 @@ "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==", - "license": "MIT" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "engines": { - "node": ">=14.16" + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -8119,7 +4717,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -8129,7 +4726,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -8137,11 +4733,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -8150,9 +4753,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "funding": [ { "type": "opencollective", @@ -8166,14 +4769,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8183,7 +4784,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8195,20 +4795,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "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==", - "license": "MIT", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8218,27 +4808,25 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", + "dev": true, "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==", - "license": "MIT", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "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==", - "license": "MIT", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8248,7 +4836,6 @@ "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -8269,7 +4856,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -8282,39 +4868,16 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/chevrotain": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-12.0.0.tgz", - "integrity": "sha512-csJvb+6kEiQaqo1woTdSAuOWdN0WTLIydkKrBnS+V5gZz0oqBrp4kQ35519QgK6TpBThiG3V1vNSHlIkv4AglQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "12.0.0", - "@chevrotain/gast": "12.0.0", - "@chevrotain/regexp-to-ast": "12.0.0", - "@chevrotain/types": "12.0.0", - "@chevrotain/utils": "12.0.0" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.4.3.tgz", - "integrity": "sha512-2X4mkroolSMKqW+H22pyPMUVDqYZzPhephTmg/NODKb1IGYPHfxfhcW0EjS7wcPJNbze2i4vBWT7zT5FKF2lrQ==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.18.1" - }, - "peerDependencies": { - "chevrotain": "^12.0.0" - } - }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -8327,48 +4890,32 @@ "engines": { "node": ">= 8.10.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", + "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==", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "dependencies": { "source-map": "~0.6.0" }, @@ -8376,20 +4923,10 @@ "node": ">= 10.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", "engines": { "node": ">=6" } @@ -8398,7 +4935,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -8406,11 +4942,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dependencies": { "string-width": "^4.2.0" }, @@ -8424,14 +4975,12 @@ "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8445,7 +4994,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -8455,20 +5003,29 @@ "node": ">=6" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "engines": { "node": ">=6" } }, "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8478,7 +5035,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8489,35 +5045,30 @@ "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==", - "license": "MIT" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", "engines": { "node": ">=10" } }, "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==", - "license": "MIT", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8527,22 +5078,19 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", "engines": { "node": ">= 6" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "license": "ISC" + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -8551,46 +5099,34 @@ } }, "node_modules/compressible/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8598,134 +5134,85 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" + "node": ">=8" } }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-text-to-clipboard": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", - "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", "engines": { "node": ">=12" }, @@ -8734,10 +5221,9 @@ } }, "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "license": "MIT", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", + "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", "dependencies": { "toggle-selection": "^1.0.6" } @@ -8746,7 +5232,6 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -8766,11 +5251,36 @@ "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/copy-webpack-plugin/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==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -8779,14 +5289,13 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -8797,11 +5306,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -8810,75 +5341,69 @@ } }, "node_modules/core-js": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", - "license": "MIT", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "dependencies": { - "browserslist": "^4.28.1" + "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-pure": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8889,158 +5414,37 @@ } }, "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/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==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/css-declaration-sorter": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", - "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", - "license": "ISC", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "engines": { - "node": "^14 || ^16 || >=18" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" } }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "license": "MIT", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "semver": "^7.3.5" }, "engines": { "node": ">= 12.13.0" @@ -9050,30 +5454,20 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "license": "MIT", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" }, "engines": { "node": ">= 14.15.0" @@ -9106,33 +5500,59 @@ } } }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" }, "peerDependencies": { - "postcss": "^8.4" + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -9145,23 +5565,21 @@ } }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "license": "MIT", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=8.0.0" } }, "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "engines": { "node": ">= 6" }, @@ -9169,27 +5587,10 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssdb": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.9.0.tgz", - "integrity": "sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, "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==", - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -9198,722 +5599,129 @@ } }, "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "license": "MIT", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" + "cssnano-preset-default": "^5.2.12", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "license": "MIT", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "license": "MIT", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dependencies": { - "css-tree": "~2.2.0" + "css-tree": "^1.1.2" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=8.0.0" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/cytoscape": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { + "node_modules/d": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", - "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -9925,10 +5733,10 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", + "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==", + "dev": true, "dependencies": { "character-entities": "^2.0.0" }, @@ -9937,38 +5745,31 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, + "node_modules/decode-named-character-reference/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==", + "dev": true, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -9977,88 +5778,45 @@ "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, - "license": "MIT" + "devOptional": true }, "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "license": "MIT", + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "execa": "^5.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", "engines": { "node": ">=8" } }, "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==", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -10069,20 +5827,31 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "license": "ISC", + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dependencies": { - "robust-predicates": "^3.0.2" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10091,7 +5860,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", + "dev": true, "engines": { "node": ">=6" } @@ -10100,23 +5869,32 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", - "license": "MIT", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dependencies": { "address": "^1.0.1", "debug": "4" @@ -10124,29 +5902,50 @@ "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dependencies": { - "dequal": "^2.0.0" + "address": "^1.0.1", + "debug": "^2.6.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==", + "dev": true, + "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==", - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -10154,11 +5953,15 @@ "node": ">=8" } }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -10167,23 +5970,21 @@ } }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -10192,7 +5993,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -10211,14 +6011,12 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -10229,24 +6027,14 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/dompurify": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", - "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -10256,132 +6044,109 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { "is-obj": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/dot-prop/node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.5.328", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.328.tgz", - "integrity": "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==", - "license": "ISC" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "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==", - "license": "MIT" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", - "license": "MIT", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "engines": { "node": ">=0.12" }, @@ -10389,83 +6154,59 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, - "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "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.5", + "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-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", + "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.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "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.10" }, "engines": { "node": ">= 0.4" @@ -10474,110 +6215,65 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-iterator-helpers": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", - "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "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.0", + "safe-array-concat": "^1.0.0" } }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, - "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "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.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "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, - "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "has": "^1.0.3" } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10586,70 +6282,79 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esast-util-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "license": "MIT", + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=0.10" } }, - "node_modules/esast-util-from-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "license": "MIT", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, "dependencies": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", + "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-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "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==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -10658,122 +6363,97 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "devOptional": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "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.5", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "eslint": ">=7.0.0" } }, "node_modules/eslint-mdx": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-3.7.0.tgz", - "integrity": "sha512-QpPdJ6EeFthHuIrfgnWneZgwwFNOLFj/nf2jg/tOTBoiUnqNTxUUpTGAn0ZFHYEh5htVVoe5kjvD02oKtxZGeA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.0.5.tgz", + "integrity": "sha512-1ZzcJwJNfladtuK+uuG/MdC0idc1e3d1vCI2STOq/pLcJBGuao2biWh90vEh2M93zDiNoHJGUIU7UAxupiiHFw==", "dev": true, - "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "espree": "^9.6.1 || ^10.4.0", - "estree-util-visit": "^2.0.0", - "remark-mdx": "^3.1.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "synckit": "^0.11.8", - "unified": "^11.0.5", - "unified-engine": "^11.2.2", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.3" + "cosmiconfig": "^7.0.1", + "espree": "^9.4.0", + "estree-util-visit": "^1.2.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "synckit": "^0.8.4", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "uvu": "^0.5.6", + "vfile": "^5.3.4" }, "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=8.0.0", - "remark-lint-file-extension": "*" - }, - "peerDependenciesMeta": { - "remark-lint-file-extension": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-mdx": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-3.7.0.tgz", - "integrity": "sha512-JXaaQPnKqyti/QSOSQDThLV1EemHm/Fe2l/nMKH0vmhvmABtN/yV/9+GtKgh8UTZwrwuTfQq1HW5eR8HXneNLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-mdx": "^3.7.0", - "mdast-util-from-markdown": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0", - "remark-mdx": "^3.1.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "synckit": "^0.11.8", - "unified": "^11.0.5", - "vfile": "^6.0.3" - }, - "engines": { - "node": ">=18.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -10783,59 +6463,465 @@ "eslint": ">=8.0.0" } }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "node_modules/eslint-mdx/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-mdx/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-mdx/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", "dev": true, - "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", + "@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/eslint-mdx/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "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/eslint-mdx/node_modules/remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "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/eslint-mdx/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-mdx/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "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/eslint-mdx/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "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/eslint-mdx/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-markdown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", + "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.5" + }, + "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-plugin-mdx": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.0.5.tgz", + "integrity": "sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==", + "dev": true, + "dependencies": { + "eslint-mdx": "^2.0.5", + "eslint-plugin-markdown": "^3.0.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "vfile": "^5.3.4" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "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/eslint-plugin-mdx/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "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/eslint-plugin-mdx/node_modules/remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "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/eslint-plugin-mdx/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "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/eslint-plugin-mdx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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.2.1", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", - "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", + "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.5", + "resolve": "^2.0.0-next.4", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "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.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "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, - "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10845,36 +6931,33 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "devOptional": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10884,8 +6967,7 @@ "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, - "license": "ISC", + "devOptional": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -10893,19 +6975,45 @@ "node": ">=10.13.0" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "type-fest": "^0.20.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "devOptional": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10915,7 +7023,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -10925,11 +7032,10 @@ } }, "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "devOptional": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -10941,7 +7047,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -10953,128 +7058,46 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz", + "integrity": "sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", - "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-value-to-estree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.0.tgz", + "integrity": "sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.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==", - "license": "MIT", - "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==", - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", "engines": { "node": ">=6.0.0" }, @@ -11086,7 +7109,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11103,17 +7125,25 @@ "node": ">= 0.8" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -11122,7 +7152,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -11141,57 +7170,67 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/express": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", - "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", - "license": "MIT", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.4.1", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "~6.15.1", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~2.0.1", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/express/node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -11203,7 +7242,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -11211,35 +7249,45 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "license": "MIT" + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -11250,20 +7298,18 @@ "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==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" @@ -11272,59 +7318,34 @@ "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==", - "license": "MIT" + "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, - "license": "MIT" + "devOptional": true }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "dependencies": { - "reusify": "^1.0.4" + "punycode": "^1.3.2" } }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "license": "MIT", + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -11332,11 +7353,37 @@ "node": ">=0.8.0" } }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, "node_modules/feed": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", "dependencies": { "xml-js": "^1.6.11" }, @@ -11345,23 +7392,21 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "devOptional": true, "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -11378,10 +7423,9 @@ } }, "node_modules/file-loader/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==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -11395,11 +7439,18 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -11408,17 +7459,16 @@ } }, "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.4.1", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~2.0.2", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -11429,7 +7479,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -11437,31 +7486,28 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "license": "MIT", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "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, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -11473,47 +7519,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "devOptional": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "devOptional": true + }, + "node_modules/flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -11524,126 +7570,162 @@ } }, "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" + "node": ">=6" } }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "engines": { "node": "*" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "license": "MIT", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=14.14" + "node": ">=12" } }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, "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, - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -11653,27 +7735,20 @@ } }, "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -11687,49 +7762,27 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "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" @@ -11738,27 +7791,13 @@ "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, "engines": { "node": ">=10" }, @@ -11766,16 +7805,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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" @@ -11787,16 +7835,12 @@ "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "license": "ISC" + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11816,7 +7860,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -11824,33 +7867,34 @@ "node": ">= 6" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "license": "Apache-2.0", + "node_modules/glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.3" + }, "engines": { - "node": ">=10.0" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" }, "peerDependencies": { - "tslib": "2" + "glob": "^7.1.6" } }, "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==", - "license": "BSD-2-Clause" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dependencies": { "ini": "2.0.0" }, @@ -11865,33 +7909,60 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", "engines": { "node": ">=10" } }, - "node_modules/globals": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", - "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" } }, "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -11900,11 +7971,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -11920,66 +7996,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "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/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "license": "MIT", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">=8.6" } }, "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==", - "license": "ISC" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -11994,16 +8064,14 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12016,7 +8084,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -12027,27 +8094,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "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, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12056,32 +8123,25 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, + "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==", "engines": { "node": ">= 0.4" }, @@ -12090,10 +8150,9 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -12102,13 +8161,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, - "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12118,43 +8176,70 @@ } }, "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", "dependencies": { - "function-bind": "^1.1.2" + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", @@ -12162,92 +8247,62 @@ } }, "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-estree": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - "license": "MIT", + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", + "node_modules/hast-util-raw/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", @@ -12255,31 +8310,15 @@ } }, "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" }, "funding": { "type": "opencollective", @@ -12287,16 +8326,15 @@ } }, "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" }, "funding": { "type": "opencollective", @@ -12307,7 +8345,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", "bin": { "he": "bin/he" } @@ -12316,7 +8353,6 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -12330,36 +8366,14 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -12370,14 +8384,12 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -12391,122 +8403,25 @@ "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.6", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", - "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -12523,6 +8438,56 @@ "node": ">=12" } }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -12534,7 +8499,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -12543,48 +8507,39 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -12595,10 +8550,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "license": "MIT", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -12622,7 +8576,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -12630,44 +8583,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" @@ -12677,7 +8606,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -12686,31 +8614,40 @@ } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "engines": { "node": ">= 4" } }, "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dependencies": { + "queue": "6.0.2" + }, "bin": { "image-size": "bin/image-size.js" }, "engines": { - "node": ">=16.x" + "node": ">=14.0.0" + } + }, + "node_modules/immer": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" } }, "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -12723,30 +8660,17 @@ } }, "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", "engines": { - "node": ">=8" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -12755,16 +8679,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/infima": { - "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", - "license": "MIT", + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { "node": ">=12" } @@ -12773,9 +8695,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -12784,85 +8703,72 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" + "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.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, - "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "engines": { - "node": ">=12" + "node": ">= 0.10" } }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "engines": { "node": ">= 10" } }, "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==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "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==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" }, "funding": { "type": "github", @@ -12870,18 +8776,14 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "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, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12890,21 +8792,15 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "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, - "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12914,16 +8810,12 @@ } }, "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12933,7 +8825,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -12942,14 +8833,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12958,12 +8848,33 @@ "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, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12972,59 +8883,39 @@ } }, "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dependencies": { - "ci-info": "^3.2.0" + "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" + "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13034,10 +8925,9 @@ } }, "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==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13047,7 +8937,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -13058,18 +8947,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-empty": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", - "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==", - "dev": true, - "license": "MIT" - }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13078,22 +8959,17 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13103,23 +8979,17 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13132,7 +9002,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -13141,53 +9010,18 @@ } }, "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==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" @@ -13200,24 +9034,19 @@ } }, "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13225,25 +9054,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-network-error": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-npm": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", - "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13253,20 +9069,17 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13279,37 +9092,38 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, "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==", - "license": "MIT", "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==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -13317,17 +9131,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13340,35 +9157,34 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", "engines": { - "node": ">= 0.4" - }, + "node": ">=6" + } + }, + "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.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13378,7 +9194,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -13387,14 +9202,12 @@ } }, "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13404,15 +9217,12 @@ } }, "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13422,13 +9232,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "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, - "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -13440,60 +9249,64 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -13502,76 +9315,46 @@ } }, "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", + "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", "dev": true, - "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.3" } }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "^29.2.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -13583,13 +9366,12 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "license": "MIT", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -13601,7 +9383,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13612,39 +9393,33 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", + "version": "17.6.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz", + "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==", "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "devOptional": true + }, "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==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -13653,71 +9428,69 @@ } }, "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "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==", - "license": "MIT" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "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==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-to-typescript": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", - "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.1.1.tgz", + "integrity": "sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==", "dev": true, - "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.5", - "@types/json-schema": "^7.0.15", - "@types/lodash": "^4.17.7", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", "is-glob": "^4.0.3", - "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "minimist": "^1.2.8", - "prettier": "^3.2.5", - "tinyglobby": "^0.2.9" + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" }, "bin": { "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=12.0.0" } }, "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==", - "license": "MIT" + "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, - "license": "MIT" + "devOptional": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -13726,10 +9499,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -13738,65 +9510,30 @@ } }, "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==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, - "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" } }, - "node_modules/katex": { - "version": "0.16.44", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.44.tgz", - "integrity": "sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dependencies": { - "json-buffer": "3.0.1" + "json-buffer": "3.0.0" } }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13805,68 +9542,33 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/langium": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.4.tgz", - "integrity": "sha512-J0M9BkTOZ9Izee2YL0eXkUKFdWhrmTYYVLgiZTz6Z3KvK03ooM+vjVrfphKcdGVPWmM2cFYtDnNyIsIIZPrHNA==", - "license": "MIT", - "dependencies": { - "@chevrotain/regexp-to-ast": "~12.0.0", - "chevrotain": "~12.0.0", - "chevrotain-allstar": "~0.4.3", - "vscode-jsonrpc": "~8.2.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-protocol": "~3.17.5", - "vscode-languageserver-textdocument": "~1.0.12", - "vscode-languageserver-types": "~3.17.5", - "vscode-uri": "~3.1.0" - }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.3" + "node": ">= 8" } }, "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dependencies": { - "package-json": "^8.1.0" + "package-json": "^6.3.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/launch-editor": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", - "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.4" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", "engines": { "node": ">=6" } @@ -13875,8 +9577,7 @@ "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, - "license": "MIT", + "devOptional": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -13886,56 +9587,30 @@ } }, "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "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==", - "license": "MIT" - }, - "node_modules/load-plugin": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", - "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@npmcli/config": "^8.0.0", - "import-meta-resolve": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "engines": { "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -13949,8 +9624,6 @@ "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, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -13962,47 +9635,46 @@ } }, "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "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, - "license": "MIT" + "devOptional": true }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "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==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14012,7 +9684,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -14024,325 +9695,104 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", - "license": "MIT", + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" + "unist-util-remove": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "unist-util-visit": "^2.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==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "license": "MIT", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/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==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", @@ -14350,16 +9800,14 @@ } }, "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz", + "integrity": "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==", + "dev": true, "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0" }, "funding": { "type": "opencollective", @@ -14367,17 +9815,98 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz", + "integrity": "sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "@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-expression/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "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-mdx-expression/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "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/mdast-util-mdx-expression/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", @@ -14385,23 +9914,191 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz", + "integrity": "sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", + "mdast-util-to-markdown": "^1.3.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^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-mdx-jsx/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/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==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/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==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/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==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/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==", + "dev": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/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==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/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==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz", + "integrity": "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==", + "dev": true, + "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/mdast-util-mdx-jsx/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-remove-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz", + "integrity": "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "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/mdast-util-mdx-jsx/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", @@ -14409,31 +10106,98 @@ } }, "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz", + "integrity": "sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==", + "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "@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": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" + "@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-mdxjs-esm/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "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/mdast-util-mdxjs-esm/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", @@ -14441,20 +10205,18 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", @@ -14462,19 +10224,17 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.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": { @@ -14482,129 +10242,150 @@ "url": "https://opencollective.com/unified" } }, - "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==", - "license": "MIT", + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, "dependencies": { - "@types/mdast": "^4.0.0" + "@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/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "license": "CC0-1.0" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.1.tgz", - "integrity": "sha512-WvzrWPwMQT+PtbX2Et64R4qXKK0fj/8pO85MrUCzymX3twwCiJCdvntW3HdhG1teLJcHDDLIKx5+c3HckWYZtQ==", - "license": "Apache-2.0", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.1", - "@jsonjoy.com/fs-fsa": "4.57.1", - "@jsonjoy.com/fs-node": "4.57.1", - "@jsonjoy.com/fs-node-builtins": "4.57.1", - "@jsonjoy.com/fs-node-to-fsa": "4.57.1", - "@jsonjoy.com/fs-node-utils": "4.57.1", - "@jsonjoy.com/fs-print": "4.57.1", - "@jsonjoy.com/fs-snapshot": "4.57.1", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" + "fs-monkey": "^1.0.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "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==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } }, - "node_modules/mermaid": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", - "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.0.1", - "@types/d3": "^7.4.3", - "@upsetjs/venn.js": "^2.0.0", - "cytoscape": "^3.33.1", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.14", - "dayjs": "^1.11.19", - "dompurify": "^3.3.1", - "katex": "^0.16.25", - "khroma": "^2.1.0", - "lodash-es": "^4.17.23", - "marked": "^16.3.0", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -14615,31 +10396,16 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "@types/debug": "^4.0.0", "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "parse-entities": "^2.0.0" } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -14650,554 +10416,30 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "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-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz", + "integrity": "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15208,159 +10450,44 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.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-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "license": "MIT", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz", + "integrity": "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" + "@types/acorn": "^4.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-jsx/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz", + "integrity": "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==", + "dev": true, "dependencies": { - "micromark-util-types": "^2.0.0" + "micromark-util-types": "^1.0.0" }, "funding": { "type": "opencollective", @@ -15368,19 +10495,19 @@ } }, "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz", + "integrity": "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==", + "dev": true, "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.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", @@ -15388,66 +10515,30 @@ } }, "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz", + "integrity": "sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.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-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15458,53 +10549,17 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15515,54 +10570,18 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "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-label/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz", + "integrity": "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15573,79 +10592,22 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.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", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" } }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15656,32 +10618,16 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, - "node_modules/micromark-factory-space/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" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15692,74 +10638,19 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "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" } }, - "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15770,74 +10661,18 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "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/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15848,32 +10683,16 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, - "node_modules/micromark-util-character/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" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15884,31 +10703,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15919,53 +10722,17 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15976,16 +10743,16 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -15996,31 +10763,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16031,54 +10782,18 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "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-decode-string/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16088,13 +10803,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz", + "integrity": "sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16105,37 +10820,35 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { + "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" + "estree-util-visit": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-location": "^4.0.0", + "vfile-message": "^3.0.0" } }, - "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/micromark-util-events-to-acorn/node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16145,13 +10858,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16162,31 +10875,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16197,15 +10894,15 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-types": "^2.0.0" + "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16216,53 +10913,17 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16273,34 +10934,18 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "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-subtokenize/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16310,13 +10955,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -16326,72 +10971,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" - }, - "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + ] }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { @@ -16402,7 +10989,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -16414,7 +11000,6 @@ "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16423,7 +11008,6 @@ "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", "dependencies": { "mime-db": "~1.33.0" }, @@ -16435,31 +11019,24 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/mini-css-extract-plugin": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", - "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", - "license": "MIT", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" + "schema-utils": "^4.0.0" }, "engines": { "node": ">= 12.13.0" @@ -16472,17 +11049,64 @@ "webpack": "^5.0.0" } }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -16491,56 +11115,51 @@ } }, "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "BlueOak-1.0.0", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" } }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -16554,22 +11173,31 @@ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", "dev": true, - "license": "MIT", "bin": { "mustache": "bin/mustache" } }, + "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.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -16581,14 +11209,12 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -16596,201 +11222,94 @@ "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==", - "license": "MIT" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, - "node_modules/node-addon-api": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", - "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "license": "MIT", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=18" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-exports-info/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node": ">= 6.13.0" } }, "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", - "license": "MIT" - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "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==", - "license": "MIT", + "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==", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -16801,14 +11320,12 @@ "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -16820,7 +11337,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "license": "MIT", + "dev": true, "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -16837,10 +11354,10 @@ } }, "node_modules/null-loader/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==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16858,19 +11375,14 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16879,22 +11391,18 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -16905,32 +11413,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -16939,17 +11443,28 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -16961,14 +11476,12 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -16977,10 +11490,9 @@ } }, "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { "node": ">= 0.8" } @@ -16989,8 +11501,6 @@ "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, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -16999,7 +11509,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -17011,10 +11520,9 @@ } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -17031,71 +11539,39 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "devOptional": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=6" } }, "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, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -17110,8 +11586,6 @@ "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, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -17126,7 +11600,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -17137,96 +11610,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "license": "MIT", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dependencies": { - "p-finally": "^1.0.0" + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" }, "engines": { "node": ">=8" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -17236,7 +11665,6 @@ "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==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -17245,35 +11673,26 @@ } }, "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dependencies": { - "@types/unist": "^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" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -17290,51 +11709,35 @@ "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==", - "license": "ISC" + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "entities": "^6.0.0" + "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dependencies": { - "domhandler": "^5.0.3", + "domhandler": "^5.0.2", "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -17343,24 +11746,15 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, "node_modules/path-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, - "license": "MIT", "engines": { "node": ">=8" } @@ -17369,8 +11763,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -17378,14 +11770,12 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "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==", - "license": "MIT", "engines": { "node": ">=8" } @@ -17393,38 +11783,12 @@ "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==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "license": "MIT", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dependencies": { "isarray": "0.0.1" } @@ -17433,28 +11797,19 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "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.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -17463,160 +11818,135 @@ } }, "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "find-up": "^6.3.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^6.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "license": "MIT", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "yocto-queue": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^4.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkijs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", - "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=6" } }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { - "node": ">= 0.4" + "node": ">=4" } }, "node_modules/postcss": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz", - "integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -17631,597 +11961,125 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "license": "MIT", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dependencies": { - "postcss-selector-parser": "^6.0.11", + "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, "peerDependencies": { "postcss": "^8.2.2" } }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "license": "MIT", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", - "colord": "^2.9.3", + "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "license": "MIT", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "postcss": "^8.2.15" } }, "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "license": "MIT", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", "dependencies": { - "postcss-selector-parser": "^6.0.16" + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-focus-within": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-lab-function": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2.15" } }, "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" }, "engines": { "node": ">= 14.15.0" @@ -18235,150 +12093,117 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-logical": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", "dependencies": { - "cssnano-utils": "^4.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "license": "MIT", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" + "stylehacks": "^5.1.1" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "license": "MIT", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "license": "MIT", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "license": "MIT", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dependencies": { - "postcss-selector-parser": "^6.0.16" + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -18387,13 +12212,12 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -18403,26 +12227,12 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -18431,24 +12241,10 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -18459,551 +12255,193 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dependencies": { + "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2.15" } }, "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "license": "MIT", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dependencies": { - "cssnano-utils": "^4.0.2", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", - "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.1", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-position-area-property": "^1.0.0", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-property-rule-prelude-list": "^1.0.0", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", - "@csstools/postcss-system-ui-font-family": "^1.0.0", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.23", - "browserslist": "^4.28.1", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.6.0", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "license": "MIT", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "license": "MIT", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "postcss": "^8.2.15" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19013,67 +12451,62 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "license": "MIT", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "dependencies": { - "sort-css-media-queries": "2.2.0" + "sort-css-media-queries": "2.1.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10.0.0" }, "peerDependencies": { - "postcss": "^8.4.23" + "postcss": "^8.4.16" } }, "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" + "svgo": "^2.7.0" }, "engines": { - "node": "^14 || ^16 || >= 18" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dependencies": { - "postcss-selector-parser": "^6.0.16" + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "license": "MIT", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, "node_modules/prebuild-webpack-plugin": { @@ -19081,7 +12514,6 @@ "resolved": "https://registry.npmjs.org/prebuild-webpack-plugin/-/prebuild-webpack-plugin-1.1.1.tgz", "integrity": "sha512-H5/VnSl7KZm3NCGj1+8BrBHu0Bn9xzLREdpeE4TRYyp4t4qFnYPExzozk2sfD/CLJRGIuyOFrXbXgJJ4ETdz/g==", "dev": true, - "license": "MPL-2.0", "dependencies": { "debug": "^4.1.1", "glob": "^7.1.5", @@ -19095,23 +12527,29 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "engines": { + "node": ">=4" + } + }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, - "license": "MIT", "bin": { - "prettier": "bin/prettier.cjs" + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=14" + "node": ">=10.13.0" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -19121,7 +12559,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -19131,75 +12568,43 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", "peerDependencies": { - "react": ">=16.0.0" + "react": ">=0.14.9" } }, "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { "node": ">=6" } }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" + "asap": "~2.0.3" } }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -19212,7 +12617,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -19220,26 +12624,21 @@ } }, "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -19252,60 +12651,46 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, "node_modules/pupa": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dependencies": { - "escape-goat": "^4.0.0" + "escape-goat": "^2.0.0" }, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" }, "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", - "license": "BSD-3-Clause", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "side-channel": "^1.1.0" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -19314,6 +12699,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -19331,26 +12724,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + ] }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -19359,21 +12738,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8" @@ -19383,28 +12760,14 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -19415,28 +12778,21 @@ "rc": "cli.js" } }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" }, "engines": { "node": ">=0.10.0" @@ -19446,49 +12802,102 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/react-async/-/react-async-10.0.1.tgz", "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==", - "license": "ISC", "peerDependencies": { "react": ">=16.3.1" } }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.1.tgz", - "integrity": "sha512-s+HrzLyJBxrpGTYXF15dTgMjAJpEPZT/Yp6NytAtZMRngejxt6Pt5WrfFxLAcsqUDU6sY1Jz6tyHwIicE1U2Xg==", - "license": "MIT", + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "dependencies": { - "copy-to-clipboard": "^3.3.3", + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "dependencies": { + "copy-to-clipboard": "^3.3.1", "prop-types": "^15.8.1" }, "peerDependencies": { - "react": ">=15.3.0" + "react": "^15.3.0 || 16 || 17 || 18" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" }, "peerDependencies": { - "react": "^18.3.1" + "react": "17.0.2" } }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" }, "node_modules/react-helmet-async": { - "name": "@slorber/react-helmet-async", "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", "dependencies": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", @@ -19497,46 +12906,52 @@ "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.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==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-json-view-lite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", - "license": "MIT", - "engines": { - "node": ">=18" + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" } }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "license": "MIT", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", "dependencies": { - "@types/react": "*" + "@types/react": "*", + "prop-types": "^15.6.2" }, "peerDependencies": { "react": "*" } }, "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", - "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", "dependencies": { "@babel/runtime": "^7.10.3" }, @@ -19552,7 +12967,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19572,7 +12986,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" }, @@ -19585,7 +12998,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19599,48 +13011,38 @@ "react": ">=15" } }, - "node_modules/react-toastify": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.6.tgz", - "integrity": "sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==", - "license": "MIT", + "node_modules/react-textarea-autosize": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "dependencies": { - "clsx": "^2.1.0" + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" }, "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "license": "ISC", + "node_modules/react-toastify": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-7.0.4.tgz", + "integrity": "sha512-Rol7+Cn39hZp5hQ/k6CbMNE2CKYV9E5OQdC/hBLtIQU2xz7DdAm7xil4NITQTHR6zEbE5RVFbpgSwTD7xRGLeQ==", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "clsx": "^1.1.1" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19654,7 +13056,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -19662,94 +13063,45 @@ "node": ">=8.10.0" } }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", - "license": "MIT", + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" + "resolve": "^1.1.6" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.10" } }, - "node_modules/recma-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", - "license": "MIT", + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" + "minimatch": "^3.0.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "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, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "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" @@ -19761,14 +13113,12 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "license": "MIT", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dependencies": { "regenerate": "^1.4.2" }, @@ -19776,19 +13126,28 @@ "node": ">=4" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -19798,180 +13157,227 @@ } }, "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "license": "MIT", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" + "unicode-match-property-value-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/registry-auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^3.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "license": "MIT", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "dependencies": { "rc": "1.2.8" }, "engines": { - "node": ">=12" + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "license": "BSD-2-Clause", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dependencies": { - "jsesc": "~3.1.0" + "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" } }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/remark-directive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", - "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" } }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", - "license": "MIT", + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", @@ -19979,32 +13385,38 @@ } }, "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" + "mdast-squeeze-paragraphs": "^4.0.0" }, "funding": { "type": "opencollective", @@ -20012,14 +13424,65 @@ } }, "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", + "dev": true, "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-stringify/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remark-stringify/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-stringify/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "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", @@ -20030,7 +13493,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -20043,7 +13505,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -20059,7 +13520,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -20073,7 +13533,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -20088,7 +13547,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -20102,7 +13560,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -20118,7 +13575,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -20126,11 +13582,18 @@ "entities": "^2.0.0" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20146,40 +13609,28 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.16.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, "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==", - "license": "MIT", "engines": { "node": ">=4" } @@ -20187,90 +13638,64 @@ "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lowercase-keys": "^1.0.0" } }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "engines": { "node": ">= 4" } }, "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, "node_modules/rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", - "license": "MIT", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", "dependencies": { - "escalade": "^3.1.1", + "find-up": "^5.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.21", + "postcss": "^8.3.11", "strip-json-comments": "^3.1.1" }, "bin": { "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { @@ -20291,28 +13716,39 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "engines": { @@ -20326,8 +13762,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -20346,46 +13781,17 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/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, - "license": "MIT" + ] }, "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20394,98 +13800,43 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0" - }, "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -20497,27 +13848,26 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" + "node-forge": "^1" }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -20526,39 +13876,42 @@ } }, "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "dependencies": { - "semver": "^7.3.5" + "semver": "^6.3.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.4.1", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -20568,7 +13921,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -20576,75 +13928,70 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", + "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==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-handler": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", - "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", - "license": "MIT", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.1.5", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", + "path-to-regexp": "2.2.1", "range-parser": "1.2.0" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" }, "node_modules/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", - "license": "MIT", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dependencies": { - "accepts": "~1.3.8", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.8.0", - "mime-types": "~2.1.35", - "parseurl": "~1.3.3" + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "engines": { "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -20653,137 +14000,75 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/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==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "~0.19.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -20794,14 +14079,12 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "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==", - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -20813,90 +14096,42 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", - "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20905,18 +14140,16 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "license": "MIT", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" }, "engines": { "node": ">= 10" @@ -20925,14 +14158,12 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/sitemap": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", - "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", - "license": "MIT", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -20950,83 +14181,46 @@ "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", "engines": { "node": ">= 6.3.0" } }, "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { - "node": ">= 12" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "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" } @@ -21035,72 +14229,24 @@ "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==", - "license": "MIT", "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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -21116,7 +14262,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -21129,80 +14274,79 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.0.tgz", + "integrity": "sha512-cNNS+VYsXIs5gI6gJipO4qZ8YYT274JHvNnQ1/R/x8Q8mdP0qj0zoMchRXmBNPqp/0eOEhX+3g7g6Fgb7meLIQ==" }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-replace-loader": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.3.0.tgz", - "integrity": "sha512-AZ3y7ktSHhd/Ebipczkp6vdfp01d2kQVwFujCGAgmogTB8t4dRhbsRGDKnyZAYqBbIA9QW7+D/IsACVJOOpcBg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", + "integrity": "sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==", "dev": true, - "license": "MIT", "dependencies": { - "schema-utils": "^4" - }, - "engines": { - "node": ">=4" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^5" } }, + "node_modules/string-replace-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": 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/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -21215,34 +14359,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { "node": ">=12" }, @@ -21251,12 +14371,11 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -21266,58 +14385,33 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -21327,47 +14421,38 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dev": true, "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -21377,11 +14462,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -21395,21 +14489,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "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, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -21421,7 +14500,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -21430,7 +14508,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -21439,7 +14516,6 @@ "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==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -21447,51 +14523,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", "dependencies": { - "inline-style-parser": "0.2.7" + "inline-style-parser": "0.1.1" } }, "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "license": "MIT", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": "^14 || ^16 || >=18.0" + "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { - "postcss": "^8.4.31" + "postcss": "^8.2.15" } }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, "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==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21503,7 +14561,6 @@ "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==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -21514,80 +14571,130 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svgo": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", - "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", - "license": "MIT", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dependencies": { + "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", "picocolors": "^1.0.0", - "sax": "^1.5.0" + "stable": "^0.1.8" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" + "node": ">=10.13.0" } }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", "engines": { "node": ">= 10" } }, - "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", - "dev": true, - "license": "MIT", + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { - "@pkgr/core": "^0.2.9" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/synckit": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", + "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/synckit" + "url": "https://opencollective.com/unts" } }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", - "license": "MIT", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", - "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", - "license": "BSD-2-Clause", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -21599,15 +14706,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", - "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", - "license": "MIT", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "engines": { "node": ">= 10.13.0" @@ -21635,7 +14742,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -21645,11 +14751,27 @@ "node": ">= 10.13.0" } }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "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/terser-webpack-plugin/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==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21663,114 +14785,89 @@ "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==", - "license": "MIT" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "node_modules/thingies": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", - "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", - "license": "MIT", + "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==" + }, + "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": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" + "node": ">=0.8" } }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } }, "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "node_modules/tinyexec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", - "license": "MIT", + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=6" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -21781,146 +14878,69 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "engines": { "node": ">=6" } }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/tree-sitter": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", - "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.0" - } + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, - "node_modules/tree-sitter-devicetree": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/tree-sitter-devicetree/-/tree-sitter-devicetree-0.12.1.tgz", - "integrity": "sha512-JccTH8TmgO9B4tAaCEZ8O7yOEtoixBRRnNZYO8W9tnNsv29Y+avsN6V8li2CfwooB1eqZIEbsPLKxN/e7bG+Cg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.2.1", - "node-gyp-build": "^4.8.2" - }, - "peerDependencies": { - "tree-sitter": "^0.21.0" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true }, "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, - "license": "MIT", + "devOptional": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -21932,7 +14952,6 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -21944,7 +14963,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -21957,7 +14975,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -21966,7 +14983,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -21975,32 +14991,29 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "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.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "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, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -22010,19 +15023,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "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, - "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -22032,125 +15042,89 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "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, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=12.20" } }, - "node_modules/typescript-eslint": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.2.tgz", - "integrity": "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.57.2", - "@typescript-eslint/parser": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2", - "@typescript-eslint/utils": "8.57.2" - }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": "*" } }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.2", "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "license": "MIT", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "engines": { "node": ">=4" } @@ -22159,7 +15133,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -22169,266 +15142,144 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "engines": { "node": ">=4" } }, "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", + "bail": "^1.0.0", "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/unified-engine": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.2.tgz", - "integrity": "sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==", - "dev": true, - "license": "MIT", + "node_modules/unified/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "dependencies": { - "@types/concat-stream": "^2.0.0", - "@types/debug": "^4.0.0", - "@types/is-empty": "^1.0.0", - "@types/node": "^22.0.0", - "@types/unist": "^3.0.0", - "concat-stream": "^2.0.0", - "debug": "^4.0.0", - "extend": "^3.0.0", - "glob": "^10.0.0", - "ignore": "^6.0.0", - "is-empty": "^1.0.0", - "is-plain-obj": "^4.0.0", - "load-plugin": "^6.0.0", - "parse-json": "^7.0.0", - "trough": "^2.0.0", - "unist-util-inspect": "^8.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0", - "vfile-reporter": "^8.0.0", - "vfile-statistics": "^3.0.0", - "yaml": "^2.0.0" + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/unified-engine/node_modules/@types/node": { - "version": "22.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", - "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/unified-engine/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/unified-engine/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/unified-engine/node_modules/ignore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/unified-engine/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unified-engine/node_modules/lines-and-columns": { + "node_modules/unified/node_modules/vfile-message": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/unified-engine/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unified-engine/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unified-engine/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unified-engine/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dependencies": { - "crypto-random-string": "^4.0.0" + "crypto-random-string": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/unist-util-inspect": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", - "integrity": "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz", + "integrity": "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==", + "dev": true, "dependencies": { - "@types/unist": "^3.0.0" + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" }, "funding": { "type": "opencollective", @@ -22436,12 +15287,11 @@ } }, "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dependencies": { - "@types/unist": "^3.0.0" + "@types/unist": "^2.0.2" }, "funding": { "type": "opencollective", @@ -22449,14 +15299,13 @@ } }, "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" }, "funding": { "type": "opencollective", @@ -22464,13 +15313,12 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" }, "funding": { "type": "opencollective", @@ -22478,10 +15326,9 @@ } }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } @@ -22490,15 +15337,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "funding": [ { "type": "opencollective", @@ -22507,112 +15353,154 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { - "update-browserslist-db": "cli.js" + "browserslist-lint": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "license": "BSD-2-Clause", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "license": "MIT", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "engines": { - "node": ">=14.16" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=8" + } + }, + "node_modules/update-notifier/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==", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -22639,7 +15527,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -22648,7 +15535,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -22657,10 +15543,9 @@ } }, "node_modules/url-loader/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==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -22674,23 +15559,76 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.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==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", "engines": { "node": ">= 4" } @@ -22699,68 +15637,68 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist/bin/uuid" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "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/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/uvu/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==", "dev": true, - "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" } }, "node_modules/value-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" + "@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", @@ -22768,212 +15706,76 @@ } }, "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-reporter": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz", - "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==", + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/supports-color": "^8.0.0", - "string-width": "^6.0.0", - "supports-color": "^9.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0", - "vfile-sort": "^4.0.0", - "vfile-statistics": "^3.0.0" + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-reporter/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/vfile/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/vfile-reporter/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/vfile-reporter/node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", - "dev": true, - "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vfile-reporter/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/vfile-reporter/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/vfile-sort": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-4.0.0.tgz", - "integrity": "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-statistics": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-3.0.0.tgz", - "integrity": "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==", - "dev": true, - "license": "MIT", + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", "dependencies": { - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" }, "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "license": "MIT" - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true, - "license": "ISC" - }, "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "license": "MIT", + "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" @@ -22986,58 +15788,58 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/web-tree-sitter": { - "version": "0.24.7", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.7.tgz", - "integrity": "sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==", - "license": "MIT" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.105.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", - "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", - "license": "MIT", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", + "@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.20.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.14.1", + "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.11", + "graceful-fs": "^4.2.9", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", + "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.17", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.4" + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -23056,22 +15858,18 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "license": "MIT", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dependencies": { - "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", + "lodash": "^4.17.20", "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", + "sirv": "^1.0.7", "ws": "^7.3.1" }, "bin": { @@ -23085,172 +15883,221 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "license": "MIT", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dependencies": { "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } + "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "^1.54.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/webpack-dev-server": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz", - "integrity": "sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==", - "license": "MIT", + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.25", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", "colorette": "^2.0.10", - "compression": "^1.8.1", + "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "express": "^4.22.1", + "default-gateway": "^6.0.3", + "express": "^4.17.3", "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^5.5.0", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { - "webpack": { - "optional": true - }, "webpack-cli": { "optional": true } } }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "license": "MIT", + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">=18" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "license": "MIT", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -23262,24 +16109,21 @@ } }, "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "license": "MIT", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dependencies": { "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" + "wildcard": "^2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10.0.0" } }, "node_modules/webpack-sources": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", - "license": "MIT", + "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==", "engines": { "node": ">=10.13.0" } @@ -23288,7 +16132,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -23301,7 +16144,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -23310,7 +16152,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -23319,7 +16160,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -23327,38 +16167,44 @@ "node": ">= 0.6" } }, - "node_modules/webpackbar": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", - "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", - "license": "MIT", + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dependencies": { - "ansis": "^3.2.0", - "consola": "^3.2.3", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=14.21.3" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" }, "peerDependencies": { - "@rspack/core": "*", "webpack": "3 || 4 || 5" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } } }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -23372,16 +16218,23 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -23393,45 +16246,39 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "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.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "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, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", + "is-regex": "^1.1.4", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -23444,42 +16291,34 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, - "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "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.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, - "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "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" @@ -23492,7 +16331,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -23504,26 +16342,23 @@ } }, "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "license": "MIT" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "devOptional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -23536,52 +16371,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { "node": ">=12" }, @@ -23590,10 +16383,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { "node": ">=12" }, @@ -23602,12 +16394,11 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -23619,15 +16410,12 @@ "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, - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -23636,10 +16424,9 @@ } }, "node_modules/ws": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", - "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", - "license": "MIT", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -23656,53 +16443,18 @@ } } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -23710,34 +16462,31 @@ "xml-js": "bin/cli.js" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">= 6" } }, "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, - "license": "MIT", "engines": { "node": ">=10" }, @@ -23746,14 +16495,11806 @@ } }, "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==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "requires": { + "@algolia/autocomplete-shared": "1.7.4" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "requires": { + "@algolia/autocomplete-shared": "1.7.4" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", + "requires": { + "@algolia/cache-common": "4.17.0" + } + }, + "@algolia/cache-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" + }, + "@algolia/cache-in-memory": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", + "requires": { + "@algolia/cache-common": "4.17.0" + } + }, + "@algolia/client-account": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-analytics": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", + "requires": { + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-personalization": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/client-search": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", + "requires": { + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "@algolia/logger-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" + }, + "@algolia/logger-console": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", + "requires": { + "@algolia/logger-common": "4.17.0" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", + "requires": { + "@algolia/requester-common": "4.17.0" + } + }, + "@algolia/requester-common": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" + }, + "@algolia/requester-node-http": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", + "requires": { + "@algolia/requester-common": "4.17.0" + } + }, + "@algolia/transporter": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", + "requires": { + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" + } + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==" + }, + "@babel/core": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/generator": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "requires": { + "@babel/types": "^7.19.4", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "requires": { + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "requires": { + "@babel/types": "^7.19.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helpers": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "requires": { + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", + "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", + "requires": { + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.19.4", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.19.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, + "@docsearch/css": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" + }, + "@docsearch/react": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", + "requires": { + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", + "algoliasearch": "^4.0.0" + } + }, + "@docusaurus/core": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", + "requires": { + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^2.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + } + }, + "@docusaurus/cssnano-preset": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", + "requires": { + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + } + }, + "@docusaurus/logger": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", + "requires": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + } + }, + "@docusaurus/mdx-loader": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", + "requires": { + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + } + }, + "@docusaurus/module-type-aliases": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", + "requires": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + } + }, + "@docusaurus/plugin-content-blog": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + } + }, + "@docusaurus/plugin-content-docs": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "@types/react-router-config": "^5.0.6", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + } + }, + "@docusaurus/plugin-content-pages": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" + } + }, + "@docusaurus/plugin-debug": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-analytics": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-gtag": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-sitemap": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + } + }, + "@docusaurus/preset-classic": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" + } + }, + "@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "requires": { + "@types/react": "*", + "prop-types": "^15.6.2" + } + }, + "@docusaurus/theme-classic": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + } + }, + "@docusaurus/theme-common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", + "requires": { + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", + "utility-types": "^3.10.0" + } + }, + "@docusaurus/theme-search-algolia": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", + "requires": { + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^2.0.0", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + } + }, + "@docusaurus/theme-translations": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", + "requires": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + } + }, + "@docusaurus/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", + "requires": { + "@docusaurus/logger": "2.4.0", + "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + } + }, + "@docusaurus/utils-common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@docusaurus/utils-validation": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", + "requires": { + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + } + }, + "@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==", + "devOptional": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true + }, + "@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "devOptional": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "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" + }, + "dependencies": { + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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==", + "devOptional": true + } + } + }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true + }, + "@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", + "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.2" + }, + "dependencies": { + "@fortawesome/fontawesome-common-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", + "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==" + } + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "requires": { + "prop-types": "^15.8.1" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "devOptional": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true + }, + "@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==", + "devOptional": true + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@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==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "requires": {} + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@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==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "requires": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", + "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", + "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", + "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", + "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", + "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", + "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", + "@svgr/babel-plugin-transform-svg-component": "^6.5.0" + } + }, + "@svgr/core": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", + "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", + "requires": { + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", + "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", + "requires": { + "@babel/types": "^7.18.4", + "entities": "^4.3.0" + } + }, + "@svgr/plugin-jsx": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", + "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", + "requires": { + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/hast-util-to-babel-ast": "^6.5.0", + "svg-parser": "^2.0.4" + } + }, + "@svgr/plugin-svgo": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", + "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", + "requires": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + } + }, + "@svgr/webpack": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", + "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", + "requires": { + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "@svgr/plugin-svgo": "^6.5.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@tsconfig/docusaurus": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", + "dev": true + }, + "@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/eslint": { + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/lodash": { + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", + "dev": true + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/react": { + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-helmet": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-router": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "@types/react-router-config": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "requires": { + "@types/node": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "requires": { + "@types/node": "*" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@webassemblyjs/ast": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@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==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + } + } + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + }, + "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==", + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "devOptional": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "address": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "algoliasearch": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", + "requires": { + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" + } + }, + "algoliasearch-helper": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", + "requires": { + "@algolia/events": "^4.0.1" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "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==" + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "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, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "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 + }, + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "requires": { + "follow-redirects": "^1.14.7" + } + }, + "babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "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==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "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==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==" + }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "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==" + }, + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + }, + "cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "copy-text-to-clipboard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" + }, + "copy-to-clipboard": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", + "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "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==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + } + } + }, + "core-js": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==" + }, + "core-js-compat": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "requires": { + "browserslist": "^4.21.4" + } + }, + "core-js-pure": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "requires": {} + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + } + }, + "css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "requires": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "requires": { + "cssnano-preset-default": "^5.2.12", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "requires": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "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==", + "dev": true, + "requires": { + "character-entities": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "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==", + "devOptional": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "requires": { + "execa": "^5.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "requires": { + "address": "^1.0.1", + "debug": "4" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "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.5", + "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.10", + "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.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "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.10" + } + }, + "es-iterator-helpers": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "dev": true, + "requires": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "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.0", + "safe-array-concat": "^1.0.0" + } + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" + }, + "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, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "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, + "requires": { + "has": "^1.0.3" + } + }, + "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, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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==" + }, + "eslint": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "devOptional": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.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", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "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.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "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==", + "devOptional": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "devOptional": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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==", + "devOptional": true + } + } + }, + "eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "requires": {} + }, + "eslint-mdx": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.0.5.tgz", + "integrity": "sha512-1ZzcJwJNfladtuK+uuG/MdC0idc1e3d1vCI2STOq/pLcJBGuao2biWh90vEh2M93zDiNoHJGUIU7UAxupiiHFw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "cosmiconfig": "^7.0.1", + "espree": "^9.4.0", + "estree-util-visit": "^1.2.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "synckit": "^0.8.4", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "uvu": "^0.5.6", + "vfile": "^5.3.4" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@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" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@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" + } + }, + "remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "requires": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@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" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + } + } + }, + "eslint-plugin-markdown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", + "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.5" + } + }, + "eslint-plugin-mdx": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.0.5.tgz", + "integrity": "sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==", + "dev": true, + "requires": { + "eslint-mdx": "^2.0.5", + "eslint-plugin-markdown": "^3.0.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "vfile": "^5.3.4" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@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" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@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" + } + }, + "remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "requires": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@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" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "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, + "requires": { + "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" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "devOptional": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "devOptional": true + }, + "espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "devOptional": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "devOptional": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "estree-util-is-identifier-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz", + "integrity": "sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==", + "dev": true + }, + "estree-util-visit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.0.tgz", + "integrity": "sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eta": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "requires": { + "@types/node": "*", + "require-like": ">= 0.1.1" + } + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + } + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@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" + } + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "devOptional": true + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "requires": { + "punycode": "^1.3.2" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + } + }, + "fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "requires": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "requires": { + "xml-js": "^1.6.11" + } + }, + "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==", + "devOptional": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "devOptional": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "devOptional": true + }, + "flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "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, + "requires": { + "is-callable": "^1.1.3" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "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 + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "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==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "dev": true, + "requires": { + "@types/glob": "^7.1.3" + } + }, + "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==" + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "requires": { + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "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" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true + }, + "gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "requires": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "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==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "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, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } + } + }, + "html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + } + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "requires": { + "queue": "6.0.2" + } + }, + "immer": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "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==" + }, + "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, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "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 + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "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, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "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 + }, + "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 + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "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==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "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 + }, + "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, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "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 + }, + "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, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "iterator.prototype": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", + "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.3" + } + }, + "jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", + "requires": { + "@types/node": "*", + "jest-util": "^29.2.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.6.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz", + "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "devOptional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "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==" + }, + "json-schema-to-typescript": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.1.1.tgz", + "integrity": "sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==", + "dev": true, + "requires": { + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" + } + }, + "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==" + }, + "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==", + "devOptional": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + }, + "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==" + }, + "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==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "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==", + "devOptional": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "longest-streak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", + "dev": true + }, + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-mdx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz", + "integrity": "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==", + "dev": true, + "requires": { + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0" + } + }, + "mdast-util-mdx-expression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz", + "integrity": "sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@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" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@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" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "mdast-util-mdx-jsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz", + "integrity": "sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "ccount": "^2.0.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" + }, + "dependencies": { + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true + }, + "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==", + "dev": true + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "parse-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz", + "integrity": "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==", + "dev": true, + "requires": { + "@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" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-remove-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz", + "integrity": "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + } + } + }, + "mdast-util-mdxjs-esm": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz", + "integrity": "sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@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" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@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" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^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" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, + "zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true + } + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "micromark-core-commonmark": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, + "requires": { + "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" + } + }, + "micromark-extension-mdx-expression": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz", + "integrity": "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==", + "dev": true, + "requires": { + "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" + } + }, + "micromark-extension-mdx-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz", + "integrity": "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==", + "dev": true, + "requires": { + "@types/acorn": "^4.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" + } + }, + "micromark-extension-mdx-md": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz", + "integrity": "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-mdxjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz", + "integrity": "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==", + "dev": true, + "requires": { + "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" + } + }, + "micromark-extension-mdxjs-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz", + "integrity": "sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==", + "dev": true, + "requires": { + "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" + } + }, + "micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-mdx-expression": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz", + "integrity": "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==", + "dev": true, + "requires": { + "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", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, + "requires": { + "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" + } + }, + "micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, + "requires": { + "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" + } + }, + "micromark-util-encode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true + }, + "micromark-util-events-to-acorn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz", + "integrity": "sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==", + "dev": true, + "requires": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-location": "^4.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + } + } + }, + "micromark-util-html-tag-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true + }, + "micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-util-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true + }, + "micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "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==" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "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==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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==" + }, + "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==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "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==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "devOptional": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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==" + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==" + }, + "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==" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} + }, + "postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-loader": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" + } + }, + "postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "requires": { + "sort-css-media-queries": "2.1.0" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "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==" + }, + "postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "requires": {} + }, + "prebuild-webpack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prebuild-webpack-plugin/-/prebuild-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-H5/VnSl7KZm3NCGj1+8BrBHu0Bn9xzLREdpeE4TRYyp4t4qFnYPExzozk2sfD/CLJRGIuyOFrXbXgJJ4ETdz/g==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "glob": "^7.1.5", + "minimatch": "^3.0.4" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" + }, + "prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "dev": true + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "requires": {} + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "requires": { + "inherits": "~2.0.3" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-async": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/react-async/-/react-async-10.0.1.tgz", + "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==", + "requires": {} + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "requires": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + } + }, + "react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "requires": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "requires": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + } + }, + "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==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-loadable": { + "version": "npm:@docusaurus/react-loadable@5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "requires": { + "@types/react": "*", + "prop-types": "^15.6.2" + } + }, + "react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "requires": { + "@babel/runtime": "^7.10.3" + } + }, + "react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-textarea-autosize": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", + "requires": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + } + }, + "react-toastify": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-7.0.4.tgz", + "integrity": "sha512-Rol7+Cn39hZp5hQ/k6CbMNE2CKYV9E5OQdC/hBLtIQU2xz7DdAm7xil4NITQTHR6zEbE5RVFbpgSwTD7xRGLeQ==", + "requires": { + "clsx": "^1.1.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "requires": { + "minimatch": "^3.0.5" + } + }, + "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, + "requires": { + "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" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "regexpu-core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "requires": { + "rc": "1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "requires": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "remark-stringify": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@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" + } + } + } + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "requires": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "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==" + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "requires": { + "node-forge": "^1" + } + }, + "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==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + } + } + }, + "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==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "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==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "requires": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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==" + }, + "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==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "std-env": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.0.tgz", + "integrity": "sha512-cNNS+VYsXIs5gI6gJipO4qZ8YYT274JHvNnQ1/R/x8Q8mdP0qj0zoMchRXmBNPqp/0eOEhX+3g7g6Fgb7meLIQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-replace-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", + "integrity": "sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dev": true, + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "dependencies": { + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "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==" + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "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==" + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, + "synckit": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", + "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "terser": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "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==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "dependencies": { + "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==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "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, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + } + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "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, + "requires": { + "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" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" + }, + "ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-position-from-estree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz", + "integrity": "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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==" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "requires": {} + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "requires": { + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "dependencies": { + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + } + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vfile": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "requires": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + }, + "web-tree-sitter": { + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "webpack": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "requires": { + "@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.14.1", + "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.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "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==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "ws": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", + "requires": {} + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "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==" + }, + "webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "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, + "requires": { + "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" + } + }, + "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, + "requires": { + "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" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "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, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "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, + "requires": { + "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" + } + }, + "widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "requires": { + "string-width": "^5.0.1" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "devOptional": true + }, + "wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "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==" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } } } diff --git a/docs/package.json b/docs/package.json index da9745fe..aa48af24 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,28 +9,26 @@ "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", - "lint": "eslint", + "lint": "eslint . --ext js,jsx,md,mdx", "prettier:check": "prettier --check .", "prettier:format": "prettier --write .", "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^3.10.1", - "@docusaurus/preset-classic": "^3.10.1", - "@docusaurus/theme-mermaid": "^3.10.1", - "@fortawesome/fontawesome-svg-core": "^6.7.1", - "@fortawesome/free-solid-svg-icons": "^6.7.1", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", + "@fortawesome/fontawesome-svg-core": "^6.4.2", + "@fortawesome/free-solid-svg-icons": "^6.4.0", "@fortawesome/react-fontawesome": "^0.2.0", - "@mdx-js/react": "^3.1.0", + "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", - "js-yaml": "^4.1.1", - "react": "^18.0.0", + "js-yaml": "^4.1.0", + "react": "^17.0.2", "react-async": "^10.0.1", "react-copy-to-clipboard": "^5.0.3", - "react-dom": "^18.0.0", - "react-toastify": "^10.0.6", - "tree-sitter-devicetree": "^0.12.1", - "web-tree-sitter": "^0.24.3" + "react-dom": "^17.0.2", + "react-toastify": "^7.0.4", + "web-tree-sitter": "^0.20.8" }, "browserslist": { "production": [ @@ -45,27 +43,24 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", - "@eslint/js": "^9.39.2", - "@types/glob": "^8.1.0", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^18.3.12", + "@types/react": "^17.0.58", "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", - "eslint": "^9.39.2", - "eslint-plugin-mdx": "^3.6.2", - "eslint-plugin-react": "^7.37.5", - "globals": "^17.6.0", - "json-schema-to-typescript": "^15.0.3", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-mdx": "^2.0.5", + "eslint-plugin-react": "^7.33.2", + "json-schema-to-typescript": "^13.1.1", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^3.7.4", - "string-replace-loader": "^3.3.0", - "typescript": "^5.9.3", - "typescript-eslint": "^8.52.0", - "webpack": "^5.104.1" + "prettier": "^2.8.7", + "string-replace-loader": "^3.1.0", + "typescript": "^5.0.4", + "webpack": "^5.86.0" } } diff --git a/docs/sidebars.js b/docs/sidebars.js index 167527f5..43f17b41 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -1,242 +1,95 @@ module.exports = { - docs: [ - { - type: "category", - label: "Getting Started", - link: { - type: "doc", - id: "intro", + docs: { + "Getting Started": [ + "intro", + "hardware", + "faq", + "user-setup", + "customization", + "troubleshooting", + ], + Features: [ + "features/keymaps", + "features/bluetooth", + "features/combos", + "features/conditional-layers", + "features/debouncing", + "features/displays", + "features/encoders", + "features/underglow", + "features/backlight", + "features/battery", + "features/beta-testing", + ], + Behaviors: [ + "behaviors/key-press", + "behaviors/layers", + "behaviors/misc", + "behaviors/hold-tap", + "behaviors/mod-tap", + "behaviors/mod-morph", + "behaviors/macros", + "behaviors/key-toggle", + "behaviors/sticky-key", + "behaviors/sticky-layer", + "behaviors/tap-dance", + "behaviors/caps-word", + "behaviors/key-repeat", + "behaviors/sensor-rotate", + "behaviors/reset", + "behaviors/bluetooth", + "behaviors/outputs", + "behaviors/underglow", + "behaviors/backlight", + "behaviors/power", + ], + Codes: [ + "codes/index", + "codes/keyboard-keypad", + "codes/modifiers", + "codes/editing", + "codes/media", + "codes/applications", + "codes/input-assist", + "codes/power", + "codes/keymap-upgrader", + ], + Configuration: [ + "config/index", + "config/backlight", + "config/battery", + "config/behaviors", + "config/bluetooth", + "config/combos", + "config/displays", + "config/encoders", + "config/keymap", + "config/kscan", + "config/power", + "config/underglow", + "config/system", + ], + Development: [ + "development/clean-room", + "development/pre-commit", + "development/documentation", + "development/setup", + "development/build-flash", + "development/boards-shields-keymaps", + "development/posix-board", + "development/tests", + "development/usb-logging", + "development/ide-integration", + { + type: "category", + label: "Guides", + collapsed: false, + items: [ + "development/new-shield", + "development/hardware-metadata-files", + "development/new-behavior", + ], }, - collapsed: false, - items: [ - "hardware", - "faq", - "user-setup", - "customization", - "zmk-cli", - { - type: "category", - label: "Troubleshooting", - link: { - type: "doc", - id: "troubleshooting/index", - }, - collapsed: true, - items: [ - "troubleshooting/building-issues", - "troubleshooting/flashing-issues", - "troubleshooting/connection-issues", - "troubleshooting/hardware-issues", - ], - }, - ], - }, - { - Features: [ - "features/bluetooth", - "features/modules", - "features/split-keyboards", - "features/debouncing", - "features/battery", - "features/led-indicators", - "features/low-power-states", - "features/encoders", - "features/pointing", - "features/displays", - "features/lighting", - "features/studio", - ], - }, - { - type: "category", - label: "Keymaps", - link: { - type: "doc", - id: "keymaps/index", - }, - collapsed: true, - items: [ - { - type: "category", - label: "Behaviors", - link: { - type: "doc", - id: "keymaps/behaviors/index", - }, - collapsed: true, - items: [ - "keymaps/behaviors/key-press", - "keymaps/behaviors/layers", - "keymaps/behaviors/misc", - "keymaps/behaviors/hold-tap", - "keymaps/behaviors/mod-morph", - "keymaps/behaviors/macros", - "keymaps/behaviors/key-toggle", - "keymaps/behaviors/sticky-key", - "keymaps/behaviors/sticky-layer", - "keymaps/behaviors/tap-dance", - "keymaps/behaviors/caps-word", - "keymaps/behaviors/key-repeat", - "keymaps/behaviors/sensor-rotate", - "keymaps/behaviors/mouse-emulation", - "keymaps/behaviors/reset", - "keymaps/behaviors/bluetooth", - "keymaps/behaviors/outputs", - "keymaps/behaviors/underglow", - "keymaps/behaviors/backlight", - "keymaps/behaviors/power", - "keymaps/behaviors/soft-off", - "keymaps/behaviors/studio-unlock", - ], - }, - "keymaps/modifiers", - "keymaps/combos", - "keymaps/conditional-layers", - "keymaps/list-of-keycodes", - { - type: "category", - label: "Input Processors", - link: { - type: "doc", - id: "keymaps/input-processors/index", - }, - collapsed: true, - items: [ - "keymaps/input-processors/usage", - "keymaps/input-processors/scaler", - "keymaps/input-processors/transformer", - "keymaps/input-processors/code-mapper", - "keymaps/input-processors/temp-layer", - "keymaps/input-processors/behaviors", - ], - }, - ], - }, - { - type: "category", - label: "Configuration", - link: { - type: "doc", - id: "config/index", - }, - collapsed: true, - items: [ - "config/battery", - "config/behaviors", - "config/bluetooth", - "config/bootloader", - "config/combos", - "config/displays", - "config/encoders", - "config/led-indicators", - "config/lighting", - "config/pointing", - "config/keymap", - "config/layout", - "config/kscan", - "config/power", - "config/settings", - "config/split", - "config/system", - "config/studio", - ], - }, - { - type: "category", - label: "Hardware Integration", - link: { - type: "doc", - id: "hardware-integration/index", - }, - collapsed: true, - items: [ - "hardware-integration/new-board", - "hardware-integration/new-shield", - "hardware-integration/physical-layouts", - "hardware-integration/hardware-metadata-files", - "hardware-integration/pinctrl", - "hardware-integration/dongle", - "hardware-integration/shift-registers", - "hardware-integration/encoders", - "hardware-integration/soft-off-setup", - "hardware-integration/pointing", - "hardware-integration/battery", - { - type: "category", - label: "Bootloader", - link: { - type: "doc", - id: "hardware-integration/bootloader/index", - }, - collapsed: true, - items: [ - "hardware-integration/bootloader/adafruit-nrf52", - "hardware-integration/bootloader/tinyuf2", - "hardware-integration/bootloader/samd21-uf2", - "hardware-integration/bootloader/rp2", - "hardware-integration/bootloader/stm32", - ], - }, - { - type: "category", - label: "Lighting", - link: { - type: "doc", - id: "hardware-integration/lighting/index", - }, - collapsed: true, - items: [ - "hardware-integration/lighting/underglow", - "hardware-integration/lighting/backlight", - "hardware-integration/lighting/led-indicators", - ], - }, - ], - }, - { - Development: [ - { - type: "category", - label: "Contributing", - collapsed: true, - items: [ - "development/contributing/clean-room", - "development/contributing/pull-requests", - "development/contributing/documentation", - ], - }, - { - type: "category", - label: "Local Toolchain", - collapsed: true, - items: [ - { - type: "category", - label: "Setup", - link: { - type: "doc", - id: "development/local-toolchain/setup/index", - }, - collapsed: true, - items: [ - "development/local-toolchain/setup/container", - "development/local-toolchain/setup/native", - ], - }, - "development/local-toolchain/build-flash", - "development/local-toolchain/pre-commit", - "development/local-toolchain/ide-integration", - "development/local-toolchain/tests", - "development/local-toolchain/posix-board", - ], - }, - "development/module-creation", - "development/usb-logging", - "development/devicetree", - "development/studio-rpc-protocol", - "development/new-behavior", - "development/events", - ], - }, - ], + ], + }, }; diff --git a/docs/src/components/KeymapUpgrader/index.jsx b/docs/src/components/KeymapUpgrader/index.jsx index fdd4db4b..8d3a60b2 100644 --- a/docs/src/components/KeymapUpgrader/index.jsx +++ b/docs/src/components/KeymapUpgrader/index.jsx @@ -7,11 +7,7 @@ import React from "react"; import { useAsync } from "react-async"; -import { - initParser, - upgradeKeymap, - rangesToLineNumbers, -} from "@site/src/keymap-upgrade"; +import { initParser, upgradeKeymap } from "@site/src/keymap-upgrade"; import CodeBlock from "@theme/CodeBlock"; import styles from "./styles.module.css"; @@ -32,15 +28,7 @@ export default function KeymapUpgrader() { function Editor() { const [keymap, setKeymap] = React.useState(""); - - const { text: upgraded, changedRanges } = upgradeKeymap(keymap); - const highlights = rangesToLineNumbers(upgraded, changedRanges); - - let title = "Upgraded Keymap"; - - if (keymap && upgraded === keymap) { - title += " (No Changes)"; - } + const upgraded = upgradeKeymap(keymap); return (
@@ -52,9 +40,7 @@ function Editor() { onChange={(e) => setKeymap(e.target.value)} >
- - {upgraded} - + {upgraded}
); diff --git a/docs/src/components/KeymapUpgrader/styles.module.css b/docs/src/components/KeymapUpgrader/styles.module.css index f44cf323..31e06b97 100644 --- a/docs/src/components/KeymapUpgrader/styles.module.css +++ b/docs/src/components/KeymapUpgrader/styles.module.css @@ -9,7 +9,6 @@ font-size: var(--ifm-font-size-base); line-height: var(--ifm-pre-line-height); tab-size: 4; - resize: vertical; color: var(--ifm-pre-color); background-color: var(--ifm-pre-background); diff --git a/docs/src/components/codes/Context.jsx b/docs/src/components/codes/Context.jsx index a889af37..4fdcbfc0 100644 --- a/docs/src/components/codes/Context.jsx +++ b/docs/src/components/codes/Context.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; export default function Context({ children }) { diff --git a/docs/src/components/codes/Description.jsx b/docs/src/components/codes/Description.jsx index c37e54d5..7ad5fc2c 100644 --- a/docs/src/components/codes/Description.jsx +++ b/docs/src/components/codes/Description.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; const specialCharactersRegex = diff --git a/docs/src/components/codes/Footnote.jsx b/docs/src/components/codes/Footnote.jsx index 6ec16740..c9396a30 100644 --- a/docs/src/components/codes/Footnote.jsx +++ b/docs/src/components/codes/Footnote.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; export default function Footnote({ children, symbol, id }) { diff --git a/docs/src/components/codes/FootnoteRef.jsx b/docs/src/components/codes/FootnoteRef.jsx index 6f7ecf80..c7b11a7d 100644 --- a/docs/src/components/codes/FootnoteRef.jsx +++ b/docs/src/components/codes/FootnoteRef.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; export default function FootnoteRef({ children, anchor }) { diff --git a/docs/src/components/codes/FootnoteRefs.jsx b/docs/src/components/codes/FootnoteRefs.jsx index 05253683..3782c13f 100644 --- a/docs/src/components/codes/FootnoteRefs.jsx +++ b/docs/src/components/codes/FootnoteRefs.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import FootnoteRef from "./FootnoteRef"; diff --git a/docs/src/components/codes/Footnotes.jsx b/docs/src/components/codes/Footnotes.jsx index 300cdff6..b382141f 100644 --- a/docs/src/components/codes/Footnotes.jsx +++ b/docs/src/components/codes/Footnotes.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import Footnote from "./Footnote"; diff --git a/docs/src/components/codes/LinkIcon.jsx b/docs/src/components/codes/LinkIcon.jsx index 123080c0..5bfeebd4 100644 --- a/docs/src/components/codes/LinkIcon.jsx +++ b/docs/src/components/codes/LinkIcon.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faExternalLinkAlt } from "@fortawesome/free-solid-svg-icons"; export default function LinkIcon() { diff --git a/docs/src/components/codes/Name.jsx b/docs/src/components/codes/Name.jsx index 31c24891..52dc7347 100644 --- a/docs/src/components/codes/Name.jsx +++ b/docs/src/components/codes/Name.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import ToastyCopyToClipboard from "./ToastyCopyToClipboard"; diff --git a/docs/src/components/codes/OsLegend.jsx b/docs/src/components/codes/OsLegend.jsx index cd34e4fe..c53907fa 100644 --- a/docs/src/components/codes/OsLegend.jsx +++ b/docs/src/components/codes/OsLegend.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import operatingSystems from "@site/src/data/operating-systems"; export default function OsLegend() { diff --git a/docs/src/components/codes/OsSupport.jsx b/docs/src/components/codes/OsSupport.jsx index d34b499d..2cb60c97 100644 --- a/docs/src/components/codes/OsSupport.jsx +++ b/docs/src/components/codes/OsSupport.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import OsSupportIcon from "./OsSupportIcon"; import FootnoteRefs from "./FootnoteRefs"; diff --git a/docs/src/components/codes/OsSupportIcon.jsx b/docs/src/components/codes/OsSupportIcon.jsx index f3083ba9..a518d62a 100644 --- a/docs/src/components/codes/OsSupportIcon.jsx +++ b/docs/src/components/codes/OsSupportIcon.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; const Icon = ({ children, className, title }) => ( diff --git a/docs/src/components/codes/SpellingCaution.jsx b/docs/src/components/codes/SpellingCaution.jsx new file mode 100644 index 00000000..15ba9488 --- /dev/null +++ b/docs/src/components/codes/SpellingCaution.jsx @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: CC-BY-NC-SA-4.0 + */ + +import React from "react"; +import Admonition from "@theme/Admonition"; + +export default function SpellingCaution() { + return ( + +

+ Take extra notice of the spelling of the keycodes, especially the + shorthand spelling. Otherwise, it will result in an elusive parsing + error! +

+
+ ); +} + +SpellingCaution.propTypes = {}; diff --git a/docs/src/components/codes/Table.jsx b/docs/src/components/codes/Table.jsx index 6d1c0f27..0596de6a 100644 --- a/docs/src/components/codes/Table.jsx +++ b/docs/src/components/codes/Table.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import TableRow from "./TableRow"; import Footnotes from "./Footnotes"; diff --git a/docs/src/components/codes/TableRow.jsx b/docs/src/components/codes/TableRow.jsx index ae950ccb..a560911f 100644 --- a/docs/src/components/codes/TableRow.jsx +++ b/docs/src/components/codes/TableRow.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import Name from "./Name"; import Description from "./Description"; diff --git a/docs/src/components/codes/ToastyContainer.jsx b/docs/src/components/codes/ToastyContainer.jsx index 42f35acf..ee4e3bca 100644 --- a/docs/src/components/codes/ToastyContainer.jsx +++ b/docs/src/components/codes/ToastyContainer.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import { ToastContainer } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; diff --git a/docs/src/components/codes/ToastyCopyToClipboard.jsx b/docs/src/components/codes/ToastyCopyToClipboard.jsx index ba940611..b0e98092 100644 --- a/docs/src/components/codes/ToastyCopyToClipboard.jsx +++ b/docs/src/components/codes/ToastyCopyToClipboard.jsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ +import React from "react"; import PropTypes from "prop-types"; import { toast } from "react-toastify"; import { CopyToClipboard } from "react-copy-to-clipboard"; diff --git a/docs/src/components/columns.tsx b/docs/src/components/columns.tsx deleted file mode 100644 index 09172c2c..00000000 --- a/docs/src/components/columns.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { ReactNode, CSSProperties } from "react"; -import clsx from "clsx"; - -interface ColumnsProps { - children: ReactNode; - className?: string; - style?: CSSProperties; -} -// className will allow you to pass either your custom classes or the native infima classes https://infima.dev/docs/layout/grid. -// style will allow you to either pass your custom styles directly, which can be an alternative to the "styles.module.css" file in certain cases. -export function Columns({ children, className, style }: ColumnsProps) { - return ( -
-
- {children} -
-
- ); -} - -interface ColumnProps { - children: ReactNode; - className?: string; - style?: CSSProperties; -} -export function Column({ children, className, style }: ColumnProps) { - return ( -
- {children} -
- ); -} diff --git a/docs/src/components/custom-board-form.js b/docs/src/components/custom-board-form.js index 9b9795f5..e8ae4294 100644 --- a/docs/src/components/custom-board-form.js +++ b/docs/src/components/custom-board-form.js @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +import React from "react"; import PropTypes from "prop-types"; function CustomBoardForm({ diff --git a/docs/src/components/hardware-list.tsx b/docs/src/components/hardware-list.tsx index e027df3b..54034ada 100644 --- a/docs/src/components/hardware-list.tsx +++ b/docs/src/components/hardware-list.tsx @@ -1,3 +1,5 @@ +import React from "react"; + import Heading from "@theme/Heading"; import { HardwareMetadata } from "../hardware-metadata"; @@ -18,11 +20,12 @@ function itemHasMultiple(item: HardwareMetadata) { function itemIds(item: HardwareMetadata) { if (item.type == "board" || item.type == "shield") { - const nodes = (item.siblings ?? [item.id]) - .map((id) => {id}) - .reduce< - ElementOrString[] - >((prev, curr, index) => [...prev, index > 0 ? ", " : "", curr], []); + let nodes = (item.siblings ?? [item.id]) + .map((id) => {id}) + .reduce( + (prev, curr, index) => [...prev, index > 0 ? ", " : "", curr], + [] as ElementOrString[] + ); return {nodes}; } else { return {item.id}; @@ -80,38 +83,10 @@ function mapInterconnect({ } function HardwareList({ items }: HardwareListProps) { - const grouped = groupedMetadata(items); + let grouped = groupedMetadata(items); return ( <> -
- - Composite Keyboards - -

- Composite keyboards are composed of two main PCBs: a small controller{" "} - board with exposed pads, and a larger keyboard PCB (a{" "} - shield, in ZMK lingo) with switch footprints. The - board and shield share the same interconnect{" "} - standard, which defines the physical and electrical specifications for - the PCB-to-PCB connection. -

-

- Boards and shields that share the same interconnect are usually - compatible with each other but not always. Check hardware - compatibility before connecting them. -

-

- Designing a custom composite keyboard with an off-the-shelf controller - board? Check out the{" "} - - New Keyboard Shield - {" "} - guide. -

- - {Object.values(grouped.interconnects).map(mapInterconnect)} -
Onboard Controller Keyboards @@ -121,10 +96,6 @@ function HardwareList({ items }: HardwareListProps) { the components of a keyboard, including the controller chip, switch footprints, etc.

-

- Designing a custom keyboard with an onboard controller? Check out the{" "} - New Board guide. -

    {grouped["onboard"] .sort((a, b) => a.name.localeCompare(b.name)) @@ -133,6 +104,19 @@ function HardwareList({ items }: HardwareListProps) { ))}
+
+ + Composite Keyboards + +

+ Composite keyboards are composed of two main PCBs: a small controller + board with exposed pads, and a larger keyboard PCB (a shield, in ZMK + lingo) with switch footprints and a location where the controller is + added. This location is called an interconnect. Multiple interconnects + can be found below. +

+ {Object.values(grouped.interconnects).map(mapInterconnect)} +
); } diff --git a/docs/src/components/hardware-utils.ts b/docs/src/components/hardware-utils.ts index f6454bfb..76452dc3 100644 --- a/docs/src/components/hardware-utils.ts +++ b/docs/src/components/hardware-utils.ts @@ -21,7 +21,7 @@ function groupedBoard(agg: GroupedMetadata, board: Board) { agg.onboard.push(board); } else if (board.exposes) { board.exposes.forEach((element) => { - const ic = agg.interconnects[element] ?? { + let ic = agg.interconnects[element] ?? { boards: [], shields: [], }; @@ -37,12 +37,12 @@ function groupedBoard(agg: GroupedMetadata, board: Board) { function groupedShield(agg: GroupedMetadata, shield: Shield) { shield.requires.forEach((id) => { - const ic = agg.interconnects[id] ?? { boards: [], shields: [] }; + let ic = agg.interconnects[id] ?? { boards: [], shields: [] }; ic.shields.push(shield); agg.interconnects[id] = ic; }); shield.exposes?.forEach((id) => { - const ic = agg.interconnects[id] ?? { boards: [], shields: [] }; + let ic = agg.interconnects[id] ?? { boards: [], shields: [] }; ic.shields.push(shield); agg.interconnects[id] = ic; }); @@ -50,7 +50,7 @@ function groupedShield(agg: GroupedMetadata, shield: Shield) { } function groupedInterconnect(agg: GroupedMetadata, item: Interconnect) { - const ic = agg.interconnects[item.id] ?? { boards: [], shields: [] }; + let ic = agg.interconnects[item.id] ?? { boards: [], shields: [] }; ic.interconnect = item; agg.interconnects[item.id] = ic; diff --git a/docs/src/components/interconnect-tabs.tsx b/docs/src/components/interconnect-tabs.tsx index f76b0215..3ef69ebf 100644 --- a/docs/src/components/interconnect-tabs.tsx +++ b/docs/src/components/interconnect-tabs.tsx @@ -1,30 +1,32 @@ +import React from "react"; + import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import { HardwareMetadata, Interconnect } from "../hardware-metadata"; -import { groupedMetadata } from "./hardware-utils"; +import { groupedMetadata, InterconnectDetails } from "./hardware-utils"; interface InterconnectTabsProps { items: HardwareMetadata[]; - gpio: boolean; } -function mapInterconnect(interconnect: Interconnect, gpio: boolean) { - const content = require( - `@site/src/data/interconnects/${interconnect.id}/design_guideline.md` - ); - const imageUrl = require( - `@site/docs/assets/interconnects/${interconnect.id}/pinout.png` - ); +function mapInterconnect(interconnect: Interconnect) { + let content = require(`@site/src/data/interconnects/${interconnect.id}/design_guideline.md`); + let imageUrl = require(`@site/docs/assets/interconnects/${interconnect.id}/pinout.png`); + return ( - {gpio && } - {interconnect.node_labels && !gpio && ( + + + + {interconnect.node_labels && ( <> -

The following node labels are available:
    +
  • + GPIO: &{interconnect.node_labels.gpio} +
  • {interconnect.node_labels.i2c && (
  • I2C bus: &{interconnect.node_labels.i2c} @@ -56,19 +58,15 @@ function mapInterconnectValue(interconnect: Interconnect) { return { label: `${interconnect.name} Shields`, value: interconnect.id }; } -function InterconnectTabs({ items, gpio }: InterconnectTabsProps) { - const grouped = Object.values(groupedMetadata(items).interconnects) +function InterconnectTabs({ items }: InterconnectTabsProps) { + let grouped = Object.values(groupedMetadata(items).interconnects) .map((i) => i?.interconnect as Interconnect) .filter((i) => i?.design_guideline) .sort((a, b) => a.id.localeCompare(b.id)); return ( - - {grouped.map((items) => mapInterconnect(items, gpio))} + + {grouped.map(mapInterconnect)} ); } diff --git a/docs/src/components/power-estimate.js b/docs/src/components/power-estimate.js index 8405cd26..2c0a53cd 100644 --- a/docs/src/components/power-estimate.js +++ b/docs/src/components/power-estimate.js @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +import React from "react"; import PropTypes from "prop-types"; import { displayPower, diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index a0150549..d9cddb85 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -7,44 +7,21 @@ /* You can override the default Infima variables here. */ :root { + --ifm-color-primary: #026fc5; + --ifm-color-primary-dark: #0264b1; + --ifm-color-primary-darker: #025ea7; + --ifm-color-primary-darkest: #014e8a; + --ifm-color-primary-light: #027ad9; + --ifm-color-primary-lighter: #0280e3; + --ifm-color-primary-lightest: #0690fc; --ifm-code-font-size: 95%; - - --docusaurus-highlighted-code-line-bg: rgb(0 0 0 / 8%); - --docusaurus-highlighted-code-line-border-width: 5px; - --docusaurus-highlighted-code-line-border-color: var(--ifm-color-primary); } -[data-theme="dark"] { - --docusaurus-highlighted-code-line-bg: rgb(255 255 255 / 8%); -} - -.header-github-link::before { - content: ""; - width: 24px; - height: 24px; - display: flex; - background-color: var(--ifm-navbar-link-color); - mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E"); - transition: background-color var(--ifm-transition-fast) - var(--ifm-transition-timing-default); -} - -.header-github-link:hover::before { - background-color: var(--ifm-navbar-link-hover-color); -} - -.theme-code-block .theme-code-block-highlighted-line { - /* Line numbers have a solid color background which would cover the highlighted line */ - --ifm-pre-background: transparent; - - /* Add a colored block to the left of any highlighted lines */ - border-left: var(--docusaurus-highlighted-code-line-border-width) solid - var(--docusaurus-highlighted-code-line-border-color); - - padding-left: calc( - var(--ifm-pre-padding) - - var(--docusaurus-highlighted-code-line-border-width) - ); +.docusaurus-highlight-code-line { + background-color: rgb(72, 77, 91); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); } .video-container { @@ -64,12 +41,3 @@ width: 100%; height: 100%; } - -.secrettabs { - display: none; -} - -.full-width-table table { - width: 100%; - display: table; -} diff --git a/docs/src/css/power-estimate.css b/docs/src/css/power-estimate.css index 7da6a872..e876ec28 100644 --- a/docs/src/css/power-estimate.css +++ b/docs/src/css/power-estimate.css @@ -15,8 +15,7 @@ .powerEstimateBar { height: 64px; width: 100%; - box-shadow: - rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, + box-shadow: rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, rgba(0, 0, 0, 0.1) 0px 1px 4px 0px; border-radius: 64px; display: flex; diff --git a/docs/src/css/power-profiler.css b/docs/src/css/power-profiler.css index 0d5f8a25..a0c18928 100644 --- a/docs/src/css/power-profiler.css +++ b/docs/src/css/power-profiler.css @@ -9,8 +9,7 @@ padding: 10px 20px; background: var(--ifm-background-surface-color); border-radius: 4px; - box-shadow: - rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, + box-shadow: rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, rgba(0, 0, 0, 0.1) 0px 1px 4px 0px; } @@ -41,8 +40,7 @@ span[data-tooltip]::before { background: var(--ifm-background-surface-color); opacity: 0; visibility: hidden; - box-shadow: - rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, + box-shadow: rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, rgba(0, 0, 0, 0.1) 0px 1px 4px 0px; transition: opacity 0.2s ease; transform: translate(-50%, -100%); @@ -182,8 +180,7 @@ select > option { padding: 20px 20px; background: var(--ifm-background-surface-color); border-radius: 4px; - box-shadow: - rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, + box-shadow: rgba(0, 0, 0, 0.03) 0px 10px 20px 0px, rgba(0, 0, 0, 0.1) 0px 1px 4px 0px; width: 500px; } diff --git a/docs/src/data/footnotes.js b/docs/src/data/footnotes.js index 5b7ccab2..ab7f2724 100644 --- a/docs/src/data/footnotes.js +++ b/docs/src/data/footnotes.js @@ -4,24 +4,16 @@ * SPDX-License-Identifier: CC-BY-NC-SA-4.0 */ -import macosLanguage from "@site/docs/keymaps/_footnotes/macos-language.mdx"; -import macosInternational from "@site/docs/keymaps/_footnotes/macos-international.mdx"; -import example from "@site/docs/keymaps/_footnotes/example.mdx"; -import iosApplication from "@site/docs/keymaps/_footnotes/ios-application.mdx"; -import iosPower from "@site/docs/keymaps/_footnotes/ios-power.mdx"; -import macosEditing from "@site/docs/keymaps/_footnotes/macos-editing.mdx"; -import macosPower from "@site/docs/keymaps/_footnotes/macos-power.mdx"; -import macosUndoRedo from "@site/docs/keymaps/_footnotes/macos-undo-redo.mdx"; -import globe from "@site/docs/keymaps/_footnotes/globe.mdx"; +import example from "@site/docs/codes/_footnotes/example.mdx"; +import iosApplication from "@site/docs/codes/_footnotes/ios-application.mdx"; +import iosPower from "@site/docs/codes/_footnotes/ios-power.mdx"; +import macosPower from "@site/docs/codes/_footnotes/macos-power.mdx"; +import globe from "@site/docs/codes/_footnotes/globe.mdx"; export default { - macosLanguage, - macosInternational, example, iosApplication, iosPower, - macosEditing, macosPower, - macosUndoRedo, globe, }; diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index f094dd6f..96697bee 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -1378,7 +1378,7 @@ export default [ }, { names: ["TILDE2"], - description: "~ [Tilde] using shift and non-US hash/pound", + description: "~ [Tilde]", context: "Keyboard", clarify: false, usages: [ @@ -2376,7 +2376,7 @@ export default [ }, { names: ["KP_NUMBER_1", "KP_N1"], - description: "Keypad 1 and End", + description: "1", context: "Keypad", clarify: false, usages: [ @@ -2397,7 +2397,7 @@ export default [ }, { names: ["KP_NUMBER_2", "KP_N2"], - description: "Keypad 2 and Down Arrow", + description: "2", context: "Keypad", clarify: false, usages: [ @@ -2418,7 +2418,7 @@ export default [ }, { names: ["KP_NUMBER_3", "KP_N3"], - description: "Keypad 3 and Page Down", + description: "3", context: "Keypad", clarify: false, usages: [ @@ -2439,7 +2439,7 @@ export default [ }, { names: ["KP_NUMBER_4", "KP_N4"], - description: "Keypad 4 and Left Arrow", + description: "4", context: "Keypad", clarify: false, usages: [ @@ -2460,7 +2460,7 @@ export default [ }, { names: ["KP_NUMBER_5", "KP_N5"], - description: "Keypad 5", + description: "5", context: "Keypad", clarify: false, usages: [ @@ -2481,7 +2481,7 @@ export default [ }, { names: ["KP_NUMBER_6", "KP_N6"], - description: "Keypad 6 and Right Arrow", + description: "6", context: "Keypad", clarify: false, usages: [ @@ -2502,7 +2502,7 @@ export default [ }, { names: ["KP_NUMBER_7", "KP_N7"], - description: "Keypad 7 and Home", + description: "7", context: "Keypad", clarify: false, usages: [ @@ -2523,7 +2523,7 @@ export default [ }, { names: ["KP_NUMBER_8", "KP_N8"], - description: "Keypad 8 and Up Arrow", + description: "8", context: "Keypad", clarify: false, usages: [ @@ -2544,7 +2544,7 @@ export default [ }, { names: ["KP_NUMBER_9", "KP_N9"], - description: "Keypad 9 and Page Up", + description: "9", context: "Keypad", clarify: false, usages: [ @@ -2565,7 +2565,7 @@ export default [ }, { names: ["KP_NUMBER_0", "KP_N0"], - description: "Keypad 0 and Insert", + description: "0", context: "Keypad", clarify: false, usages: [ @@ -2586,7 +2586,7 @@ export default [ }, { names: ["KP_DOT"], - description: ". [Dot] and Delete", + description: ". [Dot]", context: "Keypad", clarify: false, usages: [ @@ -2628,7 +2628,7 @@ export default [ }, { names: ["PIPE2"], - description: "| [Pipe] using shift and non-US backslash", + description: "| [Pipe]", context: "Keyboard", clarify: false, usages: [ @@ -3092,12 +3092,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosEditing"], - }, + footnotes: {}, }, { names: ["K_UNDO"], @@ -3115,12 +3113,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosEditing"], - }, + footnotes: {}, }, { names: ["K_CUT"], @@ -3138,12 +3134,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosEditing"], - }, + footnotes: {}, }, { names: ["K_COPY"], @@ -3161,12 +3155,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosEditing"], - }, + footnotes: {}, }, { names: ["K_PASTE"], @@ -3184,12 +3176,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosEditing"], - }, + footnotes: {}, }, { names: ["K_FIND"], @@ -3249,7 +3239,7 @@ export default [ windows: false, linux: true, android: true, - macos: true, + macos: false, ios: null, }, footnotes: {}, @@ -3270,7 +3260,7 @@ export default [ windows: false, linux: true, android: true, - macos: true, + macos: false, ios: null, }, footnotes: {}, @@ -3396,12 +3386,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosInternational"], - }, + footnotes: {}, }, { names: ["INTERNATIONAL_2", "INT2", "INT_KATAKANAHIRAGANA", "INT_KANA"], @@ -3419,7 +3407,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3440,12 +3428,10 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosInternational"], - }, + footnotes: {}, }, { names: ["INTERNATIONAL_4", "INT4", "INT_HENKAN"], @@ -3463,7 +3449,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3484,7 +3470,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3505,7 +3491,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3526,7 +3512,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3547,7 +3533,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3568,7 +3554,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3589,12 +3575,10 @@ export default [ windows: true, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosLanguage"], - }, + footnotes: {}, }, { names: ["LANGUAGE_2", "LANG2", "LANG_HANJA"], @@ -3612,12 +3596,10 @@ export default [ windows: true, linux: true, android: false, - macos: true, + macos: null, ios: null, }, - footnotes: { - macos: ["macosLanguage"], - }, + footnotes: {}, }, { names: ["LANGUAGE_3", "LANG3", "LANG_KATAKANA"], @@ -3635,7 +3617,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3656,7 +3638,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3677,7 +3659,7 @@ export default [ windows: false, linux: true, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3698,7 +3680,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3719,7 +3701,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3740,7 +3722,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -3761,7 +3743,7 @@ export default [ windows: null, linux: false, android: false, - macos: true, + macos: null, ios: null, }, footnotes: {}, @@ -5042,7 +5024,7 @@ export default [ os: { windows: false, linux: true, - android: true, + android: null, macos: null, ios: null, }, @@ -5168,7 +5150,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -5189,9 +5171,9 @@ export default [ os: { windows: true, linux: true, - android: true, + android: null, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -5210,9 +5192,9 @@ export default [ os: { windows: true, linux: true, - android: true, + android: null, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -5231,7 +5213,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -5252,7 +5234,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -5273,7 +5255,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -5294,7 +5276,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -5905,7 +5887,7 @@ export default [ linux: true, android: true, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -5926,7 +5908,7 @@ export default [ linux: true, android: true, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -6029,7 +6011,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -6073,7 +6055,7 @@ export default [ linux: true, android: true, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -6114,8 +6096,8 @@ export default [ windows: true, linux: true, android: true, - macos: true, - ios: true, + macos: null, + ios: null, }, footnotes: {}, }, @@ -6157,7 +6139,7 @@ export default [ linux: true, android: true, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -6178,7 +6160,7 @@ export default [ linux: true, android: true, macos: true, - ios: true, + ios: null, }, footnotes: {}, }, @@ -6197,7 +6179,7 @@ export default [ os: { windows: false, linux: true, - android: false, + android: null, macos: null, ios: null, }, @@ -6471,8 +6453,8 @@ export default [ windows: null, linux: true, android: true, - macos: false, - ios: false, + macos: null, + ios: null, }, footnotes: {}, }, @@ -6555,8 +6537,8 @@ export default [ windows: null, linux: true, android: true, - macos: false, - ios: false, + macos: null, + ios: null, }, footnotes: {}, }, @@ -7164,7 +7146,7 @@ export default [ windows: false, linux: true, android: false, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7185,7 +7167,7 @@ export default [ windows: false, linux: true, android: false, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7206,7 +7188,7 @@ export default [ windows: false, linux: true, android: false, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7227,7 +7209,7 @@ export default [ windows: false, linux: true, android: false, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7647,7 +7629,7 @@ export default [ windows: false, linux: true, android: false, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7773,7 +7755,7 @@ export default [ windows: null, linux: true, android: null, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7794,7 +7776,7 @@ export default [ windows: null, linux: true, android: null, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7815,7 +7797,7 @@ export default [ windows: null, linux: true, android: null, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7836,7 +7818,7 @@ export default [ windows: null, linux: true, android: null, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7857,7 +7839,7 @@ export default [ windows: null, linux: true, android: null, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7878,7 +7860,7 @@ export default [ windows: null, linux: true, android: null, - macos: false, + macos: null, ios: null, }, footnotes: {}, @@ -7897,7 +7879,7 @@ export default [ documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=153", os: { windows: null, - linux: false, + linux: null, android: null, macos: true, ios: true, diff --git a/docs/src/data/keymap-upgrade.js b/docs/src/data/keymap-upgrade.js new file mode 100644 index 00000000..8e153828 --- /dev/null +++ b/docs/src/data/keymap-upgrade.js @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: CC-BY-NC-SA-4.0 + */ + +export const Codes = { + NUM_1: "N1", + NUM_2: "N2", + NUM_3: "N3", + NUM_4: "N4", + NUM_5: "N5", + NUM_6: "N6", + NUM_7: "N7", + NUM_8: "N8", + NUM_9: "N9", + NUM_0: "N0", + BKSP: "BSPC", + SPC: "SPACE", + EQL: "EQUAL", + TILD: "TILDE", + SCLN: "SEMI", + QUOT: "SQT", + GRAV: "GRAVE", + CMMA: "COMMA", + PRSC: "PSCRN", + SCLK: "SLCK", + PAUS: "PAUSE_BREAK", + PGUP: "PG_UP", + PGDN: "PG_DN", + RARW: "RIGHT", + LARW: "LEFT", + DARW: "DOWN", + UARW: "UP", + KDIV: "KP_DIVIDE", + KMLT: "KP_MULTIPLY", + KMIN: "KP_MINUS", + KPLS: "KP_PLUS", + UNDO: "K_UNDO", + CUT: "K_CUT", + COPY: "K_COPY", + PSTE: "K_PASTE", + VOLU: "K_VOL_UP", + VOLD: "K_VOL_DN", + CURU: "DLLR", + LPRN: "LPAR", + RPRN: "RPAR", + LCUR: "LBRC", + RCUR: "RBRC", + CRRT: "CARET", + PRCT: "PRCNT", + LABT: "LT", + RABT: "GT", + COLN: "COLON", + KSPC: null, + ATSN: "AT", + BANG: "EXCL", + LCTL: "LCTRL", + LSFT: "LSHIFT", + RCTL: "RCTRL", + RSFT: "RSHIFT", + M_NEXT: "C_NEXT", + M_PREV: "C_PREV", + M_STOP: "C_STOP", + M_EJCT: "C_EJECT", + M_PLAY: "C_PP", + M_MUTE: "C_MUTE", + M_VOLU: "C_VOL_UP", + M_VOLD: "C_VOL_DN", + GUI: "K_CMENU", + MOD_LCTL: "LCTRL", + MOD_LSFT: "LSHIFT", + MOD_LALT: "LALT", + MOD_LGUI: "LGUI", + MOD_RCTL: "RCTRL", + MOD_RSFT: "RSHIFT", + MOD_RALT: "RALT", + MOD_RGUI: "RGUI", +}; + +export const Behaviors = { + cp: "kp", + inc_dec_cp: "inc_dec_kp", + reset: "sys_reset", +}; diff --git a/docs/src/docusaurus-tree-sitter-plugin/index.js b/docs/src/docusaurus-tree-sitter-plugin/index.js index e7f5596b..a6952ce7 100644 --- a/docs/src/docusaurus-tree-sitter-plugin/index.js +++ b/docs/src/docusaurus-tree-sitter-plugin/index.js @@ -6,7 +6,6 @@ module.exports = function () { return { - name: "tree-sitter", configureWebpack(config, isServer) { let rules = []; diff --git a/docs/src/hardware-metadata-static-plugin/index.js b/docs/src/hardware-metadata-static-plugin/index.js index 6d475bc0..7fb6ad83 100644 --- a/docs/src/hardware-metadata-static-plugin/index.js +++ b/docs/src/hardware-metadata-static-plugin/index.js @@ -22,9 +22,9 @@ const METADATA_GLOB = path.posix.join(BASE_DIR, "app/boards/**/*.zmk.yml"); * @param {string} file */ async function readMetadata(file) { - const documents = /** @type HardwareMetadata[] */ ( - yaml.loadAll(await fs.readFile(file, "utf-8")) - ); + /** @type HardwareMetadata[] */ + // @ts-ignore + const documents = yaml.loadAll(await fs.readFile(file, "utf-8")); return documents.map( (metadata) => diff --git a/docs/src/keymap-upgrade.js b/docs/src/keymap-upgrade.js new file mode 100644 index 00000000..788ab31a --- /dev/null +++ b/docs/src/keymap-upgrade.js @@ -0,0 +1,245 @@ +import Parser from "web-tree-sitter"; + +import { Codes, Behaviors } from "./data/keymap-upgrade"; + +const TREE_SITTER_WASM_URL = new URL( + "/node_modules/web-tree-sitter/tree-sitter.wasm", + import.meta.url +); + +let Devicetree; + +export async function initParser() { + await Parser.init({ + locateFile: (path, prefix) => { + // When locating tree-sitter.wasm, use a path that Webpack can map to the correct URL. + if (path == "tree-sitter.wasm") { + return TREE_SITTER_WASM_URL.href; + } + return prefix + path; + }, + }); + Devicetree = await Parser.Language.load("/tree-sitter-devicetree.wasm"); +} + +function createParser() { + if (!Devicetree) { + throw new Error("Parser not loaded. Call initParser() first."); + } + + const parser = new Parser(); + parser.setLanguage(Devicetree); + return parser; +} + +export function upgradeKeymap(text) { + const parser = createParser(); + const tree = parser.parse(text); + + const edits = [...upgradeBehaviors(tree), ...upgradeKeycodes(tree)]; + + return applyEdits(text, edits); +} + +class TextEdit { + /** + * Creates a text edit to replace a range or node with new text. + * Construct with one of: + * + * * `Edit(startIndex, endIndex, newText)` + * * `Edit(node, newText)` + */ + constructor(startIndex, endIndex, newText) { + if (typeof startIndex !== "number") { + const node = startIndex; + newText = endIndex; + startIndex = node.startIndex; + endIndex = node.endIndex; + } + + /** @type number */ + this.startIndex = startIndex; + /** @type number */ + this.endIndex = endIndex; + /** @type string */ + this.newText = newText; + } +} + +/** + * Upgrades deprecated behavior references. + * @param {Parser.Tree} tree + */ +function upgradeBehaviors(tree) { + /** @type TextEdit[] */ + let edits = []; + + const query = Devicetree.query("(reference label: (identifier) @ref)"); + const matches = query.matches(tree.rootNode); + + for (const { captures } of matches) { + const node = findCapture("ref", captures); + if (node) { + edits.push(...getUpgradeEdits(node, Behaviors)); + } + } + + return edits; +} + +/** + * Upgrades deprecated key code identifiers. + * @param {Parser.Tree} tree + */ +function upgradeKeycodes(tree) { + /** @type TextEdit[] */ + let edits = []; + + // No need to filter to the bindings array. The C preprocessor would have + // replaced identifiers anywhere, so upgrading all identifiers preserves the + // original behavior of the keymap (even if that behavior wasn't intended). + const query = Devicetree.query("(identifier) @name"); + const matches = query.matches(tree.rootNode); + + for (const { captures } of matches) { + const node = findCapture("name", captures); + if (node) { + edits.push(...getUpgradeEdits(node, Codes, keycodeReplaceHandler)); + } + } + + return edits; +} + +/** + * @param {Parser.SyntaxNode} node + * @param {string | null} replacement + * @returns TextEdit[] + */ +function keycodeReplaceHandler(node, replacement) { + if (replacement) { + return [new TextEdit(node, replacement)]; + } + + const nodes = findBehaviorNodes(node); + + if (nodes.length === 0) { + console.warn( + `Found deprecated code "${node.text}" but it is not a parameter to a behavior` + ); + return [new TextEdit(node, `/* "${node.text}" no longer exists */`)]; + } + + const oldText = nodes.map((n) => n.text).join(" "); + const newText = `&none /* "${oldText}" no longer exists */`; + + const startIndex = nodes[0].startIndex; + const endIndex = nodes[nodes.length - 1].endIndex; + + return [new TextEdit(startIndex, endIndex, newText)]; +} + +/** + * Returns the node for the named capture. + * @param {string} name + * @param {any[]} captures + * @returns {Parser.SyntaxNode | null} + */ +function findCapture(name, captures) { + for (const c of captures) { + if (c.name === name) { + return c.node; + } + } + + return null; +} + +/** + * Given a parameter to a keymap behavior, returns a list of nodes beginning + * with the behavior and including all parameters. + * Returns an empty array if no behavior was found. + * @param {Parser.SyntaxNode} paramNode + */ +function findBehaviorNodes(paramNode) { + // Walk backwards from the given parameter to find the behavior reference. + let behavior = paramNode.previousNamedSibling; + while (behavior && behavior.type !== "reference") { + behavior = behavior.previousNamedSibling; + } + + if (!behavior) { + return []; + } + + // Walk forward from the behavior to collect all its parameters. + + let nodes = [behavior]; + let param = behavior.nextNamedSibling; + while (param && param.type !== "reference") { + nodes.push(param); + param = param.nextNamedSibling; + } + + return nodes; +} + +/** + * Gets a list of text edits to apply based on a node and a map of text + * replacements. + * + * If replaceHandler is given, it will be called if the node matches a + * deprecated value and it should return the text edits to apply. + * + * @param {Parser.SyntaxNode} node + * @param {Map} replacementMap + * @param {(node: Parser.SyntaxNode, replacement: string | null) => TextEdit[]} replaceHandler + */ +function getUpgradeEdits(node, replacementMap, replaceHandler = undefined) { + for (const [deprecated, replacement] of Object.entries(replacementMap)) { + if (node.text === deprecated) { + if (replaceHandler) { + return replaceHandler(node, replacement); + } else { + return [new TextEdit(node, replacement)]; + } + } + } + return []; +} + +/** + * Sorts a list of text edits in ascending order by position. + * @param {TextEdit[]} edits + */ +function sortEdits(edits) { + return edits.sort((a, b) => a.startIndex - b.startIndex); +} + +/** + * Returns a string with text replacements applied. + * @param {string} text + * @param {TextEdit[]} edits + */ +function applyEdits(text, edits) { + edits = sortEdits(edits); + + /** @type string[] */ + const chunks = []; + let currentIndex = 0; + + for (const edit of edits) { + if (edit.startIndex < currentIndex) { + console.warn("discarding overlapping edit", edit); + continue; + } + + chunks.push(text.substring(currentIndex, edit.startIndex)); + chunks.push(edit.newText); + currentIndex = edit.endIndex; + } + + chunks.push(text.substring(currentIndex)); + + return chunks.join(""); +} diff --git a/docs/src/keymap-upgrade/behaviors.ts b/docs/src/keymap-upgrade/behaviors.ts deleted file mode 100644 index 37c865e8..00000000 --- a/docs/src/keymap-upgrade/behaviors.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Tree } from "web-tree-sitter"; - -import { Devicetree, findCapture } from "./parser"; -import { TextEdit, getUpgradeEdits } from "./textedit"; - -// Map of { "deprecated": "replacement" } behavior names (not including "&" prefixes). -const BEHAVIORS = { - cp: "kp", - inc_dec_cp: "inc_dec_kp", - reset: "sys_reset", -}; - -export function upgradeBehaviors(tree: Tree) { - const edits: TextEdit[] = []; - - const query = Devicetree.query("(reference label: (identifier) @ref)"); - const matches = query.matches(tree.rootNode); - - for (const { captures } of matches) { - const node = findCapture("ref", captures); - if (node) { - edits.push(...getUpgradeEdits(node, BEHAVIORS)); - } - } - - return edits; -} diff --git a/docs/src/keymap-upgrade/encoder.ts b/docs/src/keymap-upgrade/encoder.ts deleted file mode 100644 index 4ac0c50b..00000000 --- a/docs/src/keymap-upgrade/encoder.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { SyntaxNode, Tree } from "web-tree-sitter"; - -import { - getContainingDevicetreeNode, - getDevicetreeNodePath, - findDevicetreeProperty, -} from "./parser"; -import { TextEdit } from "./textedit"; - -const ALPS_EC11_COMPATIBLE = '"alps,ec11"'; -const DEFAULT_RESOLUTION = 4; -const TRIGGERS_PER_ROTATION = 20; -const TRIGGERS_PER_ROTATION_DT = ` - -&sensors { - // Change this to your encoder's number of detents. - // If you have multiple encoders with different detents, see - // https://zmk.dev/docs/config/encoders#keymap-sensor-config - triggers-per-rotation = <${TRIGGERS_PER_ROTATION}>; -};`; - -export function upgradeEncoderResolution(tree: Tree) { - const edits: TextEdit[] = []; - - const resolutionProps = findEncoderResolution(tree); - edits.push(...resolutionProps.flatMap(upgradeResolutionProperty)); - - if (resolutionProps.length > 0) { - edits.push(...addTriggersPerRotation(tree)); - } - - return edits; -} - -function findEncoderResolution(tree: Tree): SyntaxNode[] { - const props = findDevicetreeProperty(tree.rootNode, "resolution", { - recursive: true, - }); - - return props.filter((prop) => { - const node = getContainingDevicetreeNode(prop); - return node && isEncoderNode(node); - }); -} - -function isEncoderNode(node: SyntaxNode) { - // If a compatible property is set, then we know for sure if this is an encoder. - const compatible = findDevicetreeProperty(node, "compatible"); - if (compatible) { - return compatible.childForFieldName("value")?.text === ALPS_EC11_COMPATIBLE; - } - - // Compatible properties rarely appear in a keymap though, so just guess based - // on the node path/reference otherwise. - return getDevicetreeNodePath(node).toLowerCase().includes("encoder"); -} - -function upgradeResolutionProperty(prop: SyntaxNode): TextEdit[] { - const name = prop.childForFieldName("name"); - const value = prop.childForFieldName("value"); - - if (!name || !value) { - return []; - } - - // Try to set the new steps to be triggers-per-rotation * resolution, but fall - // back to a default if the value is something more complex than a single int. - const resolution = value.text.trim().replaceAll(/^<|>$/g, ""); - const steps = - (parseInt(resolution) || DEFAULT_RESOLUTION) * TRIGGERS_PER_ROTATION; - - const hint = `/* Change this to your encoder's number of detents times ${resolution} */`; - - return [ - TextEdit.fromNode(name, "steps"), - TextEdit.fromNode(value, `<${steps}> ${hint}`), - ]; -} - -function addTriggersPerRotation(tree: Tree): TextEdit[] { - // The keymap might already contain "triggers-per-rotation" for example if the - // user already upgraded some but not all "resolution" properties. Don't add - // another one if it already exists. - if (keymapHasTriggersPerRotation(tree)) { - return []; - } - - // Inserting a new property into an existing node while keeping the code - // readable in all cases is hard, so just append a new &sensors node to the - // end of the keymap. - const end = tree.rootNode.endIndex; - return [new TextEdit(end, end, TRIGGERS_PER_ROTATION_DT)]; -} - -function keymapHasTriggersPerRotation(tree: Tree) { - const props = findDevicetreeProperty(tree.rootNode, "triggers-per-rotation", { - recursive: true, - }); - - return props.length > 0; -} diff --git a/docs/src/keymap-upgrade/headers.ts b/docs/src/keymap-upgrade/headers.ts deleted file mode 100644 index 628ca19b..00000000 --- a/docs/src/keymap-upgrade/headers.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { Tree } from "web-tree-sitter"; -import { Devicetree, findCapture } from "./parser"; -import { getUpgradeEdits, MatchFunc, ReplaceFunc, TextEdit } from "./textedit"; - -// Map of { "deprecated": "replacement" } header paths. -const HEADERS = { - "dt-bindings/zmk/matrix-transform.h": "dt-bindings/zmk/matrix_transform.h", -}; - -export function upgradeHeaders(tree: Tree) { - const edits: TextEdit[] = []; - - const query = Devicetree.query( - "(preproc_include path: [(string_literal) (system_lib_string)] @path)" - ); - const matches = query.matches(tree.rootNode); - - for (const { captures } of matches) { - const node = findCapture("path", captures); - if (node) { - edits.push( - ...getUpgradeEdits(node, HEADERS, headerReplaceHandler, isHeaderMatch) - ); - } - } - - return edits; -} - -const isHeaderMatch: MatchFunc = (node, text) => { - return node.text === `"${text}"` || node.text === `<${text}>`; -}; - -const headerReplaceHandler: ReplaceFunc = (node, replacement) => { - if (!replacement) { - throw new Error("Header replacement does not support removing headers"); - } - - return [new TextEdit(node.startIndex + 1, node.endIndex - 1, replacement)]; -}; diff --git a/docs/src/keymap-upgrade/index.ts b/docs/src/keymap-upgrade/index.ts deleted file mode 100644 index 7755fffb..00000000 --- a/docs/src/keymap-upgrade/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { createParser } from "./parser"; -import { applyEdits, Range } from "./textedit"; - -import { upgradeBehaviors } from "./behaviors"; -import { upgradeEncoderResolution } from "./encoder"; -import { upgradeHeaders } from "./headers"; -import { upgradeKeycodes } from "./keycodes"; -import { upgradeNodeNames } from "./nodes"; -import { upgradeProperties } from "./properties"; - -export { initParser } from "./parser"; - -const upgradeFunctions = [ - upgradeBehaviors, - upgradeEncoderResolution, - upgradeHeaders, - upgradeKeycodes, - upgradeNodeNames, - upgradeProperties, -]; - -export function upgradeKeymap(text: string) { - const parser = createParser(); - const tree = parser.parse(text); - - const edits = upgradeFunctions.map((f) => f(tree)).flat(); - - return applyEdits(text, edits); -} - -export function rangesToLineNumbers( - text: string, - changedRanges: Range[] -): string { - const lineBreaks = getLineBreakPositions(text); - - const changedLines = changedRanges.map((range) => { - const startLine = positionToLineNumber(range.startIndex, lineBreaks); - const endLine = positionToLineNumber(range.endIndex, lineBreaks); - - return startLine === endLine ? `${startLine}` : `${startLine}-${endLine}`; - }); - - return `{${changedLines.join(",")}}`; -} - -function getLineBreakPositions(text: string) { - const positions: number[] = []; - let index = 0; - - while ((index = text.indexOf("\n", index)) >= 0) { - positions.push(index); - index++; - } - - return positions; -} - -function positionToLineNumber(position: number, lineBreaks: number[]) { - if (position >= lineBreaks[lineBreaks.length - 1]) { - return lineBreaks.length + 1; - } - - const line = lineBreaks.findIndex((lineBreak) => position < lineBreak); - - return line < 0 ? 0 : line + 1; -} diff --git a/docs/src/keymap-upgrade/keycodes.ts b/docs/src/keymap-upgrade/keycodes.ts deleted file mode 100644 index e1bc2100..00000000 --- a/docs/src/keymap-upgrade/keycodes.ts +++ /dev/null @@ -1,169 +0,0 @@ -import type { SyntaxNode, Tree } from "web-tree-sitter"; -import { Devicetree, findCapture } from "./parser"; -import { getUpgradeEdits, TextEdit } from "./textedit"; - -// Map of { "DEPRECATED": "REPLACEMENT" } key codes. -const CODES = { - NUM_1: "N1", - NUM_2: "N2", - NUM_3: "N3", - NUM_4: "N4", - NUM_5: "N5", - NUM_6: "N6", - NUM_7: "N7", - NUM_8: "N8", - NUM_9: "N9", - NUM_0: "N0", - BKSP: "BSPC", - SPC: "SPACE", - EQL: "EQUAL", - TILD: "TILDE", - SCLN: "SEMI", - QUOT: "SQT", - GRAV: "GRAVE", - CMMA: "COMMA", - PRSC: "PSCRN", - SCLK: "SLCK", - PAUS: "PAUSE_BREAK", - PGUP: "PG_UP", - PGDN: "PG_DN", - RARW: "RIGHT", - LARW: "LEFT", - DARW: "DOWN", - UARW: "UP", - KDIV: "KP_DIVIDE", - KMLT: "KP_MULTIPLY", - KMIN: "KP_MINUS", - KPLS: "KP_PLUS", - UNDO: "K_UNDO", - CUT: "K_CUT", - COPY: "K_COPY", - PSTE: "K_PASTE", - VOLU: "K_VOL_UP", - VOLD: "K_VOL_DN", - CURU: "DLLR", - LPRN: "LPAR", - RPRN: "RPAR", - LCUR: "LBRC", - RCUR: "RBRC", - CRRT: "CARET", - PRCT: "PRCNT", - LABT: "LT", - RABT: "GT", - COLN: "COLON", - KSPC: null, - ATSN: "AT", - BANG: "EXCL", - LCTL: "LCTRL", - LSFT: "LSHIFT", - RCTL: "RCTRL", - RSFT: "RSHIFT", - M_NEXT: "C_NEXT", - M_PREV: "C_PREV", - M_STOP: "C_STOP", - M_EJCT: "C_EJECT", - M_PLAY: "C_PP", - M_MUTE: "C_MUTE", - M_VOLU: "C_VOL_UP", - M_VOLD: "C_VOL_DN", - GUI: "K_CMENU", - MOD_LCTL: "LCTRL", - MOD_LSFT: "LSHIFT", - MOD_LALT: "LALT", - MOD_LGUI: "LGUI", - MOD_RCTL: "RCTRL", - MOD_RSFT: "RSHIFT", - MOD_RALT: "RALT", - MOD_RGUI: "RGUI", -}; - -// Regex matching names of properties that can have keymap bindings. -const BINDINGS_PROPS = /^(bindings|sensor-bindings)$/; - -/** - * Upgrades deprecated key code identifiers. - */ -export function upgradeKeycodes(tree: Tree) { - const edits: TextEdit[] = []; - - const query = Devicetree.query("(identifier) @name"); - const matches = query.matches(tree.rootNode); - - for (const { captures } of matches) { - const node = findCapture("name", captures); - - // Some of the codes are still valid to use in other properties such as - // "mods", so only replace those that are inside a "bindings" array. - if (node && isInBindingsArray(node)) { - edits.push(...getUpgradeEdits(node, CODES, keycodeReplaceHandler)); - } - } - - return edits; -} - -function keycodeReplaceHandler(node: SyntaxNode, replacement: string | null) { - if (replacement) { - return [TextEdit.fromNode(node, replacement)]; - } - - const nodes = findBehaviorNodes(node); - - if (nodes.length === 0) { - console.warn( - `Found deprecated code "${node.text}" but it is not a parameter to a behavior` - ); - return [TextEdit.fromNode(node, `/* "${node.text}" no longer exists */`)]; - } - - const oldText = nodes.map((n) => n.text).join(" "); - const newText = `&none /* "${oldText}" no longer exists */`; - - const startIndex = nodes[0].startIndex; - const endIndex = nodes[nodes.length - 1].endIndex; - - return [new TextEdit(startIndex, endIndex, newText)]; -} - -/** - * Given a parameter to a keymap behavior, returns a list of nodes beginning - * with the behavior and including all parameters. - * Returns an empty array if no behavior was found. - */ -function findBehaviorNodes(paramNode: SyntaxNode) { - // Walk backwards from the given parameter to find the behavior reference. - let behavior = paramNode.previousNamedSibling; - while (behavior && behavior.type !== "reference") { - behavior = behavior.previousNamedSibling; - } - - if (!behavior) { - return []; - } - - // Walk forward from the behavior to collect all its parameters. - const nodes = [behavior]; - let param = behavior.nextNamedSibling; - while (param && param.type !== "reference") { - nodes.push(param); - param = param.nextNamedSibling; - } - - return nodes; -} - -/** - * Given a identifier, returns whether it is inside a "bindings" property value. - */ -function isInBindingsArray(identifier: SyntaxNode) { - let node = identifier.parent; - while (node) { - if (node.type === "property") { - return !!node.childForFieldName("name")?.text.match(BINDINGS_PROPS); - } - - node = node.parent; - } - - return false; -} diff --git a/docs/src/keymap-upgrade/nodes.ts b/docs/src/keymap-upgrade/nodes.ts deleted file mode 100644 index 80a80be2..00000000 --- a/docs/src/keymap-upgrade/nodes.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { Tree } from "web-tree-sitter"; - -import { findDevicetreeNode } from "./parser"; -import { TextEdit } from "./textedit"; - -// Map of { "deprecated path": "replacement name" } for devicetree nodes. -// Relocating nodes to another place in the tree is not supported. -const NODES = { - "/behaviors/behavior_backlight": "bcklight", - "/behaviors/behavior_caps_word": "caps_word", - "/behaviors/behavior_ext_power": "extpower", - "/behaviors/behavior_key_press": "key_press", - "/behaviors/behavior_key_repeat": "key_repeat", - "/behaviors/behavior_key_toggle": "key_toggle", - "/behaviors/behavior_layer_tap": "layer_tap", - "/behaviors/behavior_mod_tap": "mod_tap", - "/behaviors/behavior_momentary_layer": "momentary_layer", - "/behaviors/behavior_none": "none", - "/behaviors/behavior_outputs": "outputs", - "/behaviors/behavior_behavior_reset": "sysreset", - "/behaviors/behavior_reset_dfu": "bootload", - "/behaviors/behavior_rgb_underglow": "rgb_ug", - "/behaviors/behavior_sensor_rotate_key_press": "enc_key_press", - "/behaviors/behavior_sticky_key": "sticky_key", - "/behaviors/behavior_sticky_layer": "sticky_layer", - "/behaviors/behavior_to_layer": "to_layer", - "/behaviors/behavior_toggle_layer": "toggle_layer", - "/behaviors/behavior_transparent": "transparent", - "/behaviors/macro_control_mode_tap": "macro_tap", - "/behaviors/macro_control_mode_press": "macro_press", - "/behaviors/macro_control_mode_release": "macro_release", - "/behaviors/macro_control_tap_time": "macro_tap_time", - "/behaviors/macro_control_wait_time": "macro_wait_time", -}; - -export function upgradeNodeNames(tree: Tree) { - const edits: TextEdit[] = []; - - for (const [path, newName] of Object.entries(NODES)) { - for (const node of findDevicetreeNode(tree, path)) { - const name = node.childForFieldName("name"); - if (name) { - edits.push(TextEdit.fromNode(name, newName)); - } - } - } - - return edits; -} diff --git a/docs/src/keymap-upgrade/parser.ts b/docs/src/keymap-upgrade/parser.ts deleted file mode 100644 index 1fca0ae7..00000000 --- a/docs/src/keymap-upgrade/parser.ts +++ /dev/null @@ -1,192 +0,0 @@ -import Parser from "web-tree-sitter"; - -const TREE_SITTER_WASM_URL = new URL( - "/node_modules/web-tree-sitter/tree-sitter.wasm", - import.meta.url -); - -const TREE_SITTER_DEVICETREE_WASM_URL = new URL( - "/node_modules/tree-sitter-devicetree/tree-sitter-devicetree.wasm", - import.meta.url -); - -export let Devicetree: Parser.Language; - -export async function initParser() { - await Parser.init({ - locateFile: (path: string, prefix: string) => { - // When locating tree-sitter.wasm, use a path that Webpack can map to the correct URL. - if (path == "tree-sitter.wasm") { - return TREE_SITTER_WASM_URL.href; - } - return prefix + path; - }, - }); - Devicetree = await Parser.Language.load(TREE_SITTER_DEVICETREE_WASM_URL.href); -} - -export function createParser() { - if (!Devicetree) { - throw new Error("Parser not loaded. Call initParser() first."); - } - - const parser = new Parser(); - parser.setLanguage(Devicetree); - return parser; -} - -/** - * Returns the node for the named capture. - */ -export function findCapture(name: string, captures: Parser.QueryCapture[]) { - for (const c of captures) { - if (c.name === name) { - return c.node; - } - } - - return null; -} - -/** - * Returns whether the node for the named capture exists and has the given text. - */ -export function captureHasText( - name: string, - captures: Parser.QueryCapture[], - text: string -) { - const node = findCapture(name, captures); - return node?.text === text; -} - -/** - * Get a list of SyntaxNodes representing a devicetree node with the given path. - * The same node may be listed multiple times within a file. - * - * This function does not evaluate which node a reference points to, so given - * a file containing "/ { foo: bar {}; }; &foo {};" searching for "&foo" will - * return the "&foo {}" node but not "foo: bar {}". - * - * @param path Path to the node to find. May be an absolute path such as - * "/foo/bar", a node reference such as "&foo", or a node reference followed by - * a relative path such as "&foo/bar". - */ -export function findDevicetreeNode( - tree: Parser.Tree, - path: string -): Parser.SyntaxNode[] { - const query = Devicetree.query("(node) @node"); - const matches = query.matches(tree.rootNode); - - const result: Parser.SyntaxNode[] = []; - - for (const { captures } of matches) { - const node = findCapture("node", captures); - - if (node && getDevicetreeNodePath(node) === path) { - result.push(node); - } - } - - return result; -} - -export interface FindPropertyOptions { - /** Search in children of the given node as well */ - recursive?: boolean; -} - -/** - * Find all instances of a devicetree property with the given name which are - * descendants of the given syntax node. - * - * @param node Any syntax node - */ -export function findDevicetreeProperty( - node: Parser.SyntaxNode, - name: string, - options: FindPropertyOptions & { recursive: true } -): Parser.SyntaxNode[]; - -/** - * Find a devicetree node's property with the given name, or null if it doesn't - * have one. - * - * @note If the node contains multiple instances of the same property, this - * returns the last once, since that is the one that will actually be applied. - * - * @param node A syntax node for a devicetree node - */ -export function findDevicetreeProperty( - node: Parser.SyntaxNode, - name: string, - options?: FindPropertyOptions -): Parser.SyntaxNode | null; - -export function findDevicetreeProperty( - node: Parser.SyntaxNode, - name: string, - options?: FindPropertyOptions -): Parser.SyntaxNode[] | Parser.SyntaxNode | null { - const query = Devicetree.query( - `(property name: (identifier) @name (#eq? @name "${name}")) @prop` - ); - const matches = query.matches(node); - const props = matches - .map(({ captures }) => findCapture("prop", captures)) - .filter((node) => node !== null); - - if (options?.recursive) { - return props; - } - - // The query finds all descendants. Filter to just the properties that belong - // to the given devicetree node. - const childProps = props.filter((prop) => - getContainingDevicetreeNode(prop)?.equals(node) - ); - - // Sort in descending order to select the last instance of the property. - childProps.sort((a, b) => b.startIndex - a.startIndex); - return childProps[0] ?? null; -} - -export function getDevicetreeNodePath(node: Parser.SyntaxNode | null) { - const parts = getDevicetreeNodePathParts(node); - - if (parts.length === 0) { - return ""; - } - - if (parts.length === 1) { - return parts[0]; - } - - const path = parts.join("/"); - - // The top-level node should be named "/", which is a special case since the - // path should not start with "//". - return parts[0] === "/" ? path.substring(1) : path; -} - -function getDevicetreeNodePathParts(node: Parser.SyntaxNode | null): string[] { - // There may be intermediate syntax nodes between devicetree nodes, such as - // #if blocks, so if we aren't currently on a "node" node, traverse up the - // tree until we find one. - const dtnode = getContainingDevicetreeNode(node); - if (!dtnode) { - return []; - } - - const name = dtnode.childForFieldName("name")?.text ?? ""; - - return [...getDevicetreeNodePathParts(dtnode.parent), name]; -} - -export function getContainingDevicetreeNode(node: Parser.SyntaxNode | null) { - while (node && node.type !== "node") { - node = node.parent; - } - return node; -} diff --git a/docs/src/keymap-upgrade/properties.ts b/docs/src/keymap-upgrade/properties.ts deleted file mode 100644 index 1cd3210f..00000000 --- a/docs/src/keymap-upgrade/properties.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type { SyntaxNode, Tree } from "web-tree-sitter"; -import { captureHasText, Devicetree, findCapture } from "./parser"; -import { TextEdit } from "./textedit"; - -/** - * Upgrades deprecated properties. - */ -export function upgradeProperties(tree: Tree) { - return removeLabels(tree); -} - -/** - * Renames "label" properties in keymap layers to "display-name". Removes all - * other "label" properties. - */ -function removeLabels(tree: Tree) { - const edits: TextEdit[] = []; - - const query = Devicetree.query("(property name: (identifier) @name) @prop"); - const matches = query.matches(tree.rootNode); - - for (const { captures } of matches) { - const name = findCapture("name", captures); - const node = findCapture("prop", captures); - if (name?.text === "label" && node) { - if (isLayerLabel(node)) { - edits.push(TextEdit.fromNode(name, "display-name")); - } else { - edits.push(TextEdit.fromNode(node, "")); - } - } - } - - return edits; -} - -/** - * Given a "label" property node, returns whether it is a label for a keymap layer. - */ -function isLayerLabel(node: SyntaxNode) { - const maybeKeymap = node.parent?.parent; - if (!maybeKeymap) { - return false; - } - - const query = Devicetree.query( - `(property - name: (identifier) @name - value: (string_literal) @value - ) @prop` - ); - const matches = query.matches(maybeKeymap); - - for (const { captures } of matches) { - if ( - findCapture("prop", captures)?.parent?.equals(maybeKeymap) && - captureHasText("name", captures, "compatible") && - captureHasText("value", captures, '"zmk,keymap"') - ) { - return true; - } - } - - return false; -} diff --git a/docs/src/keymap-upgrade/textedit.ts b/docs/src/keymap-upgrade/textedit.ts deleted file mode 100644 index 2b8c5fc9..00000000 --- a/docs/src/keymap-upgrade/textedit.ts +++ /dev/null @@ -1,169 +0,0 @@ -import type { SyntaxNode } from "web-tree-sitter"; - -export class Range { - constructor( - public startIndex: number, - public endIndex: number - ) {} -} - -export class TextEdit extends Range { - newText: string; - - /** - * Creates a text edit to replace a range with new text. - */ - constructor(startIndex: number, endIndex: number, newText: string) { - super(startIndex, endIndex); - this.newText = newText; - } - - static fromNode(node: SyntaxNode | Range, newText: string) { - return new TextEdit(node.startIndex, node.endIndex, newText); - } -} - -export type MatchFunc = (node: SyntaxNode, text: string) => boolean; -export type ReplaceFunc = ( - node: SyntaxNode, - replacement: string | null -) => TextEdit[]; - -/** - * Gets a list of text edits to apply based on a node and a map of text - * replacements. - * - * If replaceHandler is given, it will be called if the node matches a - * deprecated value and it should return the text edits to apply. - * Otherwise, the full node is replaced by the new text. - * - * If isMatch is given, it will be called to check if a node matches a - * deprecated value. Otherwise, the node's text is matched against the - * deprecated text. - * - * @param {SyntaxNode} node - * @param {Record} replacementMap - * @param {ReplaceFunc} [replaceHandler] - * @param {MatchFunc} [isMatch] - */ -export function getUpgradeEdits( - node: SyntaxNode, - replacementMap: Record, - replaceHandler?: ReplaceFunc, - isMatch?: MatchFunc -) { - const defaultReplace: ReplaceFunc = (node, replacement) => [ - TextEdit.fromNode(node, replacement ?? ""), - ]; - const defaultMatch: MatchFunc = (node, text) => node.text === text; - - replaceHandler = replaceHandler ?? defaultReplace; - isMatch = isMatch ?? defaultMatch; - - for (const [deprecated, replacement] of Object.entries(replacementMap)) { - if (isMatch(node, deprecated)) { - return replaceHandler(node, replacement); - } - } - return []; -} - -/** - * Sorts a list of text edits in ascending order by position. - */ -function sortEdits(edits: TextEdit[]) { - return edits.sort((a, b) => a.startIndex - b.startIndex); -} - -export interface EditResult { - text: string; - changedRanges: Range[]; -} - -interface TextChunk { - text: string; - changed?: boolean; -} - -/** - * Returns a string with text replacements applied and a list of ranges within - * that string that were modified. - */ -export function applyEdits(text: string, edits: TextEdit[]) { - // If we are removing text and it's the only thing on a line, remove the whole line. - edits = edits.map((e) => (e.newText ? e : expandEditToLine(text, e))); - edits = sortEdits(edits); - - const chunks: TextChunk[] = []; - let currentIndex = 0; - - for (const edit of edits) { - if (edit.startIndex < currentIndex) { - console.warn("discarding overlapping edit", edit); - continue; - } - - chunks.push({ text: text.substring(currentIndex, edit.startIndex) }); - chunks.push({ text: edit.newText, changed: true }); - currentIndex = edit.endIndex; - } - - chunks.push({ text: text.substring(currentIndex) }); - - // Join all of the text chunks while recording the ranges of any chunks that were changed. - return chunks.reduce( - (prev, current) => { - return { - text: prev.text + current.text, - changedRanges: reduceChangedRanges(prev, current), - }; - }, - { text: "", changedRanges: [] } - ); -} - -function reduceChangedRanges(prev: EditResult, current: TextChunk): Range[] { - if (current.changed) { - return [ - ...prev.changedRanges, - new Range(prev.text.length, prev.text.length + current.text.length), - ]; - } - - return prev.changedRanges; -} - -/** - * If the given edit is surrounded by only whitespace on a line, expands it to - * replace the entire line, else returns it unmodified. - */ -function expandEditToLine(text: string, edit: TextEdit) { - // Expand the selection to adjacent whitespace - let newStart = edit.startIndex; - let newEnd = edit.endIndex; - - while (newStart > 0 && text[newStart - 1].match(/[ \t]/)) { - newStart--; - } - - while (newEnd < text.length && text[newEnd].match(/[ \t]/)) { - newEnd++; - } - - // Check that we selected the entire line - if ( - (newEnd !== text.length && text[newEnd] !== "\n") || - (newStart > 0 && text[newStart - 1] !== "\n") - ) { - return edit; - } - - // Select one of the line breaks to remove. - if (newEnd !== text.length) { - newEnd++; - } else if (newStart !== 0) { - newStart--; - } - - return new TextEdit(newStart, newEnd, edit.newText); -} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index 40aa06a7..ccaab508 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -1,3 +1,4 @@ +import React from "react"; import classnames from "classnames"; import Layout from "@theme/Layout"; import Link from "@docusaurus/Link"; @@ -37,7 +38,7 @@ function Feature({ imageUrl, title, description }) {
    {imgUrl && (
    - + {title}
    )}

    {title}

    diff --git a/docs/src/pages/keymap-upgrader.mdx b/docs/src/pages/keymap-upgrader.mdx deleted file mode 100644 index 341e31de..00000000 --- a/docs/src/pages/keymap-upgrader.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Keymap Upgrader -sidebar_label: Keymap Upgrader -hide_title: true -hide_table_of_contents: true ---- - -# Keymap Upgrader - -Some behaviors, key codes, and other features have been renamed to be more consistent with each other. This tool will upgrade most deprecated features to their replacements. - -Paste the contents of a `.keymap` file below. Then, hover your mouse over the upgraded keymap and click the `Copy` button in the upper-right corner to copy it to your clipboard. - -Lines that have been modified in the upgraded keymap will be highlighted. - -:::warning - -The upgrader does not handle key codes inside a `#define` or a behavior creation macro such as `ZMK_MACRO()`, so you will need to update those manually using -[this list of deprecated codes and replacements](https://github.com/zmkfirmware/zmk/blob/main/docs/src/keymap-upgrade/keycodes.ts). - -::: - -import KeymapUpgrader from "@site/src/components/KeymapUpgrader/index"; - - diff --git a/docs/src/pages/power-profiler.js b/docs/src/pages/power-profiler.js index 032200e3..d28886ef 100644 --- a/docs/src/pages/power-profiler.js +++ b/docs/src/pages/power-profiler.js @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -import { useState } from "react"; +import React, { useState } from "react"; import classnames from "classnames"; import Layout from "@theme/Layout"; import styles from "./styles.module.css"; diff --git a/docs/src/setup-script-generation-plugin/index.js b/docs/src/setup-script-generation-plugin/index.js new file mode 100644 index 00000000..87e77141 --- /dev/null +++ b/docs/src/setup-script-generation-plugin/index.js @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +var PrebuildPlugin = require("prebuild-webpack-plugin"); +const path = require("path"); +const fs = require("fs"); +const glob = require("glob"); +const yaml = require("js-yaml"); +const Mustache = require("mustache"); + +function generateSetupScripts() { + return glob("../app/boards/**/*.zmk.yml", (error, files) => { + const aggregated = files.map((f) => ({ + ...yaml.load(fs.readFileSync(f, "utf8")), + __base_dir: path.basename(path.dirname(f)), + })); + + const data = aggregated.reduce( + (agg, item) => { + switch (item.type) { + case "shield": + item.compatible = true; + item.split = item.siblings?.length > 1; + agg.keyboards.push(item); + break; + case "board": + if (item.features?.includes("keys")) { + agg.keyboards.push(item); + } else { + item.usb_only = !item.outputs?.includes("ble"); + agg.boards.push(item); + } + break; + } + return agg; + }, + { keyboards: [], boards: [] } + ); + + data.keyboards.sort((a, b) => a.name.localeCompare(b.name)); + data.boards.sort((a, b) => a.name.localeCompare(b.name)); + + for (let script_ext of ["sh", "ps1"]) { + const templateBuffer = fs.readFileSync( + `src/templates/setup.${script_ext}.mustache`, + "utf8" + ); + const script = Mustache.render(templateBuffer, data); + fs.writeFileSync(`static/setup.${script_ext}`, script); + } + }); +} + +module.exports = function () { + return { + name: "setup-script-generation-plugin", + configureWebpack() { + return { + plugins: [ + new PrebuildPlugin({ + build: generateSetupScripts, + }), + ], + }; + }, + }; +}; diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache new file mode 100644 index 00000000..90f9cdcf --- /dev/null +++ b/docs/src/templates/setup.ps1.mustache @@ -0,0 +1,284 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +$ErrorActionPreference = "Stop" + +function Get-Choice-From-Options { + param( + [String[]] $Options, + [String] $Prompt + ) + + while ($true) { + for ($i = 0; $i -lt $Options.length; $i++) { + Write-Host "$($i + 1)) $($Options[$i])" + } + + Write-Host "$($Options.length + 1)) Quit" + $selection = (Read-Host $Prompt) -as [int] + + if ($selection -eq $Options.length + 1) { + Write-Host "Goodbye!" + exit 1 + } + elseif ($selection -le $Options.length -and $selection -gt 0) { + $choice = $($selection - 1) + break + } + else { + Write-Host "Invalid Option. Try another one." + } + } + + return $choice +} + +function Test-Git-Config { + param( + [String] $Option, + [String] $ErrMsg + ) + + git config $Option | Out-Null + + if ($lastExitCode -ne 0) { + Write-Host $ErrMsg + exit 1 + } +} + +try { + git | Out-Null +} +catch [System.Management.Automation.CommandNotFoundException] { + Write-Host "Git is not installed, and is required for this script!" + exit 1 +} + +Test-Git-Config -Option "user.name" -ErrMsg "Git username not set!`nRun: git config --global user.name 'My Name'" +Test-Git-Config -Option "user.email" -ErrMsg "Git email not set!`nRun: git config --global user.email 'example@myemail.com'" + +function Test-CommandExists { + param ($command) + + $oldPreference = $ErrorActionPreference + $ErrorActionPreference = "stop" + + try { + if(Get-Command $command){ return $true } + } Catch { return $false } + Finally { $ErrorActionPreference=$oldPreference } +} + +if (Test-CommandExists Get-Acl) { + $permission = (Get-Acl $pwd).Access | + ?{$_.IdentityReference -match $env:UserName ` + -and $_.FileSystemRights -match "FullControl" ` + -or $_.FileSystemRights -match "Write" } | + Select IdentityReference,FileSystemRights + + If (-Not $permission){ + Write-Host "Sorry, you do not have write permissions in this directory." + Write-Host "Please try running this script again from a directory that you do have write permissions for." + exit 1 + } +} + +$repo_path = "https://github.com/zmkfirmware/unified-zmk-config-template.git" + +$title = "ZMK Config Setup:" +Write-Host "" +Write-Host "Keyboard Shield Selection:" +$prompt = "Pick a keyboard" + +$keyboards = [ordered]@{ + {{#keyboards}} + "{{id}}" = @{ + name = "{{{name}}}"; + type = "{{type}}"; + basedir = "{{__base_dir}}"; + split = "{{split}}"; + arch = "{{arch}}"; + siblings = {{#siblings.0}}@( + {{#siblings}} + "{{.}}" + {{/siblings}} + ){{/siblings.0}}{{^siblings.0}}( "{{id}}" ){{/siblings.0}}; + } + {{/keyboards}} +} +# TODO: Add support for "Other" and linking to docs on adding custom shields in user config repos. + +$choice = Get-Choice-From-Options -Options ($keyboards.values | % { $_['name'] }) -Prompt $prompt +$keyboard = $($($keyboards.keys)[$choice]) +$keyboard_title = $keyboards[$keyboard].name +$basedir = $keyboards[$keyboard].basedir +$keyboard_split = $keyboards[$keyboard].split +$keyboard_arch = $keyboards[$keyboard].arch +$keyboard_siblings = $keyboards[$keyboard].siblings +$keyboard_type = $keyboards[$keyboard].type + +if ($keyboard_type -eq "shield") { + $prompt = "Pick an MCU board" + $boards = [ordered]@{ + {{#boards}} + {{id}} = "{{{name}}}"; + {{/boards}} + } + $boards_usb_only = [ordered]@{ + {{#boards}} + {{id}} = "{{usb_only}}"; + {{/boards}} + } + + Write-Host "$title" + Write-Host "" + Write-Host "MCU Board Selection:" + + $choice = Get-Choice-From-Options -Options $boards.values -Prompt $prompt + + if ($keyboard_split -eq "true" -and $($($boards_usb_only.values)[$choice]) -eq "true") { + Write-Host "Wired split is not yet supported by ZMK." + exit 1 + } + + $shields = $keyboard_siblings + $board = $($($boards.keys)[$choice]) + $boards = ( $board ) +} else { + $boards = ( $keyboard_siblings ) + $shields = @( ) +} + +$copy_keymap = Read-Host "Copy in the stock keymap for customisation? [Yn]" + +if ($copy_keymap -eq "" -or $copy_keymap -eq "Y" -or $copy_keymap -eq "y") { + $copy_keymap = "yes" +} + +$github_user = Read-Host "GitHub Username (leave empty to skip GitHub repo creation)" + +if ($github_user -ne "") { + $repo_name = Read-Host "GitHub Repo Name [zmk-config]" + + if ($repo_name -eq "") { + $repo_name = "zmk-config" + } + + $github_repo = Read-Host "GitHub Repo [https://github.com/$github_user/$repo_name.git]" + + if ($github_repo -eq "") { + $github_repo = "https://github.com/$github_user/$repo_name.git" + } +} +else { + $repo_name = "zmk-config" + $github_repo = "" +} + +Write-Host "" +Write-Host "Preparing a user config for:" +if ($keyboard_type -eq "shield") { + Write-Host "* MCU Board: ${boards}" + Write-Host "* Shield(s): ${shields}" +} else { + Write-Host "* Board(s): ${boards}" +} + +if ($copy_keymap -eq "yes") { + Write-Host "* Copy Keymap?: Yes" +} +else { + Write-Host "* Copy Keymap?: No" +} + +if ($github_repo -ne "") { + Write-Host "* GitHub Repo to Push (please create this in GH first!): $github_repo" +} + +Write-Host "" +$do_it = Read-Host "Continue? [Yn]" + +if ($do_it -ne "" -and $do_it -ne "Y" -and $do_it -ne "y") { + Write-Host "Aborting..." + exit 1 +} + +git clone --single-branch "$repo_path" "$repo_name" +Set-Location "$repo_name" + +Push-Location config + +if ($keyboard_type -eq "shield") { + $url_base = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}" +} else { + $url_base = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}" +} + +Write-Host "Downloading config file (${url_base}/${keyboard}.conf)" +Try { + Invoke-RestMethod -Uri "${url_base}/${keyboard}.conf" -OutFile "${keyboard}.conf" +} Catch { + Try { + Write-Host "Could not find it, falling back to ${url_base}/${basedir}.conf" + Invoke-RestMethod -Uri "${url_base}/${basedir}.conf" -OutFile "${basedir}.conf" + } Catch { + Set-Content -Path "${keyboard}.conf" "# Put configuration options here" + } +} + +if ($copy_keymap -eq "yes") { + Write-Host "Downloading keymap file (${url_base}/${keyboard}.keymap)" + Try { + Invoke-RestMethod -Uri "${url_base}/${keyboard}.keymap" -OutFile "${keyboard}.keymap" + } Catch { + Write-Host "Could not find it, falling back to ${url_base}/${basedir}.keymap" + Try { + Invoke-RestMethod -Uri "${url_base}/${basedir}.keymap" -OutFile "${basedir}.keymap" + } Catch { + Write-Host "Warning: Could not find a keymap file to download!" + } + } +} + +Pop-Location + +Add-Content -Path "build.yaml" -Value "include:" +foreach ($b in ${boards}) { + if ($keyboard_type -eq "shield") { + foreach ($s in ${shields}) { + Add-Content -Path "build.yaml" -Value " - board: $b" + Add-Content -Path "build.yaml" -Value " shield: $s" + } + } else { + Add-Content -Path "build.yaml" -Value " - board: $b" + } +} + +Remove-Item -Recurse -Force .git +git init . +git add . +git commit -m "Initial User Config." + +if ($github_repo -ne "") { + git remote add origin "$github_repo" + + git push --set-upstream origin $(git symbolic-ref --short HEAD) + + # If push failed, assume that the origin was incorrect and give instructions on fixing. + if ($lastExitCode -ne 0) { + Write-Host "Remote repository $github_repo not found..." + Write-Host "Check GitHub URL, and try adding again." + Write-Host "Run the following: " + Write-Host " git remote rm origin" + Write-Host " git remote add origin FIXED_URL" + Write-Host " git push --set-upstream origin $(git symbolic-ref --short HEAD)" + Write-Host "Once pushed, your firmware should be available from GitHub Actions at: $actions" + exit 1 + } + + if ($github_repo -imatch "https") { + $actions = "$($github_repo.substring(0, $github_repo.length - 4))/actions" + Write-Host "Your firmware should be availalbe from GitHub Actions shortly: $actions" + } +} diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache new file mode 100644 index 00000000..c711dbc5 --- /dev/null +++ b/docs/src/templates/setup.sh.mustache @@ -0,0 +1,269 @@ +#!/bin/bash + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +set -e + +check_exists() { + command_to_run=$1 + error_message=$2 + local __resultvar=$3 + + if ! eval "$command_to_run" &> /dev/null; then + if [[ "$__resultvar" != "" ]]; then + eval $__resultvar="'false'" + else + printf "%s\n" "$error_message" + exit 1 + fi + else + if [[ "$__resultvar" != "" ]]; then + eval $__resultvar="'true'" + fi + fi +} + +check_exists "command -v git" "git is not installed, and is required for this script!" +check_exists "command -v curl" "curl is not installed, and is required for this script!" curl_exists +check_exists "command -v wget" "wget is not installed, and is required for this script!" wget_exists + +check_exists "git config user.name" "Git username not set!\nRun: git config --global user.name 'My Name'" +check_exists "git config user.email" "Git email not set!\nRun: git config --global user.email 'example@myemail.com'" + +# Check to see if the user has write permissions in this directory to prevent a cryptic error later on +if [ ! -w `pwd` ]; then + echo 'Sorry, you do not have write permissions in this directory.'; + echo 'Please try running this script again from a directory that you do have write permissions for.'; + exit 1 +fi + +# Parse all commandline options +while [[ "$#" -gt 0 ]]; do + case $1 in + -w|--wget) force_wget="true"; break;; + *) echo "Unknown parameter: $1"; exit 1;; + esac + shift +done + +if [[ $curl_exists == "true" && $wget_exists == "true" ]]; then + if [[ $force_wget == "true" ]]; then + download_command="wget " + else + download_command="curl -fsOL " + fi +elif [[ $curl_exists == "true" ]]; then + download_command="curl -fsOL " +elif [[ $wget_exists == "true" ]]; then + download_command="wget " +else + echo 'Neither curl nor wget are installed. One of the two is required for this script!' + exit 1 +fi + +repo_path="https://github.com/zmkfirmware/unified-zmk-config-template.git" +title="ZMK Config Setup:" + +echo "" +echo "Keyboard Selection:" +PS3="Pick a keyboard: " +options=({{#keyboards}}"{{{name}}}" {{/keyboards}}) +keyboards_id=({{#keyboards}}"{{id}}" {{/keyboards}}) +keyboards_type=({{#keyboards}}"{{type}}" {{/keyboards}}) +keyboards_arch=({{#keyboards}}"{{arch}}" {{/keyboards}}) +keyboards_basedir=({{#keyboards}}"{{__base_dir}}" {{/keyboards}}) +keyboards_split=({{#keyboards}}"{{#split}}y{{/split}}{{^split}}n{{/split}}" {{/keyboards}}) +keyboards_shield=({{#keyboards}}"{{#compatible}}y{{/compatible}}{{^compatible}}n{{/compatible}}" {{/keyboards}}) + +{{#keyboards}} +{{#siblings.0}} +{{id}}_siblings=({{#siblings}}"{{.}}" {{/siblings}}) +{{/siblings.0}} +{{/keyboards}} + +select opt in "${options[@]}" "Quit"; do + case "$REPLY" in + ''|*[!0-9]*) echo "Invalid option. Try another one."; continue;; + + $(( ${#options[@]}+1 )) ) echo "Goodbye!"; exit 1;; + *) + if [ $REPLY -gt $(( ${#options[@]}+1 )) ] || [ $REPLY -lt 0 ]; then + echo "Invalid option. Try another one." + continue + fi + keyboard_index=$(( $REPLY-1 )) + keyboard=${keyboards_id[$keyboard_index]} + keyboard_arch=${keyboards_arch[$keyboard_index]} + keyboard_basedir=${keyboards_basedir[$keyboard_index]} + keyboard_title=${options[$keyboard_index]} + keyboard_sibling_var=${keyboard}_siblings[@] + keyboard_sibling_first=${keyboard}_siblings[0] + if [ -n "${!keyboard_sibling_first}" ]; then + keyboard_siblings=${!keyboard_sibling_var} + else + keyboard_siblings=( "${keyboard}" ) + fi + split=${keyboards_split[$keyboard_index]} + keyboard_shield=${keyboards_shield[$keyboard_index]} + break + ;; + + esac +done + +if [ "$keyboard_shield" == "y" ]; then + shields=$keyboard_siblings + shield=${keyboard} + shield_title=${keyboard_title} + + prompt="Pick an MCU board:" + options=({{#boards}}"{{{name}}}" {{/boards}}) + board_ids=({{#boards}}"{{id}}" {{/boards}}) + boards_usb_only=({{#boards}}"{{#usb_only}}y{{/usb_only}}{{^usb_only}}n{{/usb_only}}" {{/boards}}) + + echo "" + echo "MCU Board Selection:" + PS3="$prompt " + select opt in "${options[@]}" "Quit"; do + case "$REPLY" in + ''|*[!0-9]*) echo "Invalid option. Try another one."; continue;; + + $(( ${#options[@]}+1 )) ) echo "Goodbye!"; exit 1;; + *) + if [ $REPLY -gt $(( ${#options[@]}+1 )) ] || [ $REPLY -lt 0 ]; then + echo "Invalid option. Try another one." + continue + fi + + board_index=$(( $REPLY-1 )) + + if [ -n "${!keyboard_sibling_first}" ] && [ "${boards_usb_only[$board_index]}" = "y" ] ; then + echo "Wired split is not yet supported by ZMK." + exit 1 + fi + + board=${board_ids[$board_index]} + board_title=${options[$board_index]} + boards=( "${board}" ) + break + ;; + + esac + done +else + board=${keyboard} + boards=$keyboard_siblings +fi + +read -r -e -p "Copy in the stock keymap for customization? [Yn]: " copy_keymap + +if [ -z "$copy_keymap" ] || [ "$copy_keymap" == "Y" ] || [ "$copy_keymap" == "y" ]; then copy_keymap="yes"; fi + +read -r -e -p "GitHub Username (leave empty to skip GitHub repo creation): " github_user +if [ -n "$github_user" ]; then + read -r -p "GitHub Repo Name [zmk-config]: " repo_name + if [ -z "$repo_name" ]; then repo_name="zmk-config"; fi + + read -r -p "GitHub Repo [https://github.com/${github_user}/${repo_name}.git]: " github_repo + + if [ -z "$github_repo" ]; then github_repo="https://github.com/${github_user}/${repo_name}.git"; fi +else + repo_name="zmk-config" +fi + +echo "" +echo "Preparing a user config for:" +if [ "$keyboard_shield" == "y" ]; then + echo "* MCU Board: ${boards}" + echo "* Shield(s): ${shields}" +else + echo "* Board(s): ${boards}" +fi + +if [ "$copy_keymap" == "yes" ]; then + echo "* Copy Keymap?: ✓" +else + echo "* Copy Keymap?: ❌" +fi + +if [ -n "$github_repo" ]; then + echo "* GitHub Repo To Push (please create this in GH first!): ${github_repo}" +fi + +echo "" +read -r -p "Continue? [Yn]: " do_it + +if [ -n "$do_it" ] && [ "$do_it" != "y" ] && [ "$do_it" != "Y" ]; then + echo "Aborting..." + exit 1 +fi + +git clone --single-branch $repo_path ${repo_name} +cd ${repo_name} + +pushd config + +if [ "$keyboard_shield" == "y" ]; then + url_base="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}" +else + url_base="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}" +fi + +echo "Downloading config file (${url_base}/${keyboard}.conf)" +if ! $download_command "${url_base}/${keyboard}.conf"; then + echo "Could not find it, falling back to ${url_base}/${keyboard_basedir}.conf" + $download_command "${url_base}/${keyboard_basedir}.conf" || echo "# Put configuration options here" > "${keyboard}.conf" +fi + +if [ "$copy_keymap" == "yes" ]; then + echo "Downloading keymap file (${url_base}/${keyboard}.keymap)" + if ! $download_command "${url_base}/${keyboard}.keymap"; then + echo "Could not find it, falling back to ${url_base}/${keyboard_basedir}.keymap" + $download_command "${url_base}/${keyboard_basedir}.keymap" || echo "Warning: Could not find a keymap file to download!" + fi +fi + +popd + +echo "include:" >> build.yaml + +for b in ${boards}; do + if [ -n "${shields}" ]; + then + for s in ${shields}; do + echo " - board: ${b}" >> build.yaml + echo " shield: ${s}" >> build.yaml + done + else + echo " - board: ${b}" >> build.yaml + fi +done + +rm -rf .git +git init . +git add . +git commit -m "Initial User Config." + +if [ -n "$github_repo" ]; then + git remote add origin "$github_repo" + git push --set-upstream origin "$(git symbolic-ref --short HEAD)" + push_return_code=$? + + # If push failed, assume that the origin was incorrect and give instructions on fixing. + if [ ${push_return_code} -ne 0 ]; then + echo "Remote repository $github_repo not found..." + echo "Check GitHub URL, and try adding again." + echo "Run the following: " + echo " git remote rm origin" + echo " git remote add origin FIXED_URL" + echo " git push --set-upstream origin $(git symbolic-ref --short HEAD)" + echo "Once pushed, your firmware should be available from GitHub Actions at: ${github_repo%.git}/actions" + exit 1 + fi + + # TODO: Support determing the actions URL when non-https:// repo URL is used. + if [ "${github_repo}" != "${github_repo#https://}" ]; then + echo "Your firmware should be available from GitHub Actions shortly: ${github_repo%.git}/actions" + fi +fi diff --git a/docs/src/theme/DocVersionBanner/index.tsx b/docs/src/theme/DocVersionBanner/index.tsx deleted file mode 100644 index 2e7fe133..00000000 --- a/docs/src/theme/DocVersionBanner/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { type ReactNode } from "react"; -import clsx from "clsx"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import Link from "@docusaurus/Link"; -import { ThemeClassNames } from "@docusaurus/theme-common"; -import type { Props } from "@theme/DocVersionBanner"; - -function ZMKReleaseLink({ version }: { version: string }): ReactNode { - return ( - - v{version} - - ); -} - -function DevWarningBanner({ - className, - latestVersion, -}: Props & { latestVersion: string }): ReactNode { - return ( -
    - You're viewing the documentation for the development version of ZMK. You - may want the latest release . -
    - ); -} - -export default function DocVersionBanner({ className }: Props): ReactNode { - const { - siteConfig: { customFields }, - } = useDocusaurusContext(); - - if ( - !customFields?.releaseVersions || - !Array.isArray(customFields.releaseVersions) - ) { - return null; - } - - const releaseVersions: [string] = customFields.releaseVersions as [string]; - - if (customFields.isDevelopmentVersion) { - return ( - - ); - } - return null; -} diff --git a/docs/src/theme/prism-include-languages.js b/docs/src/theme/prism-include-languages.js index f740d828..c073923b 100644 --- a/docs/src/theme/prism-include-languages.js +++ b/docs/src/theme/prism-include-languages.js @@ -12,6 +12,7 @@ export default function prismIncludeLanguages(PrismObject) { // long as you don't re-assign it globalThis.Prism = PrismObject; additionalLanguages.forEach((lang) => { + // eslint-disable-next-line global-require require(`prismjs/components/prism-${lang}`); }); diff --git a/docs/static/.gitignore b/docs/static/.gitignore new file mode 100644 index 00000000..fc7d2745 --- /dev/null +++ b/docs/static/.gitignore @@ -0,0 +1,5 @@ + +# Ignore generated setup script + +setup.ps1 +setup.sh diff --git a/docs/static/_redirects b/docs/static/_redirects deleted file mode 100644 index 1de2aba9..00000000 --- a/docs/static/_redirects +++ /dev/null @@ -1,27 +0,0 @@ -/docs/behaviors/* /docs/keymaps/behaviors/:splat 301 -/docs/features/keymaps /docs/keymaps 301 -/docs/features/combos /docs/keymaps/combos 301 -/docs/features/conditional-layers /docs/keymaps/conditional-layers 301 -/docs/features/underglow /docs/features/lighting#rgb-underglow 301 -/docs/features/backlight /docs/features/lighting#backlight 301 -/docs/codes/modifiers /docs/keymaps/modifiers 301 -/docs/codes/* /docs/keymaps/list-of-keycodes 301 -/docs/config/backlight /docs/config/lighting#backlight 301 -/docs/config/underglow /docs/config/lighting#rgb-underglow 301 -/docs/features/beta-testing /docs/features/modules#beta-testing 301 -/docs/development/setup /docs/development/local-toolchain/setup 301 -/docs/development/boards-shields-keymaps /docs/hardware-integration 301 -/docs/development/hardware-metadata-files /docs/hardware-integration/hardware-metadata-files 301 -/docs/development/clean-room /docs/development/contributing/clean-room 301 -/docs/development/documentation /docs/development/contributing/documentation 301 -/docs/development/new-shield /docs/hardware-integration/new-shield 301 -/docs/development/build-flash /docs/development/local-toolchain/build-flash 301 -/docs/development/ide-integration /docs/development/local-toolchain/ide-integration 301 -/docs/development/posix-board /docs/development/local-toolchain/posix-board 301 -/docs/development/pre-commit /docs/development/local-toolchain/pre-commit 301 -/docs/development/tests /docs/development/local-toolchain/tests 301 -/docs/development/guides/new-behavior /docs/development/new-behavior 301 -/docs/development/hardware-integration/studio-setup /docs/hardware-integration/physical-layouts 301 -/docs/keymaps/behaviors/mod-tap /docs/keymaps/behaviors/hold-tap#mod-tap -/docs/user-setup-cli /docs/user-setup 301 -/docs/development/hardware-integration/* /docs/hardware-integration/:splat 301 diff --git a/docs/static/setup.ps1 b/docs/static/setup.ps1 deleted file mode 100644 index c54f6a51..00000000 --- a/docs/static/setup.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -# setup.ps1 -Write-Host "This setup script has been removed. Please use the ZMK CLI instead." -Write-Host "Visit https://zmk.dev/docs/user-setup for more information." \ No newline at end of file diff --git a/docs/static/setup.sh b/docs/static/setup.sh deleted file mode 100644 index ed5bd9dc..00000000 --- a/docs/static/setup.sh +++ /dev/null @@ -1,2 +0,0 @@ -echo "This setup script has been removed. Please use the ZMK CLI instead." -echo "Visit https://zmk.dev/docs/user-setup for more information." \ No newline at end of file diff --git a/docs/static/tree-sitter-devicetree.wasm b/docs/static/tree-sitter-devicetree.wasm new file mode 100644 index 00000000..cce5ac96 Binary files /dev/null and b/docs/static/tree-sitter-devicetree.wasm differ diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 8ecf7553..a9844e97 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -1,16 +1,14 @@ { - "extends": "@docusaurus/tsconfig", + "extends": "@tsconfig/docusaurus/tsconfig.json", "include": ["src/"], "compilerOptions": { "types": ["node", "@docusaurus/theme-classic"], - "moduleResolution": "Bundler", - "module": "esnext", + "moduleResolution": "Node16", "esModuleInterop": true, "resolveJsonModule": true, "strict": true, "noEmit": true, - "jsx": "react-jsx", "target": "ES6", - "lib": ["ES2022", "DOM", "DOM.Iterable"] + "lib": ["ES2019.Array", "DOM", "DOM.Iterable"] } } diff --git a/docs/zmk-release-versions.json b/docs/zmk-release-versions.json deleted file mode 100644 index 45d0cd61..00000000 --- a/docs/zmk-release-versions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "releaseVersions": ["0.3"] -} diff --git a/release-please-config.json b/release-please-config.json deleted file mode 100644 index d09fb986..00000000 --- a/release-please-config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "bootstrap-sha": "2ded7919ebd63e0174bf5a412f6f01d6af0061c6", - "release-type": "simple", - "extra-files": ["app/VERSION"], - "packages": { - ".": {} - } -} diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 85ba0c93..4c2bdf3b 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -16,11 +16,7 @@ "$defs": { "id": { "type": "string", - "pattern": "^[a-z0-9_/]+(@([A-Z]|[0-9]+|([0-9]+(\\.[0-9]+){1,2})))?$" - }, - "revision": { - "type": "string", - "pattern": "[A-Z]|[0-9]+|([0-9]+(\\.[0-9]+){1,2})" + "pattern": "^[a-z0-9_]+$" }, "keyboard_siblings": { "type": "array", @@ -57,8 +53,7 @@ "encoder", "underglow", "backlight", - "pointer", - "studio" + "pointer" ] } }, @@ -207,15 +202,6 @@ }, "exposes": { "$ref": "#/$defs/interconnects" - }, - "revisions": { - "type": "array", - "items": { - "$ref": "#/$defs/revision" - } - }, - "default_revision": { - "$ref": "#/$defs/revision" } } },