diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 7e81e779..5e123bd5 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.5 COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.github/workflows/ble-test.yml b/.github/workflows/ble-test.yml index 68cb1cb3..7d76fb9e 100644 --- a/.github/workflows/ble-test.yml +++ b/.github/workflows/ble-test.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Find test directories id: test-dirs run: | @@ -35,12 +35,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.5 steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v4 env: cache-name: cache-zephyr-modules with: @@ -72,7 +72,7 @@ jobs: 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 + uses: actions/upload-artifact@v4 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..cf3247d0 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -30,28 +30,17 @@ jobs: 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@v4 - 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=$(yq -oj -I0 '${{ inputs.build_matrix_path }}')" >> $GITHUB_ENV + yq -oj "${{ inputs.build_matrix_path }}" build: runs-on: ubuntu-latest - if: needs.matrix.outputs.has_valid_build_matrix == 'true' container: image: zmkfirmware/zmk-build-arm:stable needs: matrix @@ -60,21 +49,15 @@ 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 }} - run: | - apt-get update && apt-get install -y curl unzip - curl -fsSL https://deb.nodesource.com/setup_22.x | bash && apt install -y nodejs - - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Create build directory run: | echo "build_dir=$(mktemp -d)" >> $GITHUB_ENV - name: Prepare variables - shell: bash -x {0} + shell: sh -x {0} env: board: ${{ matrix.board }} shield: ${{ matrix.shield }} @@ -98,7 +81,7 @@ jobs: 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 + echo "artifact_name=${artifact_name:-${shield:+$shield-}${board}-zmk}" >> $GITHUB_ENV - name: Copy config files to isolated temporary directory run: | @@ -108,7 +91,7 @@ jobs: fi - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v4 continue-on-error: true env: cache_name: cache-zephyr-${{ env.zephyr_version }}-modules @@ -133,13 +116,6 @@ jobs: 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}" - - name: West Zephyr export working-directory: ${{ env.base_dir }} run: west zephyr-export @@ -149,38 +125,6 @@ jobs: 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 - - name: ${{ env.display_name }} Kconfig file run: | if [ -f "${{ env.build_dir }}/zephyr/.config" ] @@ -217,19 +161,18 @@ jobs: fi - name: Archive (${{ env.display_name }}) - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@v4 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/merge@v4 with: name: ${{ inputs.archive_name }} pattern: artifact-* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d2a5805..3307b006 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,18 +23,18 @@ jobs: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:4.1 + image: docker.io/zmkfirmware/zmk-build-arm:3.5 needs: compile-matrix strategy: matrix: include: ${{ fromJSON(needs.compile-matrix.outputs.include-list) }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: persist-credentials: false - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v4 env: cache-name: cache-zephyr-modules with: @@ -57,13 +57,13 @@ jobs: - 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@v4 with: node-version: "14.x" - name: Install @actions/artifact - run: npm install @actions/artifact@5.0.3 + run: npm install @actions/artifact - name: Build - uses: actions/github-script@v9 + uses: actions/github-script@v7 id: boards-list with: script: | @@ -95,7 +95,7 @@ jobs: throw new Error('Failed to build one or more configurations'); } - name: Upload artifacts - uses: actions/github-script@v9 + uses: actions/github-script@v7 continue-on-error: ${{ github.event_name == 'pull_request' }} id: boards-upload with: @@ -123,7 +123,7 @@ 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); } catch (e) { @@ -146,7 +146,7 @@ jobs: include-list: ${{ steps.compile-list.outputs.result }} steps: - name: Join build lists - uses: actions/github-script@v9 + uses: actions/github-script@v7 id: compile-list with: script: | @@ -187,16 +187,16 @@ jobs: core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: persist-credentials: false - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v4 with: node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - - uses: actions/github-script@v9 + - uses: actions/github-script@v7 id: core-list with: script: | @@ -218,14 +218,14 @@ jobs: boards-include: ${{ steps.boards-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v4 with: node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - - uses: actions/github-script@v9 + - uses: actions/github-script@v7 id: boards-list with: script: | @@ -277,7 +277,6 @@ jobs: ); } else { console.error("Board without keys or interconnect"); - return []; } break; case "shield": @@ -303,7 +302,7 @@ jobs: nightly-include: ${{ steps.nightly-list.outputs.result }} steps: - name: Create nightly list - uses: actions/github-script@v9 + uses: actions/github-script@v7 id: nightly-list with: script: | @@ -346,17 +345,17 @@ jobs: organized-metadata: ${{ steps.organize-metadata.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: persist-credentials: false - name: Use Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@v4 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@v7 id: aggregate-metadata with: script: | @@ -374,7 +373,7 @@ jobs: result-encoding: string - name: Organize Metadata - uses: actions/github-script@v9 + uses: actions/github-script@v7 id: organize-metadata with: script: | @@ -428,7 +427,7 @@ jobs: core-changes: ${{ steps.core-changes.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 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 @@ -436,7 +435,7 @@ jobs: with: json: true escape_json: false - - uses: actions/github-script@v9 + - uses: actions/github-script@v7 id: board-changes with: script: | @@ -444,7 +443,7 @@ jobs: 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@v7 id: core-changes with: script: | diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index a562ed39..5885865f 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@v4 - 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@v4 - 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..3e3faa0d 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -18,9 +18,9 @@ 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.5 steps: - - uses: actions/checkout@v7 + - uses: actions/checkout@v4 - name: Install dependencies run: pip install --break-system-packages -r app/scripts/requirements.txt - name: West init diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 52b82a62..cc9672f4 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@v4 + - uses: actions/setup-python@v5 with: python-version: 3.x - uses: pre-commit/action@v3.0.1 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 5735eea7..14fadc39 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -20,7 +20,7 @@ jobs: minor: ${{ steps.release.outputs.minor }} patch: ${{ steps.release.outputs.patch }} steps: - - uses: googleapis/release-please-action@v5 + - uses: googleapis/release-please-action@v4 id: release with: token: ${{ secrets.ZMK_RELEASE_PLEASE_TOKEN }} @@ -35,7 +35,7 @@ jobs: 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 + - uses: actions/checkout@v4 - name: Create major.minor branch if: ${{ needs.handle-commit.outputs.patch == '0' }} @@ -69,10 +69,10 @@ jobs: 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 + git clone "https://x-access-token:$ZMK_RELEASE_PLEASE_TOKEN@github.com/zmkfirmware/unified-zmk-config-template.git" + cd unified-zmk-config-template 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 . diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 475a37db..4804c38a 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-24.04 steps: - - uses: actions/stale@v10.3.0 + - uses: actions/stale@v9.1.0 with: days-before-pr-stale: 300 # ~10 months stale-pr-label: "stale" @@ -22,7 +22,6 @@ jobs: 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..93321760 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Find test directories id: test-dirs run: | @@ -37,12 +37,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.5 steps: - name: Checkout - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Cache west modules - uses: actions/cache@v5 + uses: actions/cache@v4 env: cache-name: cache-zephyr-modules with: @@ -66,10 +66,10 @@ jobs: 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@v4 with: name: "${{ matrix.test }}-log-files" path: app/build/**/*.log diff --git a/.gitignore b/.gitignore index 50b8f687..1ef282a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ /.west /bootloader /modules -/optional /tools /zephyr /zmk-config diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index c41153cb..478c325b 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -11,6 +11,9 @@ project(zmk) zephyr_linker_sources(SECTIONS include/linker/zmk-behaviors.ld) zephyr_linker_sources(RODATA include/linker/zmk-events.ld) +if(CONFIG_ZMK_RGB_UNDERGLOW) + zephyr_linker_sources(SECTIONS include/linker/zmk-rgb-effects.ld) +endif() if(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS) zephyr_linker_sources(DATA_SECTIONS include/linker/zmk-behavior-local-id-map.ld) @@ -23,7 +26,6 @@ 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) @@ -72,16 +74,12 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behavior_queue.c) target_sources(app PRIVATE src/conditional_layer.c) target_sources(app PRIVATE src/endpoints.c) - target_sources(app PRIVATE src/events/endpoint_changed.c) target_sources(app PRIVATE src/hid_listener.c) target_sources(app PRIVATE src/keymap.c) - 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) target_sources(app PRIVATE src/behaviors/behavior_bt.c) target_sources(app PRIVATE src/ble.c) target_sources(app PRIVATE src/hog.c) @@ -95,9 +93,16 @@ target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/events/battery 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_BLE app PRIVATE src/events/ble_active_profile_changed.c) target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_status_changed.c) +target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_layer_changed.c) + +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/endpoint_changed.c) + add_subdirectory_ifdef(CONFIG_ZMK_SPLIT src/split) target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c) diff --git a/app/Kconfig b/app/Kconfig index 8c0675e0..fc49414f 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,10 +31,10 @@ 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 @@ -121,8 +110,6 @@ config ZMK_HID_INDICATORS 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 @@ -142,9 +129,7 @@ config ZMK_USB_BOOT bool "USB Boot Protocol Support" depends on ZMK_USB select USB_HID_BOOT_PROTOCOL - -config USB_DEVICE_INITIALIZE_AT_BOOT - default n + select USB_DEVICE_SOF if ZMK_USB @@ -200,6 +185,10 @@ config BT_SMP_ALLOW_UNAUTH_OVERWRITE config BT_CTLR_PHY_2M default n if ZMK_BLE_EXPERIMENTAL_CONN +# 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_THREAD_STACK_SIZE int "BLE notify thread stack size" default 768 @@ -230,6 +219,9 @@ config BT_GATT_NOTIFY_MULTIPLE config BT_GATT_AUTO_SEC_REQ default (ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL) +config BT_DEVICE_APPEARANCE + default 961 + config BT_PERIPHERAL_PREF_MIN_INT default 6 @@ -330,8 +322,8 @@ config ZMK_RGB_UNDERGLOW_SPD_START range 1 5 config ZMK_RGB_UNDERGLOW_EFF_START - int "RGB underglow start effect int value related to the effect enum list" - range 0 3 + int "RGB underglow start effect index (clamped to available effects at runtime)" + range 0 15 config ZMK_RGB_UNDERGLOW_ON_START bool "RGB underglow starts on by default" @@ -443,6 +435,16 @@ config ZMK_GPIO_KEY_WAKEUP_TRIGGER depends on DT_HAS_ZMK_GPIO_KEY_WAKEUP_TRIGGER_ENABLED && ZMK_PM_SOFT_OFF # Power Management +if ZMK_EXT_POWER + +config ZMK_EXT_POWER_START + bool "Enable external power output by default" + default y + +#ZMK_EXT_POWER +endif + +#Power Management endmenu menu "Combo options" @@ -486,15 +488,13 @@ 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 94 config ZMK_USB_HID_INIT_PRIORITY int "USB HID Init Priority" @@ -663,13 +663,6 @@ endmenu # Advanced endmenu # ZMK -if SOC_FAMILY_NORDIC_NRF - -config NRF_SOC_VALIDATE_HEADERS_DISABLED - default y - -endif - config KERNEL_BIN_NAME default "zmk" @@ -704,6 +697,11 @@ 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" @@ -717,6 +715,8 @@ rsource "boards/shields/*/Kconfig.shield" # Duplicated from Kconfig.zephyr osource "$(KCONFIG_BINARY_DIR)/Kconfig.shield.defconfig" +source "$(BOARD_DIR)/Kconfig.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" diff --git a/app/Kconfig.defaults b/app/Kconfig.defaults index 8800b454..21b13058 100644 --- a/app/Kconfig.defaults +++ b/app/Kconfig.defaults @@ -2,12 +2,8 @@ # SPDX-License-Identifier: MIT config SYSTEM_WORKQUEUE_STACK_SIZE - default 3072 if ZMK_DISPLAY - default 2048 - -# Basic -config BT_DEVICE_APPEARANCE - default 961 + default 2048 if SOC_RP2040 + default 2048 if ZMK_BLE # HID if ZMK_HID_REPORT_TYPE_HKRO @@ -114,5 +110,4 @@ config ZMK_BATTERY_REPORT_INTERVAL default 60 # Imports -rsource "src/boot/Kconfig.defaults" -rsource "src/split/Kconfig.defaults" +rsource "src/split/Kconfig.defaults" \ 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/boards/01space_rp2040_042lcd.overlay b/app/boards/01space_rp2040_042lcd.overlay new file mode 100644 index 00000000..b5d2cdb2 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.overlay @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&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/boards/adafruit/kb2040/adafruit_kb2040_zmk.dts b/app/boards/adafruit_kb2040.overlay similarity index 52% rename from app/boards/adafruit/kb2040/adafruit_kb2040_zmk.dts rename to app/boards/adafruit_kb2040.overlay index 8c05cbaf..72b3adca 100644 --- a/app/boards/adafruit/kb2040/adafruit_kb2040_zmk.dts +++ b/app/boards/adafruit_kb2040.overlay @@ -4,7 +4,4 @@ * SPDX-License-Identifier: MIT */ -#include <../boards/adafruit/kb2040/adafruit_kb2040.dts> -#include - &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/boards/adafruit_qt_py_rp2040.overlay b/app/boards/adafruit_qt_py_rp2040.overlay new file mode 100644 index 00000000..b5d2cdb2 --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.overlay @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&xiao_serial { status = "disabled"; }; 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/adv360pro/Kconfig b/app/boards/arm/adv360pro/Kconfig new file mode 100644 index 00000000..1840851c --- /dev/null +++ b/app/boards/arm/adv360pro/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_ADV360PRO_LEFT || BOARD_ADV360PRO_RIGHT diff --git a/app/boards/arm/adv360pro/Kconfig.board b/app/boards/arm/adv360pro/Kconfig.board new file mode 100644 index 00000000..51ebaec0 --- /dev/null +++ b/app/boards/arm/adv360pro/Kconfig.board @@ -0,0 +1,12 @@ +# +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_ADV360PRO_LEFT + bool "adv360pro_left" + depends on SOC_NRF52840_QIAA + +config BOARD_ADV360PRO_RIGHT + bool "adv360pro_right" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/kinesis/adv360pro/Kconfig.defconfig b/app/boards/arm/adv360pro/Kconfig.defconfig similarity index 100% rename from app/boards/kinesis/adv360pro/Kconfig.defconfig rename to app/boards/arm/adv360pro/Kconfig.defconfig diff --git a/app/boards/kinesis/adv360pro/README.md b/app/boards/arm/adv360pro/README.md similarity index 100% rename from app/boards/kinesis/adv360pro/README.md rename to app/boards/arm/adv360pro/README.md diff --git a/app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi b/app/boards/arm/adv360pro/adv360pro-layouts.dtsi similarity index 100% rename from app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi rename to app/boards/arm/adv360pro/adv360pro-layouts.dtsi diff --git a/app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi b/app/boards/arm/adv360pro/adv360pro-pinctrl.dtsi similarity index 100% rename from app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi rename to app/boards/arm/adv360pro/adv360pro-pinctrl.dtsi diff --git a/app/boards/kinesis/adv360pro/adv360pro.dtsi b/app/boards/arm/adv360pro/adv360pro.dtsi similarity index 97% rename from app/boards/kinesis/adv360pro/adv360pro.dtsi rename to app/boards/arm/adv360pro/adv360pro.dtsi index d9a00b01..ca7eaacc 100644 --- a/app/boards/kinesis/adv360pro/adv360pro.dtsi +++ b/app/boards/arm/adv360pro/adv360pro.dtsi @@ -7,7 +7,6 @@ /dts-v1/; #include -#include #include #include @@ -72,10 +71,6 @@ }; -®1 { - regulator-initial-mode = ; -}; - &pwm0 { status = "okay"; pinctrl-0 = <&pwm0_default>; diff --git a/app/boards/kinesis/adv360pro/adv360pro.keymap b/app/boards/arm/adv360pro/adv360pro.keymap similarity index 100% rename from app/boards/kinesis/adv360pro/adv360pro.keymap rename to app/boards/arm/adv360pro/adv360pro.keymap diff --git a/app/boards/kinesis/adv360pro/adv360pro.yaml b/app/boards/arm/adv360pro/adv360pro.yaml similarity index 100% rename from app/boards/kinesis/adv360pro/adv360pro.yaml rename to app/boards/arm/adv360pro/adv360pro.yaml diff --git a/app/boards/kinesis/adv360pro/adv360pro.zmk.yml b/app/boards/arm/adv360pro/adv360pro.zmk.yml similarity index 81% rename from app/boards/kinesis/adv360pro/adv360pro.zmk.yml rename to app/boards/arm/adv360pro/adv360pro.zmk.yml index 2d1e3496..5e882680 100644 --- a/app/boards/kinesis/adv360pro/adv360pro.zmk.yml +++ b/app/boards/arm/adv360pro/adv360pro.zmk.yml @@ -13,5 +13,5 @@ outputs: - usb - ble siblings: - - adv360pro_left//zmk - - adv360pro_right//zmk + - adv360pro_left + - adv360pro_right diff --git a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk.dts b/app/boards/arm/adv360pro/adv360pro_left.dts similarity index 100% rename from app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk.dts rename to app/boards/arm/adv360pro/adv360pro_left.dts diff --git a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk_defconfig b/app/boards/arm/adv360pro/adv360pro_left_defconfig similarity index 90% rename from app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk_defconfig rename to app/boards/arm/adv360pro/adv360pro_left_defconfig index 7a8db4dc..6eb5a8d0 100644 --- a/app/boards/kinesis/adv360pro/adv360pro_left_nrf52840_zmk_defconfig +++ b/app/boards/arm/adv360pro/adv360pro_left_defconfig @@ -3,6 +3,10 @@ # SPDX-License-Identifier: MIT # +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_ADV360PRO_LEFT=y + # Enable MPU CONFIG_ARM_MPU=y @@ -28,6 +32,7 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y #RGB leds config +CONFIG_WS2812_STRIP=y CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n diff --git a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk.dts b/app/boards/arm/adv360pro/adv360pro_right.dts similarity index 100% rename from app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk.dts rename to app/boards/arm/adv360pro/adv360pro_right.dts diff --git a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk_defconfig b/app/boards/arm/adv360pro/adv360pro_right_defconfig similarity index 90% rename from app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk_defconfig rename to app/boards/arm/adv360pro/adv360pro_right_defconfig index 1cda90c0..b5174549 100644 --- a/app/boards/kinesis/adv360pro/adv360pro_right_nrf52840_zmk_defconfig +++ b/app/boards/arm/adv360pro/adv360pro_right_defconfig @@ -3,6 +3,10 @@ # SPDX-License-Identifier: MIT # +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_ADV360PRO_RIGHT=y + # Enable MPU CONFIG_ARM_MPU=y @@ -28,6 +32,7 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y #RGB leds config +CONFIG_WS2812_STRIP=y CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n diff --git a/app/boards/kinesis/adv360pro/board.cmake b/app/boards/arm/adv360pro/board.cmake similarity index 100% rename from app/boards/kinesis/adv360pro/board.cmake rename to app/boards/arm/adv360pro/board.cmake diff --git a/app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake b/app/boards/arm/adv360pro/pre_dt_board.cmake similarity index 100% rename from app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake rename to app/boards/arm/adv360pro/pre_dt_board.cmake 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-layouts.dtsi b/app/boards/arm/bdn9/bdn9_rev2-layouts.dtsi similarity index 100% rename from app/boards/keebio/bdn9/bdn9-layouts.dtsi rename to app/boards/arm/bdn9/bdn9_rev2-layouts.dtsi 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 99% rename from app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk.dts rename to app/boards/arm/bdn9/bdn9_rev2.dts index 542c5341..389d23b7 100644 --- a/app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -11,7 +11,7 @@ #include -#include "bdn9-layouts.dtsi" +#include "bdn9_rev2-layouts.dtsi" &physical_layout0 { transform = <&matrix_transform0>; diff --git a/app/boards/keebio/bdn9/bdn9.keymap b/app/boards/arm/bdn9/bdn9_rev2.keymap similarity index 100% rename from app/boards/keebio/bdn9/bdn9.keymap rename to app/boards/arm/bdn9/bdn9_rev2.keymap 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 85% rename from app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk_defconfig rename to app/boards/arm/bdn9/bdn9_rev2_defconfig index ce598bd2..a59fa522 100644 --- a/app/boards/keebio/bdn9/bdn9_stm32f072xb_zmk_defconfig +++ b/app/boards/arm/bdn9/bdn9_rev2_defconfig @@ -1,5 +1,7 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_STM32F0X=y +CONFIG_SOC_STM32F072XB=y # 72MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 @@ -12,7 +14,6 @@ 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 # clock configuration 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_f401cc/blackpill_f401cc.zmk.yml b/app/boards/arm/blackpill_f401cc/blackpill_f401cc.zmk.yml similarity index 86% rename from app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml rename to app/boards/arm/blackpill_f401cc/blackpill_f401cc.zmk.yml index 2cf8c281..329b7371 100644 --- a/app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml +++ b/app/boards/arm/blackpill_f401cc/blackpill_f401cc.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: blackpill_f401cc//zmk +id: blackpill_f401cc name: BlackPill F401CC type: board arch: arm 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 100% rename from app/module/boards/jpconstantineau/bluemicro840/arduino_pro_micro_pins.dtsi rename to app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi diff --git a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi similarity index 100% rename from app/module/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi rename to app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi diff --git a/app/module/boards/jpconstantineau/bluemicro840/bluemicro840.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts similarity index 81% rename from app/module/boards/jpconstantineau/bluemicro840/bluemicro840.dts rename to app/boards/arm/bluemicro840/bluemicro840_v1.dts index fe32d952..84d3ebae 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,6 +17,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zmk,battery = &vbatt; }; leds { @@ -26,6 +26,21 @@ gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; }; }; + + // 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)>; + }; + }; &adc { 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_nrf52840_zmk_1_1_0_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig similarity index 79% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_1_0_defconfig rename to app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index 709f33d8..3e13e77d 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_zmk_1_1_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/boards/jpconstantineau/bluemicro840/board.cmake b/app/boards/arm/bluemicro840/board.cmake similarity index 100% rename from app/boards/jpconstantineau/bluemicro840/board.cmake rename to app/boards/arm/bluemicro840/board.cmake diff --git a/app/boards/keycapsss/puchi_ble/pre_dt_board.cmake b/app/boards/arm/bluemicro840/pre_dt_board.cmake similarity index 100% rename from app/boards/keycapsss/puchi_ble/pre_dt_board.cmake rename to app/boards/arm/bluemicro840/pre_dt_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/lowprokb/corneish_zen/board.cmake b/app/boards/arm/bt60/board.cmake similarity index 100% rename from app/boards/lowprokb/corneish_zen/board.cmake rename to app/boards/arm/bt60/board.cmake diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk.dts b/app/boards/arm/bt60/bt60.dtsi similarity index 65% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk.dts rename to app/boards/arm/bt60/bt60.dtsi index d4c52c1c..5e176e60 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk.dts +++ b/app/boards/arm/bt60/bt60.dtsi @@ -1,14 +1,17 @@ /* -* Copyright (c) 2022 The ZMK Contributors +* Copyright (c) 2021 Polarity Works * * SPDX-License-Identifier: MIT */ /dts-v1/; #include -#include +#include / { + model = "BT60"; + compatible = "polarityworks,bt60"; + chosen { zephyr,code-partition = &code_partition; zephyr,sram = &sram0; @@ -16,9 +19,35 @@ zmk,battery = &vbatt; }; + 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: vbatt { compatible = "zmk,battery-voltage-divider"; io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; }; }; @@ -42,6 +71,7 @@ zephyr_udc0: &usbd { status = "okay"; }; + &flash0 { /* * For more information, see: diff --git a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0.overlay b/app/boards/arm/bt60/bt60_v1.dts similarity index 99% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0.overlay rename to app/boards/arm/bt60/bt60_v1.dts index c132266d..5790458d 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_1_0_0.overlay +++ b/app/boards/arm/bt60/bt60_v1.dts @@ -4,7 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include "bt60_1_0_0.dtsi" +/dts-v1/; +#include "bt60.dtsi" #include #include #include diff --git a/app/boards/polarityworks/bt60/bt60_1_0_0.keymap b/app/boards/arm/bt60/bt60_v1.keymap similarity index 99% rename from app/boards/polarityworks/bt60/bt60_1_0_0.keymap rename to app/boards/arm/bt60/bt60_v1.keymap index 93957695..65442b58 100644 --- a/app/boards/polarityworks/bt60/bt60_1_0_0.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -20,7 +20,7 @@ #elif defined(HHKB) zmk,physical-layout = &layout_60_hhkb; #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_v1.keymap" #endif }; @@ -147,7 +147,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/module/boards/keycapsss/puchi_ble/puchi_ble.yaml b/app/boards/arm/bt60/bt60_v1.yaml similarity index 77% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble.yaml rename to app/boards/arm/bt60/bt60_v1.yaml index 19d1b122..41fd7e40 100644 --- a/app/module/boards/keycapsss/puchi_ble/puchi_ble.yaml +++ b/app/boards/arm/bt60/bt60_v1.yaml @@ -1,5 +1,5 @@ -identifier: puchi_ble -name: puchi_ble +identifier: bt60_v1 +name: BT60 V1 Soldered type: mcu arch: arm toolchain: 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..4c0faf9f --- /dev/null +++ b/app/boards/arm/bt60/bt60_v1.zmk.yml @@ -0,0 +1,13 @@ +file_format: "1" +id: bt60_v1 +name: BT60 V1 Soldered +type: board +arch: arm +features: + - keys + - encoder + - studio +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 97% rename from app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk.dts rename to app/boards/arm/bt60/bt60_v1_hs.dts index 55f90525..23d4d55b 100644 --- a/app/boards/polarityworks/bt60/bt60_hs_nrf52840_zmk.dts +++ b/app/boards/arm/bt60/bt60_v1_hs.dts @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include "bt60_nrf52840_zmk.dts" -#include "bt60_1_0_0.dtsi" +/dts-v1/; +#include "bt60.dtsi" #include / { diff --git a/app/boards/polarityworks/bt60/bt60_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap similarity index 100% rename from app/boards/polarityworks/bt60/bt60_hs.keymap rename to app/boards/arm/bt60/bt60_v1_hs.keymap 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 90% rename from app/boards/polarityworks/bt60/bt60_hs.zmk.yml rename to app/boards/arm/bt60/bt60_v1_hs.zmk.yml index cc9d8ed7..1c61f6b2 100644 --- a/app/boards/polarityworks/bt60/bt60_hs.zmk.yml +++ b/app/boards/arm/bt60/bt60_v1_hs.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt60_hs//zmk +id: bt60_v1_hs name: BT60 V1 Hotswap type: board arch: arm 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/kinesis/adv360pro/pre_dt_board.cmake b/app/boards/arm/bt60/pre_dt_board.cmake similarity index 100% rename from app/boards/kinesis/adv360pro/pre_dt_board.cmake rename to app/boards/arm/bt60/pre_dt_board.cmake 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/nicekeyboards/nice_nano/board.cmake b/app/boards/arm/ckp/board.cmake similarity index 100% rename from app/boards/nicekeyboards/nice_nano/board.cmake rename to app/boards/arm/ckp/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 98% rename from app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0.overlay rename to app/boards/arm/ckp/bt60_v2.dts index c9aac427..1cdb0307 100644 --- a/app/boards/polarityworks/bt60/bt60_nrf52840_zmk_2_0_0.overlay +++ b/app/boards/arm/ckp/bt60_v2.dts @@ -4,7 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include "../common/ckp.dtsi" +/dts-v1/; +#include "ckp.dtsi" #include #include #include @@ -13,7 +14,7 @@ / { model = "BT60_V2"; - compatible = "polarityworks,bt60"; + compatible = "polarityworks,bt60_v2"; chosen { zmk,physical-layout = &layout_60_ansi; diff --git a/app/boards/polarityworks/bt60/bt60_2_0_0.keymap b/app/boards/arm/ckp/bt60_v2.keymap similarity index 99% rename from app/boards/polarityworks/bt60/bt60_2_0_0.keymap rename to app/boards/arm/ckp/bt60_v2.keymap index c9829589..478cf7bd 100644 --- a/app/boards/polarityworks/bt60/bt60_2_0_0.keymap +++ b/app/boards/arm/ckp/bt60_v2.keymap @@ -20,7 +20,7 @@ #elif defined(HHKB) zmk,physical-layout = &layout_60_hhkb; #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 }; @@ -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/bt60/bt60.zmk.yml b/app/boards/arm/ckp/bt60_v2.zmk.yml similarity index 80% rename from app/boards/polarityworks/bt60/bt60.zmk.yml rename to app/boards/arm/ckp/bt60_v2.zmk.yml index 98bb85fc..eef36a4e 100644 --- a/app/boards/polarityworks/bt60/bt60.zmk.yml +++ b/app/boards/arm/ckp/bt60_v2.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt60//zmk +id: bt60_v2 name: BT60 V2 type: board arch: arm @@ -12,7 +12,4 @@ features: outputs: - usb - ble -revisions: - - 2.0.0 - - 1.0.0 url: https://polarityworks.com/btckp 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 95% rename from app/boards/polarityworks/bt65/bt65_nrf52840_zmk.dts rename to app/boards/arm/ckp/bt65_v1.dts index d7de5143..77e81289 100644 --- a/app/boards/polarityworks/bt65/bt65_nrf52840_zmk.dts +++ b/app/boards/arm/ckp/bt65_v1.dts @@ -5,11 +5,7 @@ */ /dts-v1/; -#include -#include - -#include "../common/ckp-base.dtsi" -#include "../common/ckp.dtsi" +#include "ckp.dtsi" #include #include #include @@ -18,7 +14,7 @@ / { model = "BT65_V1"; - compatible = "polarityworks,bt65"; + compatible = "polarityworks,bt65_v1"; chosen { zmk,physical-layout = &layout_65_ansi; diff --git a/app/boards/polarityworks/bt65/bt65.keymap b/app/boards/arm/ckp/bt65_v1.keymap similarity index 99% rename from app/boards/polarityworks/bt65/bt65.keymap rename to app/boards/arm/ckp/bt65_v1.keymap index b3b34b21..da494143 100644 --- a/app/boards/polarityworks/bt65/bt65.keymap +++ b/app/boards/arm/ckp/bt65_v1.keymap @@ -20,7 +20,7 @@ #elif defined(HHKB) zmk,physical-layout = &layout_65_hhkb; #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 }; @@ -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 92% rename from app/boards/polarityworks/bt65/bt65.zmk.yml rename to app/boards/arm/ckp/bt65_v1.zmk.yml index aaeb1835..b0be40bb 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 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 94% rename from app/boards/polarityworks/bt75/bt75_nrf52840_zmk.dts rename to app/boards/arm/ckp/bt75_v1.dts index bfbef0a2..7c9ab664 100644 --- a/app/boards/polarityworks/bt75/bt75_nrf52840_zmk.dts +++ b/app/boards/arm/ckp/bt75_v1.dts @@ -5,11 +5,7 @@ */ /dts-v1/; -#include -#include - -#include "../common/ckp-base.dtsi" -#include "../common/ckp.dtsi" +#include "ckp.dtsi" #include #include #include @@ -17,7 +13,7 @@ / { model = "BT75_V1"; - compatible = "polarityworks,bt75"; + compatible = "polarityworks,bt75_v1"; chosen { zmk,physical-layout = &layout_75_ansi; diff --git a/app/boards/polarityworks/bt75/bt75.keymap b/app/boards/arm/ckp/bt75_v1.keymap similarity index 99% rename from app/boards/polarityworks/bt75/bt75.keymap rename to app/boards/arm/ckp/bt75_v1.keymap index 42833cb0..ff0db7b0 100644 --- a/app/boards/polarityworks/bt75/bt75.keymap +++ b/app/boards/arm/ckp/bt75_v1.keymap @@ -17,7 +17,7 @@ #elif defined(ALL_1U) zmk,physical-layout = &layout_75_all1u; #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 }; 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/bt75/bt75.zmk.yml b/app/boards/arm/ckp/bt75_v1.zmk.yml similarity index 92% rename from app/boards/polarityworks/bt75/bt75.zmk.yml rename to app/boards/arm/ckp/bt75_v1.zmk.yml index fb909c52..e135abfa 100644 --- a/app/boards/polarityworks/bt75/bt75.zmk.yml +++ b/app/boards/arm/ckp/bt75_v1.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt75//zmk +id: bt75_v1 name: BT75 V1 type: board arch: arm 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 78% rename from app/boards/polarityworks/common/ckp.dtsi rename to app/boards/arm/ckp/ckp.dtsi index ba337468..b127cabc 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 @@ -116,9 +119,8 @@ }; }; -&vbatt { - output-ohms = <100000>; - full-ohms = <(100000 + 100000)>; +&adc { + status = "okay"; }; &pwm0 { @@ -128,6 +130,59 @@ pinctrl-names = "default", "sleep"; }; +&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"; diff --git a/app/boards/lowprokb/corneish_zen/pre_dt_board.cmake b/app/boards/arm/ckp/pre_dt_board.cmake similarity index 100% rename from app/boards/lowprokb/corneish_zen/pre_dt_board.cmake rename to app/boards/arm/ckp/pre_dt_board.cmake 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 88% rename from app/boards/lowprokb/corneish_zen/Kconfig.defconfig rename to app/boards/arm/corneish_zen/Kconfig.defconfig index e4ff579a..11f932b5 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 @@ -79,3 +79,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/polarityworks/bt60/board.cmake b/app/boards/arm/corneish_zen/board.cmake similarity index 100% rename from app/boards/polarityworks/bt60/board.cmake rename to app/boards/arm/corneish_zen/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 98% rename from app/boards/lowprokb/corneish_zen/corneish_zen.dtsi rename to app/boards/arm/corneish_zen/corneish_zen.dtsi index 583f7ed3..788b7613 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -7,7 +7,6 @@ /dts-v1/; #include -#include #include diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap similarity index 100% rename from app/boards/lowprokb/corneish_zen/corneish_zen.keymap rename to app/boards/arm/corneish_zen/corneish_zen.keymap 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 60% 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..8bb5e18e 100644 --- a/app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml +++ b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml @@ -1,6 +1,6 @@ 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 @@ -11,9 +11,6 @@ features: 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 99% 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..4230147e 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 { 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 92% 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..d4de8ed3 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 @@ -47,7 +50,7 @@ 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 99% 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..820d3163 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; 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 92% 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..ad78217f 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 @@ -47,7 +50,7 @@ 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/arm/corneish_zen/corneish_zen_v2.yaml b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml new file mode 100644 index 00000000..46a213d9 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml @@ -0,0 +1,20 @@ +identifier: corneish_zen_v2 +name: Corne-ish Zen v2 +type: keyboard +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - 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..26981e05 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml @@ -0,0 +1,16 @@ +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 + - studio +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 98% 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..42839b61 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; 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 92% 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..b6670fd8 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 @@ -43,7 +46,7 @@ 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 98% 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..b47d122f 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; 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 92% 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..90cfe769 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 @@ -43,7 +46,7 @@ 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/makerdiary/nrf52840_m2/pre_dt_board.cmake b/app/boards/arm/corneish_zen/pre_dt_board.cmake similarity index 100% rename from app/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake rename to app/boards/arm/corneish_zen/pre_dt_board.cmake diff --git a/app/boards/lowprokb/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c similarity index 83% rename from app/boards/lowprokb/corneish_zen/widgets/battery_status.c rename to app/boards/arm/corneish_zen/widgets/battery_status.c index 044d3cee..622e39df 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/battery_status.c +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -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) */ } @@ -85,7 +85,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 100% rename from app/boards/lowprokb/corneish_zen/widgets/layer_status.c rename to app/boards/arm/corneish_zen/widgets/layer_status.c 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 91% rename from app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c rename to app/boards/arm/corneish_zen/widgets/peripheral_status.c index 0f7c7c6d..b94d45f6 100644 --- a/app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -32,8 +32,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 +47,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..b8fac4e2 --- /dev/null +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts @@ -0,0 +1,86 @@ +/* + * 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; + 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"; + + 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> + ; + }; + +}; + +zephyr_udc0: &usb { + status = "okay"; +}; + +&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 { + 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..eaf5d5da --- /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 | - | = | BSPC | +// | 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/arm/dz60rgb/dz60rgb_rev1.yaml b/app/boards/arm/dz60rgb/dz60rgb_rev1.yaml new file mode 100644 index 00000000..d2836218 --- /dev/null +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.yaml @@ -0,0 +1,19 @@ +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 diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig b/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig new file mode 100644 index 00000000..6b6c8a48 --- /dev/null +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig @@ -0,0 +1,26 @@ +# 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 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 85% rename from app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk.dts rename to app/boards/arm/ferris/ferris_rev02.dts index c49ae602..1ec9a804 100644 --- a/app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -106,7 +106,7 @@ clock-frequency = ; right_io: mcp23017@20 { - compatible = "microchip,mcp23017"; + compatible = "microchip,mcp230xx"; status = "okay"; gpio-controller; reg = <0x20>; @@ -147,37 +147,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 { diff --git a/app/boards/pierrechevalier83/ferris/ferris.keymap b/app/boards/arm/ferris/ferris_rev02.keymap similarity index 100% rename from app/boards/pierrechevalier83/ferris/ferris.keymap rename to app/boards/arm/ferris/ferris_rev02.keymap 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 84% rename from app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk_defconfig rename to app/boards/arm/ferris/ferris_rev02_defconfig index eb55b019..bd03c305 100644 --- a/app/boards/pierrechevalier83/ferris/ferris_stm32f072xb_zmk_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -1,5 +1,8 @@ # 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 diff --git a/app/boards/moergo/glove80/CMakeLists.txt b/app/boards/arm/glove80/CMakeLists.txt similarity index 100% rename from app/boards/moergo/glove80/CMakeLists.txt rename to app/boards/arm/glove80/CMakeLists.txt diff --git a/app/boards/arm/glove80/Kconfig b/app/boards/arm/glove80/Kconfig new file mode 100644 index 00000000..f1c12e7e --- /dev/null +++ b/app/boards/arm/glove80/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_GLOVE80_LH || BOARD_GLOVE80_RH) diff --git a/app/boards/arm/glove80/Kconfig.board b/app/boards/arm/glove80/Kconfig.board new file mode 100644 index 00000000..f6891037 --- /dev/null +++ b/app/boards/arm/glove80/Kconfig.board @@ -0,0 +1,10 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_LH + bool "Glove80 LH" + depends on SOC_NRF52840_QIAA + +config BOARD_GLOVE80_RH + bool "Glove80 RH" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/moergo/glove80/Kconfig.defconfig b/app/boards/arm/glove80/Kconfig.defconfig similarity index 86% rename from app/boards/moergo/glove80/Kconfig.defconfig rename to app/boards/arm/glove80/Kconfig.defconfig index 6280a151..b79c752f 100644 --- a/app/boards/moergo/glove80/Kconfig.defconfig +++ b/app/boards/arm/glove80/Kconfig.defconfig @@ -52,4 +52,14 @@ config LED_PWM endif # ZMK_BACKLIGHT +if ZMK_RGB_UNDERGLOW + +config SPI + default y + +config WS2812_STRIP + default y + +endif # ZMK_RGB_UNDERGLOW + endif # BOARD_GLOVE80_LH || BOARD_GLOVE80_RH diff --git a/app/boards/moergo/glove80/board.cmake b/app/boards/arm/glove80/board.cmake similarity index 100% rename from app/boards/moergo/glove80/board.cmake rename to app/boards/arm/glove80/board.cmake diff --git a/app/boards/moergo/glove80/glove80-layouts.dtsi b/app/boards/arm/glove80/glove80-layouts.dtsi similarity index 100% rename from app/boards/moergo/glove80/glove80-layouts.dtsi rename to app/boards/arm/glove80/glove80-layouts.dtsi diff --git a/app/boards/moergo/glove80/glove80.dtsi b/app/boards/arm/glove80/glove80.dtsi similarity index 96% rename from app/boards/moergo/glove80/glove80.dtsi rename to app/boards/arm/glove80/glove80.dtsi index cf3ce7cc..ae760163 100644 --- a/app/boards/moergo/glove80/glove80.dtsi +++ b/app/boards/arm/glove80/glove80.dtsi @@ -5,7 +5,6 @@ /dts-v1/; #include -#include #include #include "glove80-layouts.dtsi" @@ -48,10 +47,6 @@ }; }; -®1 { - regulator-initial-mode = ; -}; - &adc { status = "okay"; }; diff --git a/app/boards/moergo/glove80/glove80.keymap b/app/boards/arm/glove80/glove80.keymap similarity index 100% rename from app/boards/moergo/glove80/glove80.keymap rename to app/boards/arm/glove80/glove80.keymap diff --git a/app/boards/moergo/glove80/glove80.yaml b/app/boards/arm/glove80/glove80.yaml similarity index 100% rename from app/boards/moergo/glove80/glove80.yaml rename to app/boards/arm/glove80/glove80.yaml diff --git a/app/boards/moergo/glove80/glove80.zmk.yml b/app/boards/arm/glove80/glove80.zmk.yml similarity index 100% rename from app/boards/moergo/glove80/glove80.zmk.yml rename to app/boards/arm/glove80/glove80.zmk.yml diff --git a/app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi b/app/boards/arm/glove80/glove80_lh-pinctrl.dtsi similarity index 100% rename from app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi rename to app/boards/arm/glove80/glove80_lh-pinctrl.dtsi diff --git a/app/boards/moergo/glove80/glove80_lh.dts b/app/boards/arm/glove80/glove80_lh.dts similarity index 89% rename from app/boards/moergo/glove80/glove80_lh.dts rename to app/boards/arm/glove80/glove80_lh.dts index 2ed56688..7bd57742 100644 --- a/app/boards/moergo/glove80/glove80_lh.dts +++ b/app/boards/arm/glove80/glove80_lh.dts @@ -19,6 +19,14 @@ zmk,battery = &vbatt; }; + underglow-layer { + compatible = "zmk,underglow-layer"; + pixel-lookup = <52>, <53>, <54>, <69>, <70>, <71>, <15>, <27>, <39>, <51>, <4>, <14>, <26>, <38>, + <50>, <68>, <3>, <13>, <25>, <37>, <49>, <67>, <2>, <12>, <24>, <36>, <48>, <66>, + <1>, <11>, <23>, <35>, <47>, <65>, <0>, <10>, <22>, <34>, <46>, <64>; + }; + + back_led_backlight: pwmleds { compatible = "pwm-leds"; pwm_led_0 { diff --git a/app/boards/moergo/glove80/glove80_lh.keymap b/app/boards/arm/glove80/glove80_lh.keymap similarity index 100% rename from app/boards/moergo/glove80/glove80_lh.keymap rename to app/boards/arm/glove80/glove80_lh.keymap diff --git a/app/boards/moergo/glove80/glove80_lh_defconfig b/app/boards/arm/glove80/glove80_lh_defconfig similarity index 71% rename from app/boards/moergo/glove80/glove80_lh_defconfig rename to app/boards/arm/glove80/glove80_lh_defconfig index 9973e953..d36173bb 100644 --- a/app/boards/moergo/glove80/glove80_lh_defconfig +++ b/app/boards/arm/glove80/glove80_lh_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_GLOVE80_LH=y + # Enable both USB and BLE CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y @@ -12,16 +16,32 @@ CONFIG_USB_DEVICE_VID=0x16c0 CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" +CONFIG_BT_DEVICE_NAME="Glove80" + CONFIG_BT_DIS_PNP_PID=0x27db CONFIG_BT_DIS_PNP_VID=0x16c0 CONFIG_BT_DIS_MANUF="MoErgo" CONFIG_BT_DIS_MODEL="Glove80" +### Bluetooth configuration workarounds + +# Use higher radio transmit power CONFIG_BT_CTLR_TX_PWR_PLUS_8=y # Work-around for Windows bug with battery notifications CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +# Allow unauthenticated re-pairing for already paired hosts. This would permit +# an attacker that can spoof the host's peer address to "steal" the keyboard +# pairing by overwriting it, but without access to the previous keys it can't +# establish a MITM, and the sudden loss of the keyboard would be very obvious to +# the previously-connected host. +CONFIG_BT_SMP_ALLOW_UNAUTH_OVERWRITE=y +CONFIG_ZMK_BLE_PASSKEY_ENTRY=n + +# Fetch peripheral battery level for status display reporting +CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING=y + # Enable MPU CONFIG_ARM_MPU=y @@ -47,6 +67,9 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y # Enable RGB underglow CONFIG_ZMK_RGB_UNDERGLOW=y +# disable EXT_POWER until underglow gets turned on +CONFIG_ZMK_EXT_POWER_START=n + CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 @@ -75,6 +98,13 @@ CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y # space. CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y +# Enable USB boot protocol support +CONFIG_ZMK_USB_BOOT=y +CONFIG_ZMK_HID_INDICATORS=y + +# Send HID indicator to peripherals +CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS=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 diff --git a/app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi b/app/boards/arm/glove80/glove80_rh-pinctrl.dtsi similarity index 100% rename from app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi rename to app/boards/arm/glove80/glove80_rh-pinctrl.dtsi diff --git a/app/boards/moergo/glove80/glove80_rh.dts b/app/boards/arm/glove80/glove80_rh.dts similarity index 89% rename from app/boards/moergo/glove80/glove80_rh.dts rename to app/boards/arm/glove80/glove80_rh.dts index 7b54f62c..0cb16518 100644 --- a/app/boards/moergo/glove80/glove80_rh.dts +++ b/app/boards/arm/glove80/glove80_rh.dts @@ -20,6 +20,14 @@ zmk,battery = &vbatt; }; + underglow-layer { + compatible = "zmk,underglow-layer"; + pixel-lookup = <57>, <56>, <55>, <74>, <73>, <72>, <16>, <28>, <40>, <58>, <5>, <17>, <29>, <41>, + <59>, <75>, <6>, <18>, <30>, <42>, <60>, <76>, <7>, <19>, <31>, <43>, <61>, <77>, + <8>, <20>, <32>, <44>, <62>, <78>, <9>, <21>, <33>, <45>, <63>, <79>; + }; + + back_led_backlight: pwmleds { compatible = "pwm-leds"; pwm_led_0 { diff --git a/app/boards/moergo/glove80/glove80_rh.keymap b/app/boards/arm/glove80/glove80_rh.keymap similarity index 100% rename from app/boards/moergo/glove80/glove80_rh.keymap rename to app/boards/arm/glove80/glove80_rh.keymap diff --git a/app/boards/moergo/glove80/glove80_rh_defconfig b/app/boards/arm/glove80/glove80_rh_defconfig similarity index 92% rename from app/boards/moergo/glove80/glove80_rh_defconfig rename to app/boards/arm/glove80/glove80_rh_defconfig index d45e0ded..b6795f5d 100644 --- a/app/boards/moergo/glove80/glove80_rh_defconfig +++ b/app/boards/arm/glove80/glove80_rh_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_GLOVE80_RH=y + # Enable both USB and BLE CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y @@ -59,6 +63,10 @@ CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 +# Enable HID indicators on peripheral +CONFIG_ZMK_HID_INDICATORS=y +CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS=y + # The power LED is implemented as a backlight # For now, the power LED is acting as a "USB connected" indicator CONFIG_ZMK_BACKLIGHT=y diff --git a/app/boards/mechwild/s40nc/pre_dt_board.cmake b/app/boards/arm/glove80/pre_dt_board.cmake similarity index 100% rename from app/boards/mechwild/s40nc/pre_dt_board.cmake rename to app/boards/arm/glove80/pre_dt_board.cmake diff --git a/app/boards/moergo/glove80/readme.md b/app/boards/arm/glove80/readme.md similarity index 100% rename from app/boards/moergo/glove80/readme.md rename to app/boards/arm/glove80/readme.md diff --git a/app/boards/moergo/glove80/usb_serial_number.c b/app/boards/arm/glove80/usb_serial_number.c similarity index 100% rename from app/boards/moergo/glove80/usb_serial_number.c rename to app/boards/arm/glove80/usb_serial_number.c 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 91% rename from app/boards/kbdfans/tofu65/tofu65_rp2040_zmk.dts rename to app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts index d1249c83..bc6a9d02 100644 --- a/app/boards/kbdfans/tofu65/tofu65_rp2040_zmk.dts +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts @@ -5,9 +5,7 @@ /dts-v1/; -#include -#include - +#include #include #include @@ -17,12 +15,17 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; - zephyr,flash-controller = &ssi; zephyr,code-partition = &code_partition; zmk,kscan = &kscan0; zmk,physical-layout = &layout_65_ansi; }; + xtal_clk: xtal-clk { + compatible = "fixed-clock"; + clock-frequency = <12000000>; + #clock-cells = <0>; + }; + default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <15>; @@ -104,23 +107,11 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) }; }; -&timer { - status = "okay"; -}; - -&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"; 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/module/boards/joric/nrfmicro/CMakeLists.txt b/app/boards/arm/mikoto/CMakeLists.txt similarity index 100% rename from app/module/boards/joric/nrfmicro/CMakeLists.txt rename to app/boards/arm/mikoto/CMakeLists.txt diff --git a/app/module/boards/zhiayang/mikoto/Kconfig b/app/boards/arm/mikoto/Kconfig similarity index 74% rename from app/module/boards/zhiayang/mikoto/Kconfig rename to app/boards/arm/mikoto/Kconfig index 0313f68b..b40fdcff 100644 --- a/app/module/boards/zhiayang/mikoto/Kconfig +++ b/app/boards/arm/mikoto/Kconfig @@ -1,3 +1,15 @@ +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_MIKOTO) + +config BOARD_ENABLE_DCDC_HV + bool "High voltage DCDC converter" + select SOC_DCDC_NRF52X_HV + default n + depends on (BOARD_MIKOTO) + choice BOARD_MIKOTO_CHARGER_CURRENT prompt "Charge current to supply to attached batteries" depends on (BOARD_MIKOTO) diff --git a/app/boards/arm/mikoto/Kconfig.board b/app/boards/arm/mikoto/Kconfig.board new file mode 100644 index 00000000..b51dce8a --- /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 + bool "mikoto" + depends on SOC_NRF52840_QIAA diff --git a/app/module/boards/zhiayang/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig similarity index 83% rename from app/module/boards/zhiayang/mikoto/Kconfig.defconfig rename to app/boards/arm/mikoto/Kconfig.defconfig index 730cc005..0710f6fd 100644 --- a/app/module/boards/zhiayang/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -5,6 +5,9 @@ if BOARD_MIKOTO +config BOARD + default "mikoto" + if USB config USB_NRFX @@ -15,6 +18,9 @@ config USB_DEVICE_STACK endif # USB +config BT_CTLR + default BT + choice BOARD_MIKOTO_CHARGER_CURRENT default BOARD_MIKOTO_CHARGER_CURRENT_100MA endchoice diff --git a/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi b/app/boards/arm/mikoto/arduino_pro_micro_pins_v5.dtsi similarity index 100% rename from app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi rename to app/boards/arm/mikoto/arduino_pro_micro_pins_v5.dtsi diff --git a/app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi b/app/boards/arm/mikoto/arduino_pro_micro_pins_v6.dtsi similarity index 100% rename from app/module/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi rename to app/boards/arm/mikoto/arduino_pro_micro_pins_v6.dtsi diff --git a/app/boards/polarityworks/bt65/board.cmake b/app/boards/arm/mikoto/board.cmake similarity index 100% rename from app/boards/polarityworks/bt65/board.cmake rename to app/boards/arm/mikoto/board.cmake diff --git a/app/module/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto-pinctrl.dtsi similarity index 100% rename from app/module/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi rename to app/boards/arm/mikoto/mikoto-pinctrl.dtsi diff --git a/app/module/boards/zhiayang/mikoto/mikoto.dts b/app/boards/arm/mikoto/mikoto.dts similarity index 81% rename from app/module/boards/zhiayang/mikoto/mikoto.dts rename to app/boards/arm/mikoto/mikoto.dts index e0ce24aa..b8dca950 100644 --- a/app/module/boards/zhiayang/mikoto/mikoto.dts +++ b/app/boards/arm/mikoto/mikoto.dts @@ -6,7 +6,6 @@ /dts-v1/; #include -#include / { model = "mikoto"; @@ -16,6 +15,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zmk,battery = &vbatt; }; leds { @@ -24,10 +24,20 @@ gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; }; }; -}; -®1 { - regulator-initial-mode = ; + // 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)>; + }; }; &adc { diff --git a/app/module/boards/zhiayang/mikoto/mikoto.yaml b/app/boards/arm/mikoto/mikoto.yaml similarity index 100% rename from app/module/boards/zhiayang/mikoto/mikoto.yaml rename to app/boards/arm/mikoto/mikoto.yaml diff --git a/app/boards/zhiayang/mikoto/mikoto.zmk.yml b/app/boards/arm/mikoto/mikoto.zmk.yml similarity index 93% rename from app/boards/zhiayang/mikoto/mikoto.zmk.yml rename to app/boards/arm/mikoto/mikoto.zmk.yml index 7726e82b..6e073410 100644 --- a/app/boards/zhiayang/mikoto/mikoto.zmk.yml +++ b/app/boards/arm/mikoto/mikoto.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: mikoto//zmk +id: mikoto name: Mikoto type: board arch: arm diff --git a/app/module/boards/zhiayang/mikoto/mikoto_5_20_0.overlay b/app/boards/arm/mikoto/mikoto_5_20_0.overlay similarity index 100% rename from app/module/boards/zhiayang/mikoto/mikoto_5_20_0.overlay rename to app/boards/arm/mikoto/mikoto_5_20_0.overlay diff --git a/app/module/boards/zhiayang/mikoto/mikoto_6_1_0.overlay b/app/boards/arm/mikoto/mikoto_6_1_0.overlay similarity index 100% rename from app/module/boards/zhiayang/mikoto/mikoto_6_1_0.overlay rename to app/boards/arm/mikoto/mikoto_6_1_0.overlay diff --git a/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.conf b/app/boards/arm/mikoto/mikoto_7_2_0.conf similarity index 100% rename from app/module/boards/zhiayang/mikoto/mikoto_7_2_0.conf rename to app/boards/arm/mikoto/mikoto_7_2_0.conf diff --git a/app/module/boards/zhiayang/mikoto/mikoto_7_2_0.overlay b/app/boards/arm/mikoto/mikoto_7_2_0.overlay similarity index 100% rename from app/module/boards/zhiayang/mikoto/mikoto_7_2_0.overlay rename to app/boards/arm/mikoto/mikoto_7_2_0.overlay diff --git a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0_defconfig b/app/boards/arm/mikoto/mikoto_defconfig similarity index 81% rename from app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0_defconfig rename to app/boards/arm/mikoto/mikoto_defconfig index babddaac..4b3bc7d9 100644 --- a/app/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_1_0_0_defconfig +++ b/app/boards/arm/mikoto/mikoto_defconfig @@ -1,14 +1,16 @@ # SPDX-License-Identifier: MIT +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_MIKOTO=y + # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=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/zhiayang/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c similarity index 100% rename from app/module/boards/zhiayang/mikoto/pinmux.c rename to app/boards/arm/mikoto/pinmux.c diff --git a/app/boards/moergo/glove80/pre_dt_board.cmake b/app/boards/arm/mikoto/pre_dt_board.cmake similarity index 100% rename from app/boards/moergo/glove80/pre_dt_board.cmake rename to app/boards/arm/mikoto/pre_dt_board.cmake diff --git a/app/boards/arm/mikoto/revision.cmake b/app/boards/arm/mikoto/revision.cmake new file mode 100644 index 00000000..12fd4bd4 --- /dev/null +++ b/app/boards/arm/mikoto/revision.cmake @@ -0,0 +1,7 @@ +board_check_revision(FORMAT MAJOR.MINOR.PATCH + DEFAULT_REVISION 5.20.0 + VALID_REVISIONS + 5.20.0 # first public release + 6.1.0 6.3.0 # incompatible pinout change from v5+ + 7.2.0 # addition of MAX17048; compatible pinout with v6+ +) 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 100% rename from app/boards/nicekeyboards/nice60/board.cmake rename to app/boards/arm/nice60/board.cmake diff --git a/app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi similarity index 100% rename from app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi rename to app/boards/arm/nice60/nice60-pinctrl.dtsi diff --git a/app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk.dts b/app/boards/arm/nice60/nice60.dts similarity index 97% rename from app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk.dts rename to app/boards/arm/nice60/nice60.dts index acecda4d..35eececd 100644 --- a/app/boards/nicekeyboards/nice60/nice60_nrf52840_zmk.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -6,7 +6,6 @@ /dts-v1/; #include -#include #include #include @@ -93,10 +92,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R }; }; -®1 { - regulator-initial-mode = ; -}; - &adc { status = "okay"; }; diff --git a/app/boards/nicekeyboards/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap similarity index 100% rename from app/boards/nicekeyboards/nice60/nice60.keymap rename to app/boards/arm/nice60/nice60.keymap 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 90% rename from app/boards/nicekeyboards/nice60/nice60.zmk.yml rename to app/boards/arm/nice60/nice60.zmk.yml index b6d2a2b1..2847260f 100644 --- a/app/boards/nicekeyboards/nice60/nice60.zmk.yml +++ b/app/boards/arm/nice60/nice60.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: nice60//zmk +id: nice60 name: nice!60 type: board arch: arm 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/nicekeyboards/nice60/pre_dt_board.cmake b/app/boards/arm/nice60/pre_dt_board.cmake similarity index 100% rename from app/boards/nicekeyboards/nice60/pre_dt_board.cmake rename to app/boards/arm/nice60/pre_dt_board.cmake diff --git a/app/boards/arm/nice_nano/Kconfig b/app/boards/arm/nice_nano/Kconfig new file mode 100644 index 00000000..18a0a12e --- /dev/null +++ b/app/boards/arm/nice_nano/Kconfig @@ -0,0 +1,13 @@ +# 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) + +config BOARD_ENABLE_DCDC_HV + bool "High voltage DCDC converter" + select SOC_DCDC_NRF52X_HV + default n + depends on (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 100% 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 diff --git a/app/boards/polarityworks/bt75/board.cmake b/app/boards/arm/nice_nano/board.cmake similarity index 100% rename from app/boards/polarityworks/bt75/board.cmake rename to app/boards/arm/nice_nano/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 100% rename from app/module/boards/nicekeyboards/nice_nano/nice_nano-pinctrl.dtsi rename to app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi 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 85% 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..06be88e1 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,9 +1,12 @@ /* - * 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; diff --git a/app/module/boards/nicekeyboards/nice_nano/nice_nano.dts b/app/boards/arm/nice_nano/nice_nano.dtsi similarity index 96% rename from app/module/boards/nicekeyboards/nice_nano/nice_nano.dts rename to app/boards/arm/nice_nano/nice_nano.dtsi index 2788ceae..839845c8 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"; @@ -29,10 +26,6 @@ }; }; -®1 { - regulator-initial-mode = ; -}; - &adc { status = "okay"; }; 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/zhiayang/mikoto/mikoto_nrf52840_zmk_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig similarity index 77% rename from app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_defconfig rename to app/boards/arm/nice_nano/nice_nano_defconfig index 56aa9526..6b7fcab2 100644 --- a/app/boards/zhiayang/mikoto/mikoto_nrf52840_zmk_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -1,12 +1,18 @@ # 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 -CONFIG_PINCTRL=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/boards/nicekeyboards/nice_nano/nice_nano_nrf52840_zmk_2_0_0.overlay b/app/boards/arm/nice_nano/nice_nano_v2.dts similarity index 92% 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..c4f7a821 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,6 +4,9 @@ * SPDX-License-Identifier: MIT */ +/dts-v1/; +#include "nice_nano.dtsi" + / { chosen { zmk,battery = &vbatt; @@ -20,7 +23,3 @@ compatible = "zmk,battery-nrf-vddh"; }; }; - -®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/boards/nicekeyboards/nice_nano/pre_dt_board.cmake b/app/boards/arm/nice_nano/pre_dt_board.cmake similarity index 100% rename from app/boards/nicekeyboards/nice_nano/pre_dt_board.cmake rename to app/boards/arm/nice_nano/pre_dt_board.cmake 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 89% rename from app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts rename to app/boards/arm/nrf52840_m2/nrf52840_m2.dts index 821fcd2a..39569f0b 100644 --- a/app/module/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -15,6 +15,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zmk,battery = &vbatt; }; leds { @@ -29,6 +30,14 @@ gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; }; }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; + }; &adc { 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/polarityworks/bt60/pre_dt_board.cmake b/app/boards/arm/nrf52840_m2/pre_dt_board.cmake similarity index 100% rename from app/boards/polarityworks/bt60/pre_dt_board.cmake rename to app/boards/arm/nrf52840_m2/pre_dt_board.cmake 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/module/boards/keycapsss/puchi_ble/CMakeLists.txt b/app/boards/arm/nrfmicro/CMakeLists.txt similarity index 100% rename from app/module/boards/keycapsss/puchi_ble/CMakeLists.txt rename to app/boards/arm/nrfmicro/CMakeLists.txt 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/module/boards/joric/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig similarity index 50% rename from app/module/boards/joric/nrfmicro/Kconfig.defconfig rename to app/boards/arm/nrfmicro/Kconfig.defconfig index 9207183e..38daacde 100644 --- a/app/module/boards/joric/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -3,7 +3,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED || BOARD_NRFMICRO_NRF52833 +if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD default "nrfmicro" @@ -18,12 +18,11 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -if BOARD_REVISION = "1.3.0" +if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD_NRFMICRO_CHARGER default y -endif # BOARD_REVISION = "1.3.0" +endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 - -endif # BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED || BOARD_NRFMICRO_NRF52833 +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 100% rename from app/module/boards/joric/nrfmicro/arduino_pro_micro_pins.dtsi rename to app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi 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 100% 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 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 100% 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 diff --git a/app/boards/zhiayang/mikoto/board.cmake b/app/boards/arm/nrfmicro/board.cmake similarity index 100% rename from app/boards/zhiayang/mikoto/board.cmake rename to app/boards/arm/nrfmicro/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 100% rename from app/module/boards/joric/nrfmicro/nrfmicro-flipped-pinctrl.dtsi rename to app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi diff --git a/app/module/boards/joric/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi similarity index 100% rename from app/module/boards/joric/nrfmicro/nrfmicro-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 89% rename from app/module/boards/joric/nrfmicro/nrfmicro_nrf52840.dts rename to app/boards/arm/nrfmicro/nrfmicro_11.dts index 787cfc34..b80ed4c6 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" @@ -26,14 +25,13 @@ gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; }; }; -}; -®1 { - regulator-initial-mode = ; -}; - -&adc { - status = "okay"; + // 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>; + }; }; &gpiote { @@ -74,6 +72,7 @@ zephyr_udc0: &usbd { status = "okay"; }; + &flash0 { /* * For more information, see: 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 89% rename from app/module/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts rename to app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 1e328816..7b89b62f 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" @@ -26,10 +25,13 @@ gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; }; }; -}; -®1 { - regulator-initial-mode = ; + // 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>; + }; }; &gpiote { 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..0cb22e63 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -0,0 +1,122 @@ +/* + * 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; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + }; + }; + + // 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"; +}; + +&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"; +}; + +&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>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +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/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 82% rename from app/module/boards/joric/nrfmicro/nrfmicro_nrf52833.dts rename to app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 72398716..866276bb 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,6 +17,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zmk,battery = &vbatt; }; leds { @@ -27,10 +26,20 @@ gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; }; }; -}; -®1 { - regulator-initial-mode = ; + // 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 { 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_nrf52833_zmk_1_3_0_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig similarity index 78% rename from app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk_1_3_0_defconfig rename to app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig index 709f33d8..f459f356 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52833_zmk_1_3_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 100% rename from app/module/boards/joric/nrfmicro/pinmux.c rename to app/boards/arm/nrfmicro/pinmux.c diff --git a/app/boards/polarityworks/bt65/pre_dt_board.cmake b/app/boards/arm/nrfmicro/pre_dt_board.cmake similarity index 100% rename from app/boards/polarityworks/bt65/pre_dt_board.cmake rename to app/boards/arm/nrfmicro/pre_dt_board.cmake 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/boards/mechwild/pillbug/board.cmake b/app/boards/arm/pillbug/board.cmake similarity index 100% rename from app/boards/mechwild/pillbug/board.cmake rename to app/boards/arm/pillbug/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 82% rename from app/module/boards/mechwild/pillbug/pillbug.dts rename to app/boards/arm/pillbug/pillbug.dts index b24f05df..cf4f62fc 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,6 +18,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zmk,battery = &vbatt; }; leds { @@ -27,6 +27,20 @@ gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; }; }; + + // 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)>; + }; }; &adc { @@ -72,6 +86,7 @@ zephyr_udc0: &usbd { status = "okay"; }; + &flash0 { /* * For more information, see: 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/polarityworks/bt75/pre_dt_board.cmake b/app/boards/arm/pillbug/pre_dt_board.cmake similarity index 100% rename from app/boards/polarityworks/bt75/pre_dt_board.cmake rename to app/boards/arm/pillbug/pre_dt_board.cmake 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 100% rename from app/boards/olkb/planck/planck_stm32f303xc_zmk.dts rename to app/boards/arm/planck/planck_rev6.dts diff --git a/app/boards/olkb/planck/planck.keymap b/app/boards/arm/planck/planck_rev6.keymap similarity index 100% rename from app/boards/olkb/planck/planck.keymap rename to app/boards/arm/planck/planck_rev6.keymap 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 60% rename from app/boards/olkb/planck/planck.zmk.yml rename to app/boards/arm/planck/planck_rev6.zmk.yml index 54194542..f9d42424 100644 --- a/app/boards/olkb/planck/planck.zmk.yml +++ b/app/boards/arm/planck/planck_rev6.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: planck//zmk -name: Planck (Rev6) +id: planck_rev6 +name: Planck Rev6 type: board arch: arm features: @@ -9,6 +9,3 @@ features: outputs: - usb url: https://olkb.com/collections/planck -revisions: - - "6.0.0" -default_revision: "6.0.0" diff --git a/app/boards/olkb/planck/planck_stm32f303xc_zmk_6_0_0_defconfig b/app/boards/arm/planck/planck_rev6_defconfig similarity index 85% rename from app/boards/olkb/planck/planck_stm32f303xc_zmk_6_0_0_defconfig rename to app/boards/arm/planck/planck_rev6_defconfig index 154e7687..f4530639 100644 --- a/app/boards/olkb/planck/planck_stm32f303xc_zmk_6_0_0_defconfig +++ b/app/boards/arm/planck/planck_rev6_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 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 100% rename from app/boards/olkb/preonic/preonic_stm32f303xc_zmk.dts rename to app/boards/arm/preonic/preonic_rev3.dts diff --git a/app/boards/olkb/preonic/preonic.keymap b/app/boards/arm/preonic/preonic_rev3.keymap similarity index 100% rename from app/boards/olkb/preonic/preonic.keymap rename to app/boards/arm/preonic/preonic_rev3.keymap 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 100% rename from app/module/boards/qmk/proton_c/proton_c.dts rename to app/boards/arm/proton_c/proton_c.dts 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/module/boards/zhiayang/mikoto/CMakeLists.txt b/app/boards/arm/puchi_ble/CMakeLists.txt similarity index 100% rename from app/module/boards/zhiayang/mikoto/CMakeLists.txt rename to app/boards/arm/puchi_ble/CMakeLists.txt 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/keycapsss/puchi_ble/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig similarity index 56% rename from app/boards/keycapsss/puchi_ble/Kconfig.defconfig rename to app/boards/arm/puchi_ble/Kconfig.defconfig index 696e60f0..0ba7eefd 100644 --- a/app/boards/keycapsss/puchi_ble/Kconfig.defconfig +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -1,7 +1,10 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_PUCHI_BLE +if BOARD_PUCHI_BLE_v1 + +config BOARD + default "puchi_ble" if USB_DEVICE_STACK @@ -10,4 +13,7 @@ config USB_NRFX endif # USB_DEVICE_STACK -endif # BOARD_PUCHI_BLE +config BT_CTLR + default BT + +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 100% rename from app/module/boards/keycapsss/puchi_ble/board.cmake rename to app/boards/arm/puchi_ble/board.cmake diff --git a/app/module/boards/keycapsss/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c similarity index 95% rename from app/module/boards/keycapsss/puchi_ble/pinmux.c rename to app/boards/arm/puchi_ble/pinmux.c index 42689383..8475cfb1 100644 --- a/app/module/boards/keycapsss/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -12,7 +12,7 @@ #include static int pinmux_puchi_ble_init(void) { -#if CONFIG_BOARD_PUCHI_BLE +#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/boards/zhiayang/mikoto/pre_dt_board.cmake b/app/boards/arm/puchi_ble/pre_dt_board.cmake similarity index 100% rename from app/boards/zhiayang/mikoto/pre_dt_board.cmake rename to app/boards/arm/puchi_ble/pre_dt_board.cmake diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi similarity index 100% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi rename to app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi diff --git a/app/module/boards/keycapsss/puchi_ble/puchi_ble.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts similarity index 96% rename from app/module/boards/keycapsss/puchi_ble/puchi_ble.dts rename to app/boards/arm/puchi_ble/puchi_ble_v1.dts index 8195f568..9f3194e0 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"; 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 100% rename from app/boards/mechwild/s40nc/board.cmake rename to app/boards/arm/s40nc/board.cmake diff --git a/app/module/boards/joric/nrfmicro/pre_dt_board.cmake b/app/boards/arm/s40nc/pre_dt_board.cmake similarity index 100% rename from app/module/boards/joric/nrfmicro/pre_dt_board.cmake rename to app/boards/arm/s40nc/pre_dt_board.cmake diff --git a/app/boards/mechwild/s40nc/s40nc_nrf52840_zmk.dts b/app/boards/arm/s40nc/s40nc.dts similarity index 98% rename from app/boards/mechwild/s40nc/s40nc_nrf52840_zmk.dts rename to app/boards/arm/s40nc/s40nc.dts index 814a0801..4c37030d 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 / { 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 86% rename from app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml rename to app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml index da65bb69..51093b04 100644 --- a/app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml +++ b/app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: seeeduino_xiao//zmk +id: seeeduino_xiao name: Seeed Studio XIAO SAMD21 type: board arch: arm 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 87% 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..55bbe593 100644 --- a/app/boards/seeed/xiao_ble/xiao_ble.zmk.yml +++ b/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: xiao_ble//zmk +id: seeeduino_xiao_ble name: Seeed Studio XIAO nRF52840 type: board arch: arm 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 85% 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..1260a992 100644 --- a/app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml +++ b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: xiao_rp2040//zmk +id: seeeduino_xiao_rp2040 name: Seeed Studio XIAO RP2040 type: board arch: arm 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_f401cc.conf b/app/boards/blackpill_f401cc.conf new file mode 100644 index 00000000..c4252425 --- /dev/null +++ b/app/boards/blackpill_f401cc.conf @@ -0,0 +1,6 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk.dts b/app/boards/blackpill_f401cc.overlay similarity index 94% rename from app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk.dts rename to app/boards/blackpill_f401cc.overlay index f9be15c1..6ed4c3cf 100644 --- a/app/boards/weact/blackpill_f411ce/blackpill_f411ce_zmk.dts +++ b/app/boards/blackpill_f401cc.overlay @@ -1,11 +1,9 @@ /* - * Copyright (c) 2026 The ZMK Contributors + * Copyright (c) 2024 The ZMK Contributors * * SPDX-License-Identifier: MIT */ -#include <../boards/weact/blackpill_f411ce/blackpill_f411ce.dts> - / { blackpill: connector { compatible = "blackpill"; diff --git a/app/boards/blackpill_f401ce.conf b/app/boards/blackpill_f401ce.conf new file mode 100644 index 00000000..c4252425 --- /dev/null +++ b/app/boards/blackpill_f401ce.conf @@ -0,0 +1,6 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk.dts b/app/boards/blackpill_f401ce.overlay similarity index 94% rename from app/boards/weact/blackpill_f401ce/blackpill_f401ce_zmk.dts rename to app/boards/blackpill_f401ce.overlay index ea7f0634..54e360a3 100644 --- a/app/boards/weact/blackpill_f401ce/blackpill_f401ce_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_f401ce/blackpill_f401ce.dts> / { blackpill: connector { diff --git a/app/boards/blackpill_f411ce.conf b/app/boards/blackpill_f411ce.conf new file mode 100644 index 00000000..c4252425 --- /dev/null +++ b/app/boards/blackpill_f411ce.conf @@ -0,0 +1,6 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk.dts b/app/boards/blackpill_f411ce.overlay similarity index 94% rename from app/boards/weact/blackpill_f401cc/blackpill_f401cc_zmk.dts rename to app/boards/blackpill_f411ce.overlay index 4704552d..54e360a3 100644 --- a/app/boards/weact/blackpill_f401cc/blackpill_f401cc_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_f401cc/blackpill_f401cc.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/boardsource_blok.overlay b/app/boards/boardsource_blok.overlay new file mode 100644 index 00000000..72b3adca --- /dev/null +++ b/app/boards/boardsource_blok.overlay @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&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/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/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/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.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/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/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/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.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/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/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.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/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.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/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_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/boards/native/native_sim/native_sim_native_zmk_test_mock_defconfig b/app/boards/native_posix.conf similarity index 56% rename from app/boards/native/native_sim/native_sim_native_zmk_test_mock_defconfig rename to app/boards/native_posix.conf index fc1b0407..c3d0260e 100644 --- a/app/boards/native/native_sim/native_sim_native_zmk_test_mock_defconfig +++ b/app/boards/native_posix.conf @@ -1,8 +1,5 @@ -# SPDX-License-Identifier: MIT - -CONFIG_CONSOLE=y -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=1000000 - +CONFIG_GPIO=n +CONFIG_ZMK_BLE=n CONFIG_LOG=y CONFIG_LOG_BACKEND_SHOW_COLOR=n CONFIG_ZMK_LOG_LEVEL_DBG=y 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..d5ebcf18 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 @@ -14,5 +12,6 @@ rows = <2>; columns = <2>; + exit-after; }; }; diff --git a/app/boards/native/native_sim/native_sim_native_zmk_display_testing_defconfig b/app/boards/native_posix_64.conf similarity index 51% rename from app/boards/native/native_sim/native_sim_native_zmk_display_testing_defconfig rename to app/boards/native_posix_64.conf index 26fcc6ad..0d8e0d81 100644 --- a/app/boards/native/native_sim/native_sim_native_zmk_display_testing_defconfig +++ b/app/boards/native_posix_64.conf @@ -1,10 +1,6 @@ -# SPDX-License-Identifier: MIT - -CONFIG_ZMK_DISPLAY=y - -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_posix_64.overlay b/app/boards/native_posix_64.overlay new file mode 100644 index 00000000..5b8e23d3 --- /dev/null +++ b/app/boards/native_posix_64.overlay @@ -0,0 +1,27 @@ + +#include +#include + +/ { + chosen { + zephyr,console = &uart0; + zmk,kscan = &kscan; + }; + + kscan: native_posix_64_kscan_mock { + compatible = "zmk,kscan-mock"; + + rows = <2>; + columns = <2>; + exit-after; + }; + + uart0: uart { + status = "okay"; + compatible = "zephyr,native-posix-uart"; + /* Dummy current-speed entry to comply with serial + * DTS binding + */ + current-speed = <0>; + }; +}; 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/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/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/nrf52_bsim.conf b/app/boards/nrf52_bsim.conf new file mode 100644 index 00000000..526f3bc7 --- /dev/null +++ b/app/boards/nrf52_bsim.conf @@ -0,0 +1,4 @@ +CONFIG_ZMK_BLE=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/nrf52_bsim.overlay similarity index 65% rename from app/boards/native/native_sim/native_sim_zmk_test_mock.dts rename to app/boards/nrf52_bsim.overlay index fa67bfc5..ec7c49ae 100644 --- a/app/boards/native/native_sim/native_sim_zmk_test_mock.dts +++ b/app/boards/nrf52_bsim.overlay @@ -1,5 +1,4 @@ - -#include <../boards/native/native_sim/native_sim.dts> +#include #include #include @@ -8,12 +7,10 @@ zmk,kscan = &kscan; }; - kscan: native_posix_64_kscan_mock { + kscan: kscan { compatible = "zmk,kscan-mock"; rows = <2>; columns = <2>; - exit-after; }; }; - 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/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/olkb/preonic/preonic_stm32f303xc_zmk_defconfig b/app/boards/olkb/preonic/preonic_stm32f303xc_zmk_defconfig deleted file mode 100644 index fbe05d58..00000000 --- a/app/boards/olkb/preonic/preonic_stm32f303xc_zmk_defconfig +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: MIT - -# 72MHz system clock -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 - -# enable pinctrl -CONFIG_PINCTRL=y - -# enable GPIO -CONFIG_GPIO=y - -# clock configuration -CONFIG_CLOCK_CONTROL=y - -CONFIG_ZMK_USB=y 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/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.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/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/Kconfig.defconfig b/app/boards/polarityworks/bt75/Kconfig.defconfig deleted file mode 100644 index ded51c24..00000000 --- a/app/boards/polarityworks/bt75/Kconfig.defconfig +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config ZMK_KEYBOARD_NAME - default "BT75" if BOARD_BT75 - -if BOARD_BT75 - -if USB - -config USB_NRFX - default y - -config USB_DEVICE_STACK - default y - -endif # USB - -config BT_CTLR - default BT - -endif # BOARD_BT75 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/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/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_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_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_ble.conf b/app/boards/seeeduino_xiao_ble.conf new file mode 100644 index 00000000..205f67e9 --- /dev/null +++ b/app/boards/seeeduino_xiao_ble.conf @@ -0,0 +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 \ No newline at end of file diff --git a/app/boards/seeed/xiao_ble/xiao_ble_zmk.dts b/app/boards/seeeduino_xiao_ble.overlay similarity index 83% rename from app/boards/seeed/xiao_ble/xiao_ble_zmk.dts rename to app/boards/seeeduino_xiao_ble.overlay index b01c544e..3b7710ef 100644 --- a/app/boards/seeed/xiao_ble/xiao_ble_zmk.dts +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -4,11 +4,6 @@ * 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 { diff --git a/app/boards/adafruit_metro_rp2040.conf b/app/boards/seeeduino_xiao_rp2040.conf similarity index 100% rename from app/boards/adafruit_metro_rp2040.conf rename to app/boards/seeeduino_xiao_rp2040.conf diff --git a/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk.dts b/app/boards/seeeduino_xiao_rp2040.overlay similarity index 77% rename from app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk.dts rename to app/boards/seeeduino_xiao_rp2040.overlay index b55ddc63..e6ba8136 100644 --- a/app/boards/seeed/xiao_rp2040/xiao_rp2040_zmk.dts +++ b/app/boards/seeeduino_xiao_rp2040.overlay @@ -4,9 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include <../boards/seeed/xiao_rp2040/xiao_rp2040.dts> -#include - &xiao_serial { status = "disabled"; }; &code_partition { 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/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..0d63214d 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.overlay +++ b/app/boards/shields/boardsource3x4/boardsource3x4.overlay @@ -1,47 +1,14 @@ /* - * 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 { 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..8ae99398 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.keymap +++ b/app/boards/shields/boardsource5x12/boardsource5x12.keymap @@ -15,7 +15,6 @@ 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 | \ | @@ -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/chalice/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/chalice/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/chalice/boards/nice_nano.overlay diff --git a/app/boards/shields/corne/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay similarity index 100% rename from app/boards/shields/corne/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/chalice/boards/nice_nano_v2.overlay 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/clog/clog.keymap b/app/boards/shields/clog/clog.keymap index fb696d09..d00b00c9 100644 --- a/app/boards/shields/clog/clog.keymap +++ b/app/boards/shields/clog/clog.keymap @@ -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/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/elephant42/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/corne/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/elephant42/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/corne/boards/nice_nano.overlay diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay similarity index 100% rename from app/boards/shields/eternal_keypad/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/corne/boards/nice_nano_v2.overlay 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.keymap b/app/boards/shields/corne/corne.keymap index fa6d4744..ea4c2e89 100644 --- a/app/boards/shields/corne/corne.keymap +++ b/app/boards/shields/corne/corne.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ----------------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | @@ -27,7 +26,6 @@ >; }; lower_layer { - display-name = "Lower Layer"; // ----------------------------------------------------------------------------------------- // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | @@ -42,7 +40,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ----------------------------------------------------------------------------------------- // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index 6463cd6e..ab952fb8 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -33,7 +33,6 @@ keymap { compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ @@ -51,7 +50,6 @@ }; right_layer { - display-name = "Right Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │ @@ -69,7 +67,6 @@ }; left_layer { - display-name = "Left Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │ @@ -87,7 +84,6 @@ }; tri_layer { - display-name = "Tri Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index 5316465b..08eab59c 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -13,7 +13,6 @@ 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 | ; | ' | @@ -30,7 +29,6 @@ }; 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/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/helix/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/helix/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/elephant42/boards/nice_nano.overlay diff --git a/app/boards/shields/jorne/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay similarity index 100% rename from app/boards/shields/jorne/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/elephant42/boards/nice_nano_v2.overlay 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.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.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/kyria/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/kyria/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/eternal_keypad/boards/nice_nano.overlay diff --git a/app/boards/shields/lily58/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay similarity index 100% rename from app/boards/shields/lily58/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay 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.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap index 51171228..40ac97df 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -24,7 +24,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 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..4dec0bc8 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -24,7 +24,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 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.keymap b/app/boards/shields/fourier/fourier.keymap index 17b1f81e..819ddf61 100644 --- a/app/boards/shields/fourier/fourier.keymap +++ b/app/boards/shields/fourier/fourier.keymap @@ -21,7 +21,6 @@ // ------------------------------------------- ----------------------------------------------- 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/microdox/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/helix/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/microdox/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/helix/boards/nice_nano.overlay diff --git a/app/boards/shields/redox/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay similarity index 100% rename from app/boards/shields/redox/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/helix/boards/nice_nano_v2.overlay 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.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.keymap b/app/boards/shields/hummingbird/hummingbird.keymap index a50e541a..31e33254 100644 --- a/app/boards/shields/hummingbird/hummingbird.keymap +++ b/app/boards/shields/hummingbird/hummingbird.keymap @@ -56,7 +56,6 @@ 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 diff --git a/app/boards/shields/iris/iris.keymap b/app/boards/shields/iris/iris.keymap index affe1cc6..1846509f 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 | @@ -47,7 +45,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | diff --git a/app/boards/shields/jiran/jiran.keymap b/app/boards/shields/jiran/jiran.keymap index 55494d36..77b943b2 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,7 +23,6 @@ }; 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 diff --git a/app/boards/shields/romac_plus/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/romac_plus/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/jorne/boards/nice_nano.overlay diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay similarity index 100% rename from app/boards/shields/splitkb_aurora_corne/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/jorne/boards/nice_nano_v2.overlay 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/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/splitkb_aurora_sweep/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/kyria/boards/nice_nano.overlay 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..424a617b --- /dev/null +++ b/app/boards/shields/kyria/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"; + + /* 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 100% 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 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 100% 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 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 100% rename from app/boards/shields/kyria/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay rename to app/boards/shields/kyria/boards/nrfmicro_13.overlay 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.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_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.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.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/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..e95fac9d --- /dev/null +++ b/app/boards/shields/leeloo/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"; + + /* 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_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_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..ba29cb2c --- /dev/null +++ b/app/boards/shields/leeloo_micro/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"; + + /* 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/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay new file mode 100644 index 00000000..424a617b --- /dev/null +++ b/app/boards/shields/lily58/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"; + + /* 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..424a617b --- /dev/null +++ b/app/boards/shields/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"; + + /* 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.keymap b/app/boards/shields/lily58/lily58.keymap index 502f7be3..75a2e8ae 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 | @@ -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/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index 21a76955..e9846e81 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -45,7 +45,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 +63,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 +81,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/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index 7fa07bbb..fd187da5 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.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 | - | = | BSPC | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | @@ -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/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay new file mode 100644 index 00000000..424a617b --- /dev/null +++ b/app/boards/shields/microdox/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"; + + /* 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..424a617b --- /dev/null +++ b/app/boards/shields/microdox/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"; + + /* 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.keymap b/app/boards/shields/microdox/microdox.keymap index 2ebc7a48..f13f58f4 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,7 +26,6 @@ >; }; nav_layer { - display-name = "Nav Layer"; // ----------------------------------------------------------------------------------------- // |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL | // | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BSPC | @@ -42,7 +40,6 @@ }; sym_layer { - display-name = "Sym Layer"; // ----------------------------------------------------------------------------------------- // | ! | @ | # | $ | % | | ^ | & | * | ( | ) | // | | | | | | | - | = | { | } | "|" | @@ -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_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/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 9d80a139..3d968584 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -6,6 +6,9 @@ if SHIELD_MURPHPAD config ZMK_KEYBOARD_NAME default "MurphPad" +config ZMK_DISPLAY + default y + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/murphpad/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/murphpad/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/murphpad/boards/nice_nano.overlay 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..21bb17b0 --- /dev/null +++ b/app/boards/shields/murphpad/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"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <8>; /* number of SMD LED footprints on PCB */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/murphpad/murphpad.conf b/app/boards/shields/murphpad/murphpad.conf index c954a946..e9236917 100644 --- a/app/boards/shields/murphpad/murphpad.conf +++ b/app/boards/shields/murphpad/murphpad.conf @@ -6,9 +6,10 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y -# Uncomment to enable OLED -#CONFIG_ZMK_DISPLAY=y +# Uncomment to disable OLED +#CONFIG_ZMK_DISPLAY=n # 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_WS2812_STRIP=y diff --git a/app/boards/shields/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap index 42494199..4f02d9a1 100644 --- a/app/boards/shields/naked60/naked60.keymap +++ b/app/boards/shields/naked60/naked60.keymap @@ -15,7 +15,6 @@ 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 | \ | @@ -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/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 100% rename from app/boards/shields/nibble/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/nibble/boards/nice_nano.overlay 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..3849a8fb --- /dev/null +++ b/app/boards/shields/nibble/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"; + + /* 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/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 0b2b7be3..c31cec89 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -3,9 +3,6 @@ if SHIELD_NICE_VIEW -config LS0XX_VCOM_THREAD_PRIO - default 11 - config LV_Z_VDB_SIZE default 100 @@ -28,8 +25,7 @@ choice ZMK_DISPLAY_STATUS_SCREEN endchoice config LV_Z_MEM_POOL_SIZE - default 8192 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM - default 5120 if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN + default 4096 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM imply NICE_VIEW_WIDGET_STATUS @@ -37,7 +33,7 @@ config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM 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/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..e1965569 100644 --- a/app/boards/shields/nice_view/nice_view.overlay +++ b/app/boards/shields/nice_view/nice_view.overlay @@ -12,8 +12,6 @@ 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..e9002b33 100644 --- a/app/boards/shields/nice_view/widgets/peripheral_status.c +++ b/app/boards/shields/nice_view/widgets/peripheral_status.c @@ -41,17 +41,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, @@ -112,11 +112,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..9769f4d7 100644 --- a/app/boards/shields/nice_view/widgets/status.c +++ b/app/boards/shields/nice_view/widgets/status.c @@ -46,7 +46,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 +61,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 +86,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 +118,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,7 +141,7 @@ 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] = { @@ -152,33 +152,33 @@ static void draw_middle(lv_obj_t *widget, const struct status_state *state) { 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); + lv_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, + 360. / segments * j + gap / 2.0, + 360. / segments * (j + 1) - gap / 2.0, &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,7 +187,7 @@ 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) { @@ -195,13 +195,13 @@ static void draw_bottom(lv_obj_t *widget, const struct status_state *state) { 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 +212,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) { @@ -250,8 +250,8 @@ static void set_output_status(struct zmk_widget_status *widget, 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) { @@ -261,7 +261,7 @@ 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(), + .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(), @@ -288,7 +288,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) { @@ -313,7 +313,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 +334,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..686e5af2 100644 --- a/app/boards/shields/nice_view/widgets/util.h +++ b/app/boards/shields/nice_view/widgets/util.h @@ -11,10 +11,6 @@ #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() @@ -46,21 +42,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.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.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..77e62fa0 100644 --- a/app/boards/shields/osprette/osprette.keymap +++ b/app/boards/shields/osprette/osprette.keymap @@ -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/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/qaz/qaz.keymap b/app/boards/shields/qaz/qaz.keymap index 72b51100..c887fb03 100644 --- a/app/boards/shields/qaz/qaz.keymap +++ b/app/boards/shields/qaz/qaz.keymap @@ -29,7 +29,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 +37,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 +46,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 +54,4 @@ >; }; }; -}; +}; \ No newline at end of file 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/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay new file mode 100644 index 00000000..424a617b --- /dev/null +++ b/app/boards/shields/redox/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"; + + /* 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..424a617b --- /dev/null +++ b/app/boards/shields/redox/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"; + + /* 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..098be434 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 { diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index 02db9175..ea4c09f9 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -15,7 +15,6 @@ 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 | - | @@ -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/boards/nice_nano_v2.overlay b/app/boards/shields/reviung34/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..d14b95db --- /dev/null +++ b/app/boards/shields/reviung34/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"; + + /* 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.overlay b/app/boards/shields/reviung34/reviung34.overlay index 0e800a7d..0f58b99d 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 { diff --git a/app/boards/shields/reviung41/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/reviung41/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/reviung41/boards/nice_nano.overlay 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..59180064 --- /dev/null +++ b/app/boards/shields/reviung41/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"; + + /* 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..618052b2 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -14,7 +14,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ------------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | @@ -29,7 +28,6 @@ }; lower_layer { - display-name = "Lower Layer"; // ------------------------------------------------------------------------------------ // | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | // | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | @@ -44,7 +42,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ---------------------------------------------------------------------------- // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | 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/reviung5/boards/nice_nano_v2.overlay b/app/boards/shields/reviung5/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..540e345a --- /dev/null +++ b/app/boards/shields/reviung5/boards/nice_nano_v2.overlay @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#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 = <4>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung5/reviung5.conf b/app/boards/shields/reviung5/reviung5.conf index 78ebd1d1..d5d38739 100644 --- a/app/boards/shields/reviung5/reviung5.conf +++ b/app/boards/shields/reviung5/reviung5.conf @@ -4,3 +4,4 @@ # Uncomment the following two 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/reviung53/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/reviung53/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/reviung53/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/reviung53/boards/nice_nano.overlay 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..24905ac2 --- /dev/null +++ b/app/boards/shields/reviung53/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"; + + /* 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..c3b39994 100644 --- a/app/boards/shields/reviung53/reviung53.keymap +++ b/app/boards/shields/reviung53/reviung53.keymap @@ -22,7 +22,6 @@ 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 | @@ -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/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_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay new file mode 100644 index 00000000..424a617b --- /dev/null +++ b/app/boards/shields/romac_plus/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"; + + /* 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..424a617b --- /dev/null +++ b/app/boards/shields/romac_plus/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"; + + /* 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.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/snap/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/snap/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/snap/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/snap/boards/nice_nano.overlay 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..924151c7 --- /dev/null +++ b/app/boards/shields/snap/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"; + + /* 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/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 767ea35a..4eb3d743 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -43,4 +43,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 100% rename from app/boards/shields/sofle/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/sofle/boards/nice_nano.overlay 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 100% 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 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 100% rename from app/boards/shields/sofle/boards/nrfmicro_nrf52840_zmk_1_3_0.overlay rename to app/boards/shields/sofle/boards/nrfmicro_11.overlay 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..f00f59f4 --- /dev/null +++ b/app/boards/shields/sofle/boards/nrfmicro_13.overlay @@ -0,0 +1,50 @@ +#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 = <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.keymap b/app/boards/shields/sofle/sofle.keymap index 8cc1c028..c9db56ce 100644 --- a/app/boards/shields/sofle/sofle.keymap +++ b/app/boards/shields/sofle/sofle.keymap @@ -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 diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index addfb8d1..d3ac6c77 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 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..424a617b --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/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"; + + /* 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..424a617b --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/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"; + + /* 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.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap index fa6d4744..ea4c2e89 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -13,7 +13,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; // ----------------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | @@ -27,7 +26,6 @@ >; }; lower_layer { - display-name = "Lower Layer"; // ----------------------------------------------------------------------------------------- // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | @@ -42,7 +40,6 @@ }; raise_layer { - display-name = "Raise Layer"; // ----------------------------------------------------------------------------------------- // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | diff --git a/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig index d9bb0eac..df32b83b 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 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 100% 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 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 100% 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 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_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 9edcf346..861db44f 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 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 100% 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 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..08452266 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,45 @@ +#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 = <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.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_sofle/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig index 603c35c7..172548e8 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 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..8228d530 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay @@ -0,0 +1,45 @@ +#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 = <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..8228d530 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay @@ -0,0 +1,45 @@ +#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 = <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.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_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index c84cf94c..6a0e3728 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 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..424a617b --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/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"; + + /* 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..424a617b --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/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"; + + /* 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.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 0e719f30..891a36b6 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -63,7 +63,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 &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT @@ -73,7 +72,6 @@ }; 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 @@ -83,7 +81,6 @@ }; 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 @@ -93,7 +90,6 @@ }; tri_layer { - display-name = "Tri Layer"; bindings = < &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &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 diff --git a/app/boards/shields/splitreus62/splitreus62.keymap b/app/boards/shields/splitreus62/splitreus62.keymap index 2a017881..09666009 100644 --- a/app/boards/shields/splitreus62/splitreus62.keymap +++ b/app/boards/shields/splitreus62/splitreus62.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 | \ | diff --git a/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap b/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap index fbda0c49..c130bc4f 100644 --- a/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap +++ b/app/boards/shields/tester_pro_micro/tester_pro_micro.keymap @@ -58,4 +58,4 @@ PIN_MACRO(pin21, <&kp N2 &kp N1>) &pin21>; }; }; -}; +}; \ No newline at end of file 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/tester_xiao.keymap b/app/boards/shields/tester_xiao/tester_xiao.keymap index 29a5f3db..8b22780b 100644 --- a/app/boards/shields/tester_xiao/tester_xiao.keymap +++ b/app/boards/shields/tester_xiao/tester_xiao.keymap @@ -44,4 +44,4 @@ PIN_MACRO(pin10, <&kp N1 &kp N0>) &pin10>; }; }; -}; +}; \ No newline at end of file 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 100% rename from app/boards/shields/tg4x/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/tg4x/boards/nice_nano.overlay 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..84441899 --- /dev/null +++ b/app/boards/shields/tg4x/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"; + + /* 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..5c71ae5c 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -23,7 +23,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 +32,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 +41,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/tidbit/boards/nice_nano_nrf52840_zmk.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay similarity index 100% rename from app/boards/shields/tidbit/boards/nice_nano_nrf52840_zmk.overlay rename to app/boards/shields/tidbit/boards/nice_nano.overlay 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 100% 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 diff --git a/app/boards/shields/tidbit/tidbit.conf b/app/boards/shields/tidbit/tidbit.conf index bb2d0d9a..82bd3477 100644 --- a/app/boards/shields/tidbit/tidbit.conf +++ b/app/boards/shields/tidbit/tidbit.conf @@ -7,6 +7,8 @@ CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y # Uncomment to enable underglow #CONFIG_ZMK_RGB_UNDERGLOW=y +# Use the STRIP config specific to the LEDs you're using +#CONFIG_WS2812_STRIP=y # Uncomment to enable the display # Note that an I2C OLED cannot be used at the same time as encoder 3. diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index dbc9e907..2a311365 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -44,7 +44,6 @@ 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 @@ -57,7 +56,6 @@ }; func_layer { - display-name = "Func Layer"; bindings = < &none &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none 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..b0895433 --- /dev/null +++ b/app/boards/shields/two_percent_milk/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"; + + /* 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..b0895433 --- /dev/null +++ b/app/boards/shields/two_percent_milk/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"; + + /* 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 100% 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 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 100% 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 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 100% 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 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/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..95602ca7 100644 --- a/app/boards/shields/zmk_uno/Kconfig.defconfig +++ b/app/boards/shields/zmk_uno/Kconfig.defconfig @@ -16,6 +16,10 @@ config SHIELD_SSD1306_128X64 config SHIELD_SSD1306_128X32 select ZMK_DISPLAY +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + config ZMK_PM_SOFT_OFF default y if BOARD_NRF52840DK_NRF52840 diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap index 7fe0a044..186cdb60 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -24,7 +24,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp A &bl BL_TOG &rgb_ug RGB_EFF &bt BT_CLR diff --git a/app/boards/shields/zmk_uno/zmk_uno_split.keymap b/app/boards/shields/zmk_uno/zmk_uno_split.keymap index 0e479869..d2daa6ea 100644 --- a/app/boards/shields/zmk_uno/zmk_uno_split.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno_split.keymap @@ -26,7 +26,6 @@ compatible = "zmk,keymap"; default_layer { - display-name = "Default Layer"; bindings = < &kp A &bl BL_TOG &rgb_ug RGB_EFF &bt BT_CLR 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_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..354d7007 --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.conf @@ -0,0 +1,11 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=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 \ No newline at end of file diff --git a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk.dts b/app/boards/sparkfun_pro_micro_rp2040.overlay similarity index 77% rename from app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk.dts rename to app/boards/sparkfun_pro_micro_rp2040.overlay index 733e2d08..21aa7dff 100644 --- a/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040_zmk.dts +++ b/app/boards/sparkfun_pro_micro_rp2040.overlay @@ -4,9 +4,6 @@ * 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 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_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.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/core-coverage.yml b/app/core-coverage.yml index beefb2eb..bc36495a 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,62 +9,62 @@ 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 + - board: nice_nano_v2 shield: kyria_left cmake-args: "-DCONFIG_ZMK_POINTING=y" nickname: "mouse" - - board: sparkfun_pro_micro_rp2040//zmk + - board: sparkfun_pro_micro_rp2040 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 + - board: bdn9_rev2 snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "stm32-studio" - - board: nice_nano//zmk + - board: nice_nano_v2 shield: reviung41 snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "nrf52-studio" - - board: nice_nano//zmk + - board: nice_nano_v2 shield: corne_left snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "split-left-studio" - - board: nice_nano//zmk + - board: nice_nano_v2 shield: corne_right snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "split-right-studio" - - board: sparkfun_pro_micro_rp2040//zmk + - board: sparkfun_pro_micro_rp2040 shield: reviung41 snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "rp2040-studio" - - board: seeeduino_xiao//zmk + - board: seeeduino_xiao shield: hummingbird snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index 653b085d..1f87ef1a 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -28,3 +28,6 @@ #include #include #include +#include +#include +#include diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index 1b29f9d1..2aa41d7d 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -19,7 +19,6 @@ bootloader: bootload { compatible = "zmk,behavior-reset"; type = ; - bootloader; #binding-cells = <0>; display-name = "Bootloader"; }; diff --git a/app/dts/behaviors/to_layer.dtsi b/app/dts/behaviors/to_layer.dtsi index 89bc91ca..532636a6 100644 --- a/app/dts/behaviors/to_layer.dtsi +++ b/app/dts/behaviors/to_layer.dtsi @@ -15,7 +15,6 @@ compatible = "zmk,behavior-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..81846e77 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -15,7 +15,6 @@ compatible = "zmk,behavior-toggle-layer"; #binding-cells = <1>; display-name = "Toggle Layer"; - locking; }; }; }; diff --git a/app/dts/behaviors/ug_battery.dtsi b/app/dts/behaviors/ug_battery.dtsi new file mode 100644 index 00000000..3e5f75cc --- /dev/null +++ b/app/dts/behaviors/ug_battery.dtsi @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + behaviors { + ug_b2: ugbat20 { + compatible = "zmk,behavior-underglow-battery"; + threshold = <20>; + #binding-cells = <2>; + display-name = "Underglow Battery level 20%"; + }; + ug_b4: ugbat40 { + compatible = "zmk,behavior-underglow-battery"; + threshold = <40>; + #binding-cells = <2>; + display-name = "Underglow Battery level 40%"; + }; + ug_b6: ugbat60 { + compatible = "zmk,behavior-underglow-battery"; + threshold = <60>; + #binding-cells = <2>; + display-name = "Underglow Battery level 60%"; + }; + ug_b8: ugbat80 { + compatible = "zmk,behavior-underglow-battery"; + threshold = <80>; + #binding-cells = <2>; + display-name = "Underglow Battery level 80%"; + }; + }; +}; diff --git a/app/dts/behaviors/ug_color.dtsi b/app/dts/behaviors/ug_color.dtsi new file mode 100644 index 00000000..15d6c863 --- /dev/null +++ b/app/dts/behaviors/ug_color.dtsi @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2024 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + behaviors { + ug: ugcolor { + compatible = "zmk,behavior-underglow-color"; + #binding-cells = <1>; + display-name = "Underglow Color"; + }; + }; +}; diff --git a/app/dts/behaviors/ug_indicators.dtsi b/app/dts/behaviors/ug_indicators.dtsi new file mode 100644 index 00000000..b62c79b7 --- /dev/null +++ b/app/dts/behaviors/ug_indicators.dtsi @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + behaviors { + ug_nl: ugnumlk { + compatible = "zmk,behavior-underglow-indicators"; + indicator = ; + #binding-cells = <2>; + display-name = "Underglow NumLock indicator"; + }; + + ug_cl: ugcapslk { + compatible = "zmk,behavior-underglow-indicators"; + indicator = ; + #binding-cells = <2>; + display-name = "Underglow CapsLock indicator"; + }; + + ug_sl: ugscrllk { + compatible = "zmk,behavior-underglow-indicators"; + indicator = ; + #binding-cells = <2>; + display-name = "Underglow ScrollLock indicator"; + }; + + }; +}; 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-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-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..1ab0179c 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml @@ -10,11 +10,9 @@ include: one_param.yaml properties: toggle-mode: type: string + required: false 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/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/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/zmk,physical-layout.yaml b/app/dts/bindings/zmk,physical-layout.yaml index 7ed4cdc3..3f9b8c24 100644 --- a/app/dts/bindings/zmk,physical-layout.yaml +++ b/app/dts/bindings/zmk,physical-layout.yaml @@ -21,9 +21,6 @@ properties: 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,underglow-indicators.yaml b/app/dts/bindings/zmk,underglow-indicators.yaml new file mode 100644 index 00000000..d5cdde80 --- /dev/null +++ b/app/dts/bindings/zmk,underglow-indicators.yaml @@ -0,0 +1,35 @@ +# Copyright (c) 2020, The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Underglow indicators + +compatible: "zmk,underglow-indicators" + +properties: + bat-lhs: + type: array + required: true + bat-rhs: + type: array + required: true + capslock: + type: int + required: true + numlock: + type: int + required: true + scrolllock: + type: int + required: true + layer-state: + type: array + required: true + ble-state: + type: array + required: true + usb-state: + type: int + required: true + output-fallback: + type: int + required: true 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/include/dt-bindings/zmk/hid_indicators.h b/app/include/dt-bindings/zmk/hid_indicators.h index fcd27700..860c81db 100644 --- a/app/include/dt-bindings/zmk/hid_indicators.h +++ b/app/include/dt-bindings/zmk/hid_indicators.h @@ -1,18 +1,9 @@ /* - * Copyright (c) 2026 The ZMK Contributors + * Copyright (c) 2020 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)) +#define NUM_LOCK 0 +#define CAPS_LOCK 1 +#define SCROLL_LOCK 2 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/rgb.h b/app/include/dt-bindings/zmk/rgb.h index c1a80082..657ac2fd 100644 --- a/app/include/dt-bindings/zmk/rgb.h +++ b/app/include/dt-bindings/zmk/rgb.h @@ -19,6 +19,7 @@ #define RGB_EFR_CMD 12 #define RGB_EFS_CMD 13 #define RGB_COLOR_HSB_CMD 14 +#define RGB_STATUS_CMD 15 #define RGB_TOG RGB_TOG_CMD 0 #define RGB_ON RGB_ON_CMD 0 @@ -33,6 +34,7 @@ #define RGB_SPD RGB_SPD_CMD 0 #define RGB_EFF RGB_EFF_CMD 0 #define RGB_EFR RGB_EFR_CMD 0 +#define RGB_STATUS RGB_STATUS_CMD 0 #define RGB_COLOR_HSB_VAL(h, s, v) (((h) << 16) + ((s) << 8) + (v)) #define RGB_COLOR_HSB(h, s, v) RGB_COLOR_HSB_CMD##(RGB_COLOR_HSB_VAL(h, s, v)) #define RGB_COLOR_HSV RGB_COLOR_HSB \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/rgb_colors.h b/app/include/dt-bindings/zmk/rgb_colors.h new file mode 100644 index 00000000..73e9cc1f --- /dev/null +++ b/app/include/dt-bindings/zmk/rgb_colors.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define GREEN 0x00ff00 +#define RED 0xff0000 +#define BLUE 0x0000ff +#define TEAL 0x008080 +#define ORANGE 0xffa500 +#define YELLOW 0xffff00 +#define GOLD 0xffd700 +#define PURPLE 0x800080 +#define PINK 0xffc0cb +#define WHITE 0xffffff +#define ___ 0x000000 +#define BLACK 0x000000 \ No newline at end of file diff --git a/app/include/linker/zmk-rgb-effects.ld b/app/include/linker/zmk-rgb-effects.ld new file mode 100644 index 00000000..28d519be --- /dev/null +++ b/app/include/linker/zmk-rgb-effects.ld @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +ITERABLE_SECTION_ROM(zmk_rgb_effect, 4) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 92b2107d..c65addde 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -39,6 +39,7 @@ 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); +int8_t zmk_ble_profile_status(uint8_t index); int zmk_ble_unpair_all(void); diff --git a/app/include/zmk/endpoints.h b/app/include/zmk/endpoints.h index c10e387d..aabdb302 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,23 @@ 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); +bool zmk_endpoints_preferred_transport_is_active(); -/** - * 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); +int zmk_endpoints_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(); +int zmk_endpoints_send_mouse_report(); #endif // IS_ENABLED(CONFIG_ZMK_POINTING) -/** - * Clears all HID reports for the selected endpoint. - */ -void zmk_endpoint_clear_reports(void); +void zmk_endpoints_clear_current(void); 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/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 3bf5c870..0d66853e 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -12,13 +12,12 @@ 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) { +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, .locked = locked, .timestamp = k_uptime_get()}); + .layer = layer, .state = state, .timestamp = k_uptime_get()}); } diff --git a/app/include/zmk/events/split_peripheral_layer_changed.h b/app/include/zmk/events/split_peripheral_layer_changed.h new file mode 100644 index 00000000..2445c164 --- /dev/null +++ b/app/include/zmk/events/split_peripheral_layer_changed.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +struct zmk_split_peripheral_layer_changed { + uint32_t layers; +}; + +ZMK_EVENT_DECLARE(zmk_split_peripheral_layer_changed); diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 26fd2d16..9b7a00c6 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -7,21 +7,13 @@ #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) +#define ZMK_KEYMAP_LAYERS_LEN \ + (COND_CODE_1( \ + IS_ENABLED(CONFIG_ZMK_STUDIO), \ + (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE)), \ + (DT_FOREACH_CHILD_STATUS_OKAY(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE))) 0) /** * @brief A layer ID is a stable identifier to refer to a layer, regardless of ordering. @@ -44,19 +36,17 @@ zmk_keymap_layer_id_t zmk_keymap_layer_index_to_id(zmk_keymap_layer_index_t laye 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); +int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer); +int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer); +int zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer); +int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer); 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, + uint8_t binding_idx); +int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint8_t binding_idx, const struct zmk_behavior_binding binding); #if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) diff --git a/app/include/zmk/physical_layouts.h b/app/include/zmk/physical_layouts.h index e28c194f..d5cf6527 100644 --- a/app/include/zmk/physical_layouts.h +++ b/app/include/zmk/physical_layouts.h @@ -33,9 +33,6 @@ struct zmk_physical_layout { 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; diff --git a/app/include/zmk/pointing/input_split.h b/app/include/zmk/pointing/input_split.h index 235ea495..81203547 100644 --- a/app/include/zmk/pointing/input_split.h +++ b/app/include/zmk/pointing/input_split.h @@ -7,5 +7,4 @@ #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 + bool sync); \ No newline at end of file diff --git a/app/include/zmk/rgb_effect.h b/app/include/zmk/rgb_effect.h new file mode 100644 index 00000000..98a57b8e --- /dev/null +++ b/app/include/zmk/rgb_effect.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +struct zmk_rgb_effect_ctx { + struct led_rgb *pixels; + uint16_t num_pixels; + struct zmk_led_hsb base_color; + uint16_t *animation_step; + uint8_t animation_speed; +}; + +typedef void (*zmk_rgb_effect_render_fn)(struct zmk_rgb_effect_ctx *ctx); +typedef void (*zmk_rgb_effect_event_fn)(void); + +#define ZMK_RGB_EFFECT_STATIC BIT(0) + +struct zmk_rgb_effect { + const char *name; + zmk_rgb_effect_render_fn render; + zmk_rgb_effect_event_fn on_select; + zmk_rgb_effect_event_fn on_deselect; + uint8_t flags; +}; + +#define ZMK_RGB_EFFECT_DEFINE(_sym, _name_str, _render, _flags, _on_select, _on_deselect) \ + STRUCT_SECTION_ITERABLE(zmk_rgb_effect, _sym) = { \ + .name = _name_str, \ + .render = _render, \ + .flags = _flags, \ + .on_select = _on_select, \ + .on_deselect = _on_deselect, \ + } + +void zmk_rgb_request_refresh(void); +int zmk_rgb_effect_get_count(void); + +struct led_rgb zmk_rgb_hsb_to_rgb(struct zmk_led_hsb hsb); +struct zmk_led_hsb zmk_rgb_hsb_scale_min_max(struct zmk_led_hsb hsb); +struct zmk_led_hsb zmk_rgb_hsb_scale_zero_max(struct zmk_led_hsb hsb); diff --git a/app/include/zmk/rgb_underglow.h b/app/include/zmk/rgb_underglow.h index be0ef252..f00dcd5e 100644 --- a/app/include/zmk/rgb_underglow.h +++ b/app/include/zmk/rgb_underglow.h @@ -16,6 +16,8 @@ int zmk_rgb_underglow_toggle(void); int zmk_rgb_underglow_get_state(bool *state); int zmk_rgb_underglow_on(void); int zmk_rgb_underglow_off(void); +int zmk_rgb_underglow_transient_on(void); +int zmk_rgb_underglow_transient_off(void); int zmk_rgb_underglow_cycle_effect(int direction); int zmk_rgb_underglow_calc_effect(int direction); int zmk_rgb_underglow_select_effect(int effect); @@ -27,3 +29,4 @@ 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_status(void); diff --git a/app/include/zmk/split/bluetooth/peripheral_layers.h b/app/include/zmk/split/bluetooth/peripheral_layers.h new file mode 100644 index 00000000..974a322c --- /dev/null +++ b/app/include/zmk/split/bluetooth/peripheral_layers.h @@ -0,0 +1,5 @@ +#pragma once + +void set_peripheral_layers_state(uint32_t new_layers); +bool peripheral_layer_active(uint8_t layer); +uint8_t peripheral_highest_layer_active(void); \ No newline at end of file diff --git a/app/include/zmk/split/bluetooth/uuid.h b/app/include/zmk/split/bluetooth/uuid.h index c9a63efa..6380e08f 100644 --- a/app/include/zmk/split/bluetooth/uuid.h +++ b/app/include/zmk/split/bluetooth/uuid.h @@ -20,3 +20,4 @@ #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) +#define ZMK_SPLIT_BT_UPDATE_LAYERS_UUID ZMK_BT_SPLIT_UUID(0x00000007) diff --git a/app/include/zmk/split/central.h b/app/include/zmk/split/central.h index ff971bfc..3fcf17f2 100644 --- a/app/include/zmk/split/central.h +++ b/app/include/zmk/split/central.h @@ -46,3 +46,5 @@ int zmk_split_central_update_hid_indicator(zmk_hid_indicators_t indicators); 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) + +int zmk_split_central_update_layers(uint32_t layers); diff --git a/app/keymap-module/modules/modules.cmake b/app/keymap-module/modules/modules.cmake index e19230c8..6aa62885 100644 --- a/app/keymap-module/modules/modules.cmake +++ b/app/keymap-module/modules/modules.cmake @@ -50,12 +50,172 @@ 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.") + message(DEPRECATION "The `config/boards` folder is deprecated. Please use a module instead. See https://zmk.dev/docs/development/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.") + message(DEPRECATION "The `config/dts` folder is deprecated. Please use a module instead. See https://zmk.dev/docs/development/hardware-integration/new-shield and https://zmk.dev/docs/development/module-creation for more information.") list(APPEND DTS_ROOT ${ZMK_CONFIG}) endif() endif() + + +if(DEFINED SHIELD) + string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") +endif() + +string(FIND "${BOARD}" "@" REVISION_SEPARATOR_INDEX) +if(NOT (REVISION_SEPARATOR_INDEX EQUAL -1)) + math(EXPR BOARD_REVISION_INDEX "${REVISION_SEPARATOR_INDEX} + 1") + string(SUBSTRING ${BOARD} ${BOARD_REVISION_INDEX} -1 BOARD_REVISION) + string(SUBSTRING ${BOARD} 0 ${REVISION_SEPARATOR_INDEX} BOARD) +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) + 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() + +if(EXISTS ${BOARD_DIR}/revision.cmake) + # Board provides revision handling. + include(${BOARD_DIR}/revision.cmake) +elseif(BOARD_REVISION) + message(WARNING "Board revision ${BOARD_REVISION} specified for ${BOARD}, \ + but board has no revision so revision will be ignored.") +endif() + +if(DEFINED BOARD_REVISION) + string(REPLACE "." "_" BOARD_REVISION_STRING ${BOARD_REVISION}) + set(KEYMAP_BOARD_REVISION_PREFIX "${BOARD}_${BOARD_REVISION_STRING}") +else() + set(KEYMAP_BOARD_REVISION_PREFIX "") +endif() + +# 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} ${KEYMAP_BOARD_REVISION_PREFIX} ${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/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/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.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/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/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.cmake b/app/module/boards/makerdiary/nrf52840_m2/board.cmake deleted file mode 100644 index 0acfeb73..00000000 --- a/app/module/boards/makerdiary/nrf52840_m2/board.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# 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) 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.cmake b/app/module/boards/mechwild/pillbug/board.cmake deleted file mode 100644 index d9d4ed92..00000000 --- a/app/module/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/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/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/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_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/input/input_mock.c b/app/module/drivers/input/input_mock.c index 23282cd0..855b7dc3 100644 --- a/app/module/drivers/input/input_mock.c +++ b/app/module/drivers/input/input_mock.c @@ -48,15 +48,10 @@ static void input_mock_work_cb(struct k_work *work) { } } - 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); + cfg->events[base_idx + 3], K_NO_WAIT); - if (sync) { - k_work_schedule(&data->work, K_MSEC(cfg->event_period)); - } else { - k_work_schedule(&data->work, K_NO_WAIT); - } + k_work_schedule(&data->work, K_MSEC(cfg->event_period)); } int input_mock_init(const struct device *dev) { diff --git a/app/module/drivers/kscan/Kconfig b/app/module/drivers/kscan/Kconfig index 5ec00063..88848dff 100644 --- a/app/module/drivers/kscan/Kconfig +++ b/app/module/drivers/kscan/Kconfig @@ -61,7 +61,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 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/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/run-ble-test.sh b/app/run-ble-test.sh index f8e70537..8c65c91b 100755 --- a/app/run-ble-test.sh +++ b/app/run-ble-test.sh @@ -61,7 +61,7 @@ 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 + west build -d build/${testcase%%/}_${pn}/ -b nrf52_bsim -- -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 @@ -76,7 +76,7 @@ if ls $(pwd)/$testcase/peripheral*.overlay >/dev/null 2>&1; then 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 +west build -d build/$testcase -b nrf52_bsim -- -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 diff --git a/app/run-test.sh b/app/run-test.sh index aa84ed69..1b10ed93 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -8,6 +8,7 @@ # 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_VERBOSE: Be more verbose # ZMK_TESTS_AUTO_ACCEPT: Replace snapshot files with new key events # J: Number of parallel jobs (default is 4) @@ -24,7 +25,7 @@ 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 @@ -38,25 +39,19 @@ testcase=$(realpath $path | sed -n -e "s|.*/tests/||p") 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)" \ + -b native_posix_64 -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" +if [ -z ${ZMK_TESTS_VERBOSE} ]; then + $build_cmd >/dev/null 2>&1 +else + echo "ZMK_SRC_DIR: ${ZMK_SRC_DIR:-.}" + echo "ZMK_BUILD_DIR: $ZMK_BUILD_DIR" + $build_cmd 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 +if [ $? -gt 0 ]; then + echo "FAILED: $testcase did not build" | tee -a ${ZMK_BUILD_DIR}/tests/pass-fail.log exit 1 fi diff --git a/app/src/activity.c b/app/src/activity.c index f4dc3562..570b1462 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -16,6 +16,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#if IS_ENABLED(CONFIG_ZMK_SPLIT) +#include +#endif #include #include @@ -109,6 +112,9 @@ static int activity_init(void) { ZMK_LISTENER(activity, activity_event_listener); ZMK_SUBSCRIPTION(activity, zmk_position_state_changed); ZMK_SUBSCRIPTION(activity, zmk_sensor_event); +#if IS_ENABLED(CONFIG_ZMK_SPLIT) +ZMK_SUBSCRIPTION(activity, zmk_split_peripheral_layer_changed); +#endif #if IS_ENABLED(CONFIG_ZMK_POINTING) @@ -116,11 +122,9 @@ 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); -} +static void activity_input_listener(struct input_event *ev) { k_work_submit(¬e_activity_work); } -INPUT_CALLBACK_DEFINE(NULL, activity_input_listener, NULL); +INPUT_CALLBACK_DEFINE(NULL, activity_input_listener); #endif diff --git a/app/src/behavior.c b/app/src/behavior.c index c7899d62..6d5bbca3 100644 --- a/app/src/behavior.c +++ b/app/src/behavior.c @@ -41,13 +41,13 @@ const struct device *z_impl_behavior_get_binding(const char *name) { } STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { - if (device_is_ready(item->device) && item->device->name == name) { + if (z_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) { + if (z_device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { return item->device; } } @@ -267,7 +267,7 @@ zmk_behavior_local_id_t zmk_behavior_get_local_id(const char *name) { } STRUCT_SECTION_FOREACH(zmk_behavior_local_id_map, item) { - if (device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { + if (z_device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { return item->local_id; } } @@ -277,7 +277,7 @@ zmk_behavior_local_id_t zmk_behavior_get_local_id(const char *name) { 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) { + if (z_device_is_ready(item->device) && item->local_id == local_id) { return item->device->name; } } diff --git a/app/src/behaviors/behavior_input_two_axis.c b/app/src/behaviors/behavior_input_two_axis.c index 40e82a8e..ea8e948d 100644 --- a/app/src/behaviors/behavior_input_two_axis.c +++ b/app/src/behaviors/behavior_input_two_axis.c @@ -143,7 +143,7 @@ static float update_movement_1d(const struct behavior_input_two_axis_config *con } 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)); + LOG_DBG("Calculated speed: %f", speed(config, code, state->speed, move_duration)); move = (move_duration > 0) ? (speed(config, code, state->speed, move_duration) * config->trigger_period_ms / 1000) diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 61575d91..78bf7a3b 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -15,8 +15,6 @@ 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[] = { @@ -38,22 +36,16 @@ static const struct behavior_parameter_metadata metadata = { #endif -struct behavior_mo_config { - bool locking; -}; - 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 = { @@ -64,13 +56,5 @@ static const struct behavior_driver_api behavior_mo_driver_api = { #endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -#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); - -DT_INST_FOREACH_STATUS_OKAY(MO_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ \ No newline at end of file +BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, + &behavior_mo_driver_api); diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index e6b51d0c..c6112758 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -42,11 +42,6 @@ static const struct behavior_parameter_value_metadata std_values[] = { .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 = { @@ -65,13 +60,11 @@ 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); } diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 67f33aae..61df15af 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -14,21 +14,11 @@ #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 on_keymap_binding_pressed(struct zmk_behavior_binding *binding, @@ -36,20 +26,10 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, const struct device *dev = zmk_behavior_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; } @@ -63,11 +43,7 @@ static const struct behavior_driver_api behavior_reset_driver_api = { #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))), \ - }; \ + .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); diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 80cd5182..2576486a 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -242,6 +242,8 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, return zmk_rgb_underglow_set_hsb((struct zmk_led_hsb){.h = (binding->param2 >> 16) & 0xFFFF, .s = (binding->param2 >> 8) & 0xFF, .b = binding->param2 & 0xFF}); + case RGB_STATUS_CMD: + return zmk_rgb_underglow_status(); } return -ENOTSUP; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 72461286..278f1cb2 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -34,7 +34,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; } diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index 61a96965..dae19ebc 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -17,15 +17,10 @@ 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 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; } @@ -64,13 +59,7 @@ static const struct behavior_driver_api behavior_to_driver_api = { #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) +BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, 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..3194873e 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -25,7 +25,6 @@ enum toggle_mode { struct behavior_tog_config { enum toggle_mode toggle_mode; - bool locking; }; static int tog_keymap_binding_pressed(struct zmk_behavior_binding *binding, @@ -35,11 +34,11 @@ static int tog_keymap_binding_pressed(struct zmk_behavior_binding *binding, 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); + return zmk_keymap_layer_activate(binding->param1); case OFF: - return zmk_keymap_layer_deactivate(binding->param1, cfg->locking); + return zmk_keymap_layer_deactivate(binding->param1); case FLIP: - return zmk_keymap_layer_toggle(binding->param1, cfg->locking); + return zmk_keymap_layer_toggle(binding->param1); default: return -ENOTSUP; }; @@ -80,14 +79,13 @@ static const struct behavior_driver_api behavior_tog_driver_api = { #endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -#define TG_INST(n) \ +#define KT_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); -DT_INST_FOREACH_STATUS_OKAY(TG_INST) +DT_INST_FOREACH_STATUS_OKAY(KT_INST) #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/ble.c b/app/src/ble.c index 51b172b9..f14df787 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -56,7 +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_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | 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) static struct zmk_ble_profile profiles[ZMK_BLE_PROFILE_COUNT]; @@ -70,10 +71,10 @@ BUILD_ASSERT( "ERROR: BLE device name is too long. Max length: " STRINGIFY(CONFIG_BT_DEVICE_NAME_MAX)); static struct bt_data zmk_ble_ad[] = { - BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, BT_BYTES_LIST_LE16(CONFIG_BT_DEVICE_APPEARANCE)), + 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 */ ), }; @@ -142,6 +143,23 @@ bool zmk_ble_profile_is_connected(uint8_t index) { return info.state == BT_CONN_STATE_CONNECTED; } +int8_t zmk_ble_profile_status(uint8_t index) { + if (index >= ZMK_BLE_PROFILE_COUNT) + return -1; + bt_addr_le_t *addr = &profiles[index].peer; + struct bt_conn *conn; + int result; + if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { + result = 0; // disconnected + } else if ((conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr)) == NULL) { + result = 1; // paired + } else { + result = 2; // connected + bt_conn_unref(conn); + } + return result; +} + #define CHECKED_ADV_STOP() \ err = bt_le_adv_stop(); \ advertising_status = ZMK_ADV_NONE; \ 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/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..5d5c81f4 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -29,8 +29,11 @@ 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_SIZE + default 4096 if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN choice ZMK_DISPLAY_STATUS_SCREEN prompt "Default status screen for displays" @@ -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..da6686ca 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -110,10 +110,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,14 +145,9 @@ 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) diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 189a7dc2..7b6f9486 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; - + 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..e96ce796 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,44 +110,16 @@ 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_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; } +struct zmk_endpoint_instance zmk_endpoints_selected(void) { return current_instance; } 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) int err = zmk_usb_hid_send_keyboard_report(); @@ -212,9 +154,6 @@ static int send_keyboard_report(void) { 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) int err = zmk_usb_hid_send_consumer_report(); @@ -247,7 +186,8 @@ static int send_consumer_report(void) { 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: @@ -262,11 +202,8 @@ int zmk_endpoint_send_report(uint16_t usage_page) { } #if IS_ENABLED(CONFIG_ZMK_POINTING) -int zmk_endpoint_send_mouse_report() { +int zmk_endpoints_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(); @@ -302,106 +239,29 @@ int zmk_endpoint_send_mouse_report() { #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); +SETTINGS_STATIC_HANDLER_DEFINE(endpoints, "endpoints", NULL, endpoints_handle_set, NULL, NULL); #endif /* IS_ENABLED(CONFIG_SETTINGS) */ @@ -422,40 +282,45 @@ 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; +} + +bool zmk_endpoints_preferred_transport_is_active(void) { + return preferred_transport == get_selected_transport(); } static int zmk_endpoints_init(void) { @@ -468,15 +333,15 @@ static int zmk_endpoints_init(void) { return 0; } -void zmk_endpoint_clear_reports(void) { +void zmk_endpoints_clear_current(void) { 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 +349,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(); + zmk_endpoints_clear_current(); current_instance = new_instance; diff --git a/app/src/events/split_peripheral_layer_changed.c b/app/src/events/split_peripheral_layer_changed.c new file mode 100644 index 00000000..81f2ab8d --- /dev/null +++ b/app/src/events/split_peripheral_layer_changed.c @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +ZMK_EVENT_IMPL(zmk_split_peripheral_layer_changed); \ No newline at end of file diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 3975e038..facbbc9a 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -136,7 +136,11 @@ static int ext_power_settings_commit() { data->status = true; k_work_schedule(&ext_power_save_work, K_NO_WAIT); - ext_power_enable(dev); + if (IS_ENABLED(CONFIG_ZMK_EXT_POWER_START)) { + ext_power_enable(dev); + } else { + ext_power_disable(dev); + } } return 0; @@ -162,8 +166,12 @@ static int ext_power_generic_init(const struct device *dev) { 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. - ext_power_enable(dev); + // Set to default state by default. This may change again once settings load. + if (IS_ENABLED(CONFIG_ZMK_EXT_POWER_START)) { + ext_power_enable(dev); + } else { + ext_power_disable(dev); + } if (config->init_delay_ms) { k_msleep(config->init_delay_ms); diff --git a/app/src/hid.c b/app/src/hid.c index d8700c3f..cf5a557f 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -29,7 +29,7 @@ static uint8_t keys_held = 0; 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}}; + .body = {.buttons = 0, .d_x = 0, .d_y = 0, .d_scroll_y = 0}}; #endif // IS_ENABLED(CONFIG_ZMK_POINTING) diff --git a/app/src/hid_indicators.c b/app/src/hid_indicators.c index 23149cca..74f1d92b 100644 --- a/app/src/hid_indicators.c +++ b/app/src/hid_indicators.c @@ -19,7 +19,7 @@ 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()); + return zmk_hid_indicators_get_profile(zmk_endpoints_selected()); } zmk_hid_indicators_t zmk_hid_indicators_get_profile(struct zmk_endpoint_instance endpoint) { diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index cd463d8e..2d17a395 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) { @@ -70,7 +70,7 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed // 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); + err = zmk_endpoints_send_report(ev->usage_page); if (err < 0) { LOG_ERR("Failed to send key report for the released keycode (%d)", err); } @@ -87,13 +87,13 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed 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/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..02c9e392 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -17,13 +17,15 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) +#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; @@ -75,7 +77,12 @@ static uint8_t keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN]; #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))}; + COND_CODE_0( \ + no_init, \ + (COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), \ + (DT_INST_FOREACH_CHILD_SEP(0, TRANSFORMED_LAYER, (, ))), \ + (DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TRANSFORMED_LAYER, (, ))))), \ + (0))}; KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE), (), (const)), IS_ENABLED(CONFIG_ZMK_STUDIO)) @@ -85,14 +92,14 @@ KEYMAP_VAR(zmk_keymap, COND_CODE_1(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, (, ))}; + DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))}; static uint32_t changed_layer_names = 0; #else static const char *zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN] = { - ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))}; + DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))}; #endif @@ -131,7 +138,7 @@ uint8_t map_layer_id_to_index(zmk_keymap_layer_id_t layer_id) { #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) { +static inline int set_layer_state(zmk_keymap_layer_id_t layer_id, bool state) { int ret = 0; if (layer_id >= ZMK_KEYMAP_LAYERS_LEN) { return -EINVAL; @@ -142,25 +149,18 @@ static inline int set_layer_state(zmk_keymap_layer_id_t layer_id, bool state, bo 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); - } // 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 (old_state != _zmk_keymap_layer_state) { + LOG_DBG("layer_changed: layer %d state %d", layer_id, state); + ret = raise_layer_state_changed(layer_id, state); if (ret < 0) { LOG_WRN("Failed to raise layer state changed (%d)", ret); } +#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) + zmk_split_central_update_layers(_zmk_keymap_layer_state); +#endif } return ret; @@ -176,8 +176,6 @@ zmk_keymap_layer_id_t zmk_keymap_layer_default(void) { return _zmk_keymap_layer_ 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) { // The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody @@ -189,10 +187,6 @@ bool zmk_keymap_layer_active(zmk_keymap_layer_id_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--) { @@ -209,28 +203,26 @@ zmk_keymap_layer_index_t zmk_keymap_highest_layer_active(void) { return LAYER_ID_TO_INDEX(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(zmk_keymap_layer_id_t layer) { return set_layer_state(layer, true); }; + +int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer) { + return set_layer_state(layer, false); }; -int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer, bool locking) { - return set_layer_state(layer, false, locking); -}; - -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(zmk_keymap_layer_id_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(zmk_keymap_layer_id_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; } @@ -242,7 +234,7 @@ const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer_id) { } const struct zmk_behavior_binding * -zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx) { +zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx) { if (binding_idx >= ZMK_KEYMAP_LEN) { return NULL; } @@ -277,7 +269,7 @@ zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t bin 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, +int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx, struct zmk_behavior_binding binding) { if (binding_idx >= ZMK_KEYMAP_LEN) { return -EINVAL; @@ -322,7 +314,7 @@ int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t #else -int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint16_t binding_idx, +int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx, struct zmk_behavior_binding binding) { return -ENOTSUP; } diff --git a/app/src/physical_layouts.c b/app/src/physical_layouts.c index ba21ae31..8d384308 100644 --- a/app/src/physical_layouts.c +++ b/app/src/physical_layouts.c @@ -9,7 +9,6 @@ #include #include #include -#include #if IS_ENABLED(CONFIG_SETTINGS) #include @@ -28,16 +27,6 @@ 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)) @@ -64,35 +53,22 @@ BUILD_ASSERT( ()) \ } -#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)] = { \ + "https://zmk.dev/docs/development/hardware-integration/studio-setup"); \ + static const struct zmk_key_physical_attrs const _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)) = { \ + static const struct zmk_physical_layout const _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))));), \ - ()) + .kscan = DEVICE_DT_GET(COND_CODE_1(DT_INST_PROP_LEN(n, kscan), \ + (DT_INST_PHANDLE(n, kscan)), (DT_CHOSEN(zmk_kscan))))}; DT_INST_FOREACH_STATUS_OKAY(ZMK_LAYOUT_INST) @@ -159,12 +135,12 @@ static const struct zmk_physical_layout _CONCAT(_zmk_physical_layout_, chosen) = 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)) +#elif DT_HAS_CHOSEN(zmk_kscan) #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." + "Ignoring the physical layouts and using the chosen kscan with a synthetic transform. Consider setting a chosen physical layout instead." #endif @@ -172,19 +148,9 @@ 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)}; @@ -214,55 +180,6 @@ static struct zmk_kscan_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) { diff --git a/app/src/pm.c b/app/src/pm.c index eaae3b5c..447eb351 100644 --- a/app/src/pm.c +++ b/app/src/pm.c @@ -23,7 +23,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #ifdef CONFIG_ZMK_PM_DEVICE_SUSPEND_RESUME TYPE_SECTION_START_EXTERN(const struct device *, pm_device_slots); -#if defined(CONFIG_PM_DEVICE_SYSTEM_MANAGED) +#if !defined(CONFIG_PM_DEVICE_RUNTIME_EXCLUSIVE) /* Number of devices successfully suspended. */ static size_t zmk_num_susp; @@ -42,8 +42,8 @@ int zmk_pm_suspend_devices(void) { * 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)) { + if (!device_is_ready(dev) || pm_device_is_busy(dev) || pm_device_state_is_locked(dev) || + pm_device_wakeup_is_enabled(dev) || pm_device_runtime_is_enabled(dev)) { continue; } @@ -93,7 +93,7 @@ int zmk_pm_soft_off(void) { const struct device *devs; #if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - zmk_endpoint_clear_reports(); + zmk_endpoints_clear_current(); // Need to sleep to give any other threads a chance so submit endpoint data. k_sleep(K_MSEC(100)); #endif diff --git a/app/src/pointing/Kconfig b/app/src/pointing/Kconfig index fc91f144..43bc784f 100644 --- a/app/src/pointing/Kconfig +++ b/app/src/pointing/Kconfig @@ -78,11 +78,6 @@ 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 diff --git a/app/src/pointing/input_listener.c b/app/src/pointing/input_listener.c index cd18f791..28f25300 100644 --- a/app/src/pointing/input_listener.c +++ b/app/src/pointing/input_listener.c @@ -128,14 +128,6 @@ static void handle_key_code(const struct input_listener_config *config, 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: @@ -325,7 +317,7 @@ static void input_handler(const struct input_listener_config *config, } } - zmk_endpoint_send_mouse_report(); + zmk_endpoints_send_mouse_report(); zmk_hid_mouse_scroll_set(0, 0); zmk_hid_mouse_movement_set(0, 0); @@ -399,10 +391,9 @@ static void input_handler(const struct input_listener_config *config, .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) { \ + void input_handler_##n(struct input_event *evt) { \ input_handler(&config_##n, &data_##n, evt); \ - } INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), input_handler_##n, \ - NULL);), \ + } INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), input_handler_##n);), \ ()) DT_INST_FOREACH_STATUS_OKAY(IL_INST) diff --git a/app/src/pointing/input_processor_temp_layer.c b/app/src/pointing/input_processor_temp_layer.c index 45562312..999e93a3 100644 --- a/app/src/pointing/input_processor_temp_layer.c +++ b/app/src/pointing/input_processor_temp_layer.c @@ -72,10 +72,10 @@ static void update_layer_state(struct temp_layer_state *state, bool activate) { state->is_active = activate; if (activate) { - zmk_keymap_layer_activate(state->toggle_layer, false); + zmk_keymap_layer_activate(state->toggle_layer); LOG_DBG("Layer %d activated", state->toggle_layer); } else { - zmk_keymap_layer_deactivate(state->toggle_layer, false); + zmk_keymap_layer_deactivate(state->toggle_layer); LOG_DBG("Layer %d deactivated", state->toggle_layer); } } @@ -187,7 +187,7 @@ static int handle_keycode_state_changed(const struct device *dev, const zmk_even return ret; } - LOG_DBG("Setting last_tapped_timestamp to: %lld", ev->timestamp); + LOG_DBG("Setting last_tapped_timestamp to: %d", ev->timestamp); data->state.last_tapped_timestamp = ev->timestamp; ret = k_mutex_unlock(&data->lock); @@ -252,11 +252,7 @@ static int temp_layer_handle_event(const struct device *dev, struct input_event 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); - } + k_work_submit(&layer_action_work); } if (param2 > 0) { diff --git a/app/src/pointing/input_split.c b/app/src/pointing/input_split.c index 6662111d..615790a0 100644 --- a/app/src/pointing/input_split.c +++ b/app/src/pointing/input_split.c @@ -26,42 +26,11 @@ struct zis_entry { 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); } } @@ -69,37 +38,6 @@ int zmk_input_split_report_peripheral_event(uint8_t reg, uint8_t type, uint16_t 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); @@ -116,7 +54,7 @@ int zmk_input_split_peripheral_disconnected(uint8_t reg) { ({})); \ 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) { \ + void split_input_handler_##n(struct input_event *evt) { \ 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, \ @@ -136,8 +74,8 @@ int zmk_input_split_peripheral_disconnected(uint8_t reg) { }}}; \ zmk_split_peripheral_report_event(&ev); \ } \ - INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), split_input_handler_##n, NULL); + INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), split_input_handler_##n); #endif -DT_INST_FOREACH_STATUS_OKAY(ZIS_INST) +DT_INST_FOREACH_STATUS_OKAY(ZIS_INST) \ No newline at end of file diff --git a/app/src/pointing/resolution_multipliers.c b/app/src/pointing/resolution_multipliers.c index fa798462..3ebda9d5 100644 --- a/app/src/pointing/resolution_multipliers.c +++ b/app/src/pointing/resolution_multipliers.c @@ -23,7 +23,7 @@ static struct zmk_pointing_resolution_multipliers multipliers[ZMK_ENDPOINT_COUNT struct zmk_pointing_resolution_multipliers zmk_pointing_resolution_multipliers_get_current_profile(void) { - return zmk_pointing_resolution_multipliers_get_profile(zmk_endpoint_get_selected()); + return zmk_pointing_resolution_multipliers_get_profile(zmk_endpoints_selected()); } struct zmk_pointing_resolution_multipliers diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 3453fb44..567497c9 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -12,20 +12,36 @@ #include #include +#include +#include +#include +#include +#include +#include + +#include +#include + #include #include #include +#include #include +#include #include -#include #include #include #include + #include +#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) +#include +#endif + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if !DT_HAS_CHOSEN(zmk_underglow) @@ -44,25 +60,20 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); BUILD_ASSERT(CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN <= CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX, "ERROR: RGB underglow maximum brightness is less than minimum brightness"); -enum rgb_underglow_effect { - UNDERGLOW_EFFECT_SOLID, - UNDERGLOW_EFFECT_BREATHE, - UNDERGLOW_EFFECT_SPECTRUM, - UNDERGLOW_EFFECT_SWIRL, - UNDERGLOW_EFFECT_NUMBER // Used to track number of underglow effects -}; - struct rgb_underglow_state { struct zmk_led_hsb color; uint8_t animation_speed; uint8_t current_effect; uint16_t animation_step; bool on; + bool status_active; + uint16_t status_animation_step; }; static const struct device *led_strip; static struct led_rgb pixels[STRIP_NUM_PIXELS]; +static struct led_rgb status_pixels[STRIP_NUM_PIXELS]; static struct rgb_underglow_state state; @@ -70,18 +81,22 @@ static struct rgb_underglow_state state; static const struct device *const ext_power = DEVICE_DT_GET(DT_INST(0, zmk_ext_power_generic)); #endif -static struct zmk_led_hsb hsb_scale_min_max(struct zmk_led_hsb hsb) { +void zmk_rgb_set_ext_power(void); + +/* --- Public utility functions for effects --- */ + +struct zmk_led_hsb zmk_rgb_hsb_scale_min_max(struct zmk_led_hsb hsb) { hsb.b = CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN + (CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX - CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN) * hsb.b / BRT_MAX; return hsb; } -static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { +struct zmk_led_hsb zmk_rgb_hsb_scale_zero_max(struct zmk_led_hsb hsb) { hsb.b = hsb.b * CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX / BRT_MAX; return hsb; } -static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { +struct led_rgb zmk_rgb_hsb_to_rgb(struct zmk_led_hsb hsb) { float r = 0, g = 0, b = 0; uint8_t i = hsb.h / 60; @@ -130,71 +145,318 @@ static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { return rgb; } -static void zmk_rgb_underglow_effect_solid(void) { - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - pixels[i] = hsb_to_rgb(hsb_scale_min_max(state.color)); +/* --- Built-in effects --- */ + +static void effect_solid_render(struct zmk_rgb_effect_ctx *ctx) { + for (int i = 0; i < ctx->num_pixels; i++) { + ctx->pixels[i] = zmk_rgb_hsb_to_rgb(zmk_rgb_hsb_scale_min_max(ctx->base_color)); } } -static void zmk_rgb_underglow_effect_breathe(void) { - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - struct zmk_led_hsb hsb = state.color; - hsb.b = abs(state.animation_step - 1200) / 12; +static void effect_breathe_render(struct zmk_rgb_effect_ctx *ctx) { + for (int i = 0; i < ctx->num_pixels; i++) { + struct zmk_led_hsb hsb = ctx->base_color; + hsb.b = abs(*ctx->animation_step - 1200) / 12; - pixels[i] = hsb_to_rgb(hsb_scale_zero_max(hsb)); + ctx->pixels[i] = zmk_rgb_hsb_to_rgb(zmk_rgb_hsb_scale_zero_max(hsb)); } - state.animation_step += state.animation_speed * 10; + *ctx->animation_step += ctx->animation_speed * 10; - if (state.animation_step > 2400) { - state.animation_step = 0; + if (*ctx->animation_step > 2400) { + *ctx->animation_step = 0; } } -static void zmk_rgb_underglow_effect_spectrum(void) { - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - struct zmk_led_hsb hsb = state.color; - hsb.h = state.animation_step; +static void effect_spectrum_render(struct zmk_rgb_effect_ctx *ctx) { + for (int i = 0; i < ctx->num_pixels; i++) { + struct zmk_led_hsb hsb = ctx->base_color; + hsb.h = *ctx->animation_step; - pixels[i] = hsb_to_rgb(hsb_scale_min_max(hsb)); + ctx->pixels[i] = zmk_rgb_hsb_to_rgb(zmk_rgb_hsb_scale_min_max(hsb)); } - state.animation_step += state.animation_speed; - state.animation_step = state.animation_step % HUE_MAX; + *ctx->animation_step += ctx->animation_speed; + *ctx->animation_step = *ctx->animation_step % HUE_MAX; } -static void zmk_rgb_underglow_effect_swirl(void) { - 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; +static void effect_swirl_render(struct zmk_rgb_effect_ctx *ctx) { + for (int i = 0; i < ctx->num_pixels; i++) { + struct zmk_led_hsb hsb = ctx->base_color; + hsb.h = (HUE_MAX / ctx->num_pixels * i + *ctx->animation_step) % HUE_MAX; - pixels[i] = hsb_to_rgb(hsb_scale_min_max(hsb)); + ctx->pixels[i] = zmk_rgb_hsb_to_rgb(zmk_rgb_hsb_scale_min_max(hsb)); } - state.animation_step += state.animation_speed * 2; - state.animation_step = state.animation_step % HUE_MAX; + *ctx->animation_step += ctx->animation_speed * 2; + *ctx->animation_step = *ctx->animation_step % HUE_MAX; } -static void zmk_rgb_underglow_tick(struct k_work *work) { - switch (state.current_effect) { - case UNDERGLOW_EFFECT_SOLID: - zmk_rgb_underglow_effect_solid(); - break; - case UNDERGLOW_EFFECT_BREATHE: - zmk_rgb_underglow_effect_breathe(); - break; - case UNDERGLOW_EFFECT_SPECTRUM: - zmk_rgb_underglow_effect_spectrum(); - break; - case UNDERGLOW_EFFECT_SWIRL: - zmk_rgb_underglow_effect_swirl(); - break; +ZMK_RGB_EFFECT_DEFINE(effect_solid, "Solid", effect_solid_render, 0, NULL, NULL); +ZMK_RGB_EFFECT_DEFINE(effect_breathe, "Breathe", effect_breathe_render, 0, NULL, NULL); +ZMK_RGB_EFFECT_DEFINE(effect_spectrum, "Spectrum", effect_spectrum_render, 0, NULL, NULL); +ZMK_RGB_EFFECT_DEFINE(effect_swirl, "Swirl", effect_swirl_render, 0, NULL, NULL); + +/* --- Effect registry helpers --- */ + +int zmk_rgb_effect_get_count(void) { + int count; + STRUCT_SECTION_COUNT(zmk_rgb_effect, &count); + return count; +} + +static struct zmk_rgb_effect *zmk_rgb_effect_get(int index) { + int count = zmk_rgb_effect_get_count(); + if (index < 0 || index >= count) { + return NULL; + } + struct zmk_rgb_effect *effect; + STRUCT_SECTION_GET(zmk_rgb_effect, index, &effect); + return effect; +} + +/* --- Status indicator overlay (separate from effects) --- */ + +static int zmk_led_generate_status(void); + +static void zmk_led_write_pixels(void) { + static struct led_rgb led_buffer[STRIP_NUM_PIXELS]; + int bat0; + int blend = 0; + int reset_ext_power = 0; + +#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) + bat0 = zmk_battery_state_of_charge(); +#else + bat0 = 100; +#endif + + if (state.status_active) { + blend = zmk_led_generate_status(); } - int err = led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + if (blend == 0 && bat0 >= 20) { + led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + return; + } + if (bat0 < 10) { + memset(pixels, 0, sizeof(struct led_rgb) * STRIP_NUM_PIXELS); +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) + if (state.on) { + int c_power = ext_power_get(ext_power); + if (c_power && !state.status_active) { + state.on = false; + reset_ext_power = true; + } + } +#endif + } + + if (blend == 0) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + led_buffer[i] = pixels[i]; + } + } else if (blend >= 256) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + led_buffer[i] = status_pixels[i]; + } + } else if (blend < 256) { + uint16_t blend_l = blend; + uint16_t blend_r = 256 - blend; + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + led_buffer[i].r = + ((status_pixels[i].r * blend_l) >> 8) + ((pixels[i].r * blend_r) >> 8); + led_buffer[i].g = + ((status_pixels[i].g * blend_l) >> 8) + ((pixels[i].g * blend_r) >> 8); + led_buffer[i].b = + ((status_pixels[i].b * blend_l) >> 8) + ((pixels[i].b * blend_r) >> 8); + } + } + + if (bat0 < 20) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + led_buffer[i].r = led_buffer[i].r >> 1; + led_buffer[i].g = led_buffer[i].g >> 1; + led_buffer[i].b = led_buffer[i].b >> 1; + } + } + + int err = led_strip_update_rgb(led_strip, led_buffer, STRIP_NUM_PIXELS); if (err < 0) { LOG_ERR("Failed to update the RGB strip (%d)", err); } + + if (reset_ext_power) { + zmk_rgb_set_ext_power(); + } +} + +#define UNDERGLOW_INDICATORS DT_PATH(underglow_indicators) + +#if defined(DT_N_S_underglow_indicators_EXISTS) +#define UNDERGLOW_INDICATORS_ENABLED 1 +#define LEFT_HALF +#else +#define UNDERGLOW_INDICATORS_ENABLED 0 +#define RIGHT_HALF +#endif + +#if !UNDERGLOW_INDICATORS_ENABLED +static int zmk_led_generate_status(void) { return 0; } +#else +const uint8_t underglow_layer_state[] = DT_PROP(UNDERGLOW_INDICATORS, layer_state); +const uint8_t underglow_ble_state[] = DT_PROP(UNDERGLOW_INDICATORS, ble_state); +const uint8_t underglow_bat_lhs[] = DT_PROP(UNDERGLOW_INDICATORS, bat_lhs); +const uint8_t underglow_bat_rhs[] = DT_PROP(UNDERGLOW_INDICATORS, bat_rhs); + +#define HEXRGB(R, G, B) \ + ((struct led_rgb){ \ + r : (CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX * (R)) / 0xff, \ + g : (CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX * (G)) / 0xff, \ + b : (CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX * (B)) / 0xff \ + }) + +const struct led_rgb red = HEXRGB(0xff, 0x00, 0x00); +const struct led_rgb yellow = HEXRGB(0xff, 0xff, 0x00); +const struct led_rgb green = HEXRGB(0x00, 0xff, 0x00); +const struct led_rgb dull_green = HEXRGB(0x00, 0xff, 0x68); +const struct led_rgb magenta = HEXRGB(0xff, 0x00, 0xff); +const struct led_rgb white = HEXRGB(0xff, 0xff, 0xff); +const struct led_rgb lilac = HEXRGB(0x6b, 0x1f, 0xce); + +static void zmk_led_battery_level(int bat_level, const uint8_t *addresses, size_t addresses_len) { + struct led_rgb bat_colour; + + if (bat_level > 40) { + bat_colour = green; + } else if (bat_level > 20) { + bat_colour = yellow; + } else { + bat_colour = red; + } + + for (int i = 0; i < addresses_len; i++) { + int min_level = (i * 100) / (addresses_len - 1); + if (bat_level >= min_level) { + status_pixels[addresses[i]] = bat_colour; + } + } +} + +static void zmk_led_fill(struct led_rgb color, const uint8_t *addresses, size_t addresses_len) { + for (int i = 0; i < addresses_len; i++) { + status_pixels[addresses[i]] = color; + } +} + +#define ZMK_LED_NUMLOCK_BIT BIT(0) +#define ZMK_LED_CAPSLOCK_BIT BIT(1) +#define ZMK_LED_SCROLLLOCK_BIT BIT(2) + +static int zmk_led_generate_status(void) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + status_pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; + } + +#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) + zmk_led_battery_level(zmk_battery_state_of_charge(), underglow_bat_lhs, + DT_PROP_LEN(UNDERGLOW_INDICATORS, bat_lhs)); +#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) + uint8_t peripheral_level = 0; + int rc = zmk_split_central_get_peripheral_battery_level(0, &peripheral_level); + + if (rc == 0) { + zmk_led_battery_level(peripheral_level, underglow_bat_rhs, + DT_PROP_LEN(UNDERGLOW_INDICATORS, bat_rhs)); + } else if (rc == -ENOTCONN) { + zmk_led_fill(red, underglow_bat_rhs, DT_PROP_LEN(UNDERGLOW_INDICATORS, bat_rhs)); + } else if (rc == -EINVAL) { + LOG_ERR("Invalid peripheral index requested for battery level read: 0"); + } +#endif +#endif + + zmk_hid_indicators_t led_flags = zmk_hid_indicators_get_current_profile(); + + if (led_flags & ZMK_LED_CAPSLOCK_BIT) + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, capslock)] = red; + if (led_flags & ZMK_LED_NUMLOCK_BIT) + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, numlock)] = red; + if (led_flags & ZMK_LED_SCROLLLOCK_BIT) + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, scrolllock)] = red; + + for (uint8_t i = 0; i < DT_PROP_LEN(UNDERGLOW_INDICATORS, layer_state); i++) { + if (zmk_keymap_layer_active(i)) + status_pixels[underglow_layer_state[i]] = magenta; + } + + struct zmk_endpoint_instance active_endpoint = zmk_endpoints_selected(); + + if (!zmk_endpoints_preferred_transport_is_active()) + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, output_fallback)] = red; + +#if IS_ENABLED(CONFIG_ZMK_BLE) + int active_ble_profile_index = zmk_ble_active_profile_index(); + for (uint8_t i = 0; + i < MIN(ZMK_BLE_PROFILE_COUNT, DT_PROP_LEN(UNDERGLOW_INDICATORS, ble_state)); i++) { + int8_t status = zmk_ble_profile_status(i); + int ble_pixel = underglow_ble_state[i]; + if (status == 2 && active_endpoint.transport == ZMK_TRANSPORT_BLE && + active_ble_profile_index == i) { + status_pixels[ble_pixel] = white; + } else if (status == 2) { + status_pixels[ble_pixel] = dull_green; + } else if (status == 1) { + status_pixels[ble_pixel] = red; + } else if (status == 0) { + status_pixels[ble_pixel] = lilac; + } + } +#endif + + enum zmk_usb_conn_state usb_state = zmk_usb_get_conn_state(); + if (usb_state == ZMK_USB_CONN_HID && + active_endpoint.transport == ZMK_TRANSPORT_USB) { + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = white; + } else if (usb_state == ZMK_USB_CONN_HID) { + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = dull_green; + } else if (usb_state == ZMK_USB_CONN_POWERED) { + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = red; + } else if (usb_state == ZMK_USB_CONN_NONE) { + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = lilac; + } + + int16_t blend = 256; + if (state.status_animation_step < (500 / 25)) { + blend = ((state.status_animation_step * 256) / (500 / 25)); + } else if (state.status_animation_step > (8000 / 25)) { + blend = 256 - (((state.status_animation_step - (8000 / 25)) * 256) / (2000 / 25)); + } + if (blend < 0) + blend = 0; + if (blend > 256) + blend = 256; + + return blend; +} +#endif + +/* --- Tick / animation loop --- */ + +static void zmk_rgb_underglow_tick(struct k_work *work) { + struct zmk_rgb_effect *effect = zmk_rgb_effect_get(state.current_effect); + if (effect && effect->render) { + struct zmk_rgb_effect_ctx ctx = { + .pixels = pixels, + .num_pixels = STRIP_NUM_PIXELS, + .base_color = state.color, + .animation_step = &state.animation_step, + .animation_speed = state.animation_speed, + }; + effect->render(&ctx); + } + + zmk_led_write_pixels(); } K_WORK_DEFINE(underglow_tick_work, zmk_rgb_underglow_tick); @@ -209,11 +471,16 @@ static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { K_TIMER_DEFINE(underglow_tick, zmk_rgb_underglow_tick_handler, NULL); +void zmk_rgb_request_refresh(void) { + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_tick_work); +} + +/* --- Settings persistence --- */ + #if IS_ENABLED(CONFIG_SETTINGS) static int rgb_settings_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { const char *next; int rc; - if (settings_name_steq(name, "state", &next) && !next) { if (len != sizeof(state)) { return -EINVAL; @@ -221,10 +488,13 @@ 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) { + int effect_count = zmk_rgb_effect_get_count(); + if (state.current_effect >= effect_count) { + state.current_effect = 0; + } if (state.on) { k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); } - return 0; } @@ -245,7 +515,6 @@ static struct k_work_delayable underglow_save_work; static int zmk_rgb_underglow_init(void) { 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); @@ -273,8 +542,18 @@ static int zmk_rgb_underglow_init(void) { state.on = zmk_usb_is_powered(); #endif + int effect_count = zmk_rgb_effect_get_count(); + if (state.current_effect >= effect_count && effect_count > 0) { + state.current_effect = 0; + } + if (state.on) { - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); + struct zmk_rgb_effect *effect = zmk_rgb_effect_get(state.current_effect); + if (effect && (effect->flags & ZMK_RGB_EFFECT_STATIC)) { + zmk_rgb_request_refresh(); + } else { + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25)); + } } return 0; @@ -297,72 +576,136 @@ int zmk_rgb_underglow_get_state(bool *on_off) { return 0; } -int zmk_rgb_underglow_on(void) { - if (!led_strip) - return -ENODEV; - +void zmk_rgb_set_ext_power(void) { #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) - if (ext_power != NULL) { - int rc = ext_power_enable(ext_power); - if (rc != 0) { - LOG_ERR("Unable to enable EXT_POWER: %d", rc); + if (ext_power == NULL) + return; + int c_power = ext_power_get(ext_power); + if (c_power < 0) { + LOG_ERR("Unable to examine EXT_POWER: %d", c_power); + c_power = 0; + } + int desired_state = state.on || state.status_active; + +#if IS_ENABLED(CONFIG_ZMK_BATTERY_REPORTING) + if (state.on && !state.status_active) { + if (zmk_battery_state_of_charge() < 10) { + desired_state = false; } } #endif - state.on = true; - state.animation_step = 0; - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); - - return zmk_rgb_underglow_save_state(); -} - -static void zmk_rgb_underglow_off_handler(struct k_work *work) { - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; - } - - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); -} - -K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler); - -int zmk_rgb_underglow_off(void) { - if (!led_strip) - return -ENODEV; - -#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) - if (ext_power != NULL) { + if (desired_state && !c_power) { + int rc = ext_power_enable(ext_power); + if (rc != 0) { + LOG_ERR("Unable to enable EXT_POWER: %d", rc); + } + } else if (!desired_state && c_power) { int rc = ext_power_disable(ext_power); if (rc != 0) { LOG_ERR("Unable to disable EXT_POWER: %d", rc); } } #endif +} + +int zmk_rgb_underglow_on(void) { + zmk_rgb_underglow_transient_on(); + return zmk_rgb_underglow_save_state(); +} + +int zmk_rgb_underglow_transient_on(void) { + if (!led_strip) + return -ENODEV; + + state.on = true; + zmk_rgb_set_ext_power(); + + state.animation_step = 0; + + struct zmk_rgb_effect *effect = zmk_rgb_effect_get(state.current_effect); + if (effect && effect->on_select) { + effect->on_select(); + } + if (effect && (effect->flags & ZMK_RGB_EFFECT_STATIC)) { + zmk_rgb_request_refresh(); + } else { + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25)); + } + + return 0; +} + +static void zmk_rgb_underglow_off_handler(struct k_work *work) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; + } + zmk_led_write_pixels(); +} + +K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler); + +int zmk_rgb_underglow_off(void) { + zmk_rgb_underglow_transient_off(); + return zmk_rgb_underglow_save_state(); +} + +int zmk_rgb_underglow_transient_off(void) { + if (!led_strip) + return -ENODEV; + + struct zmk_rgb_effect *effect = zmk_rgb_effect_get(state.current_effect); + if (effect && effect->on_deselect) { + effect->on_deselect(); + } k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_off_work); k_timer_stop(&underglow_tick); state.on = false; + zmk_rgb_set_ext_power(); - return zmk_rgb_underglow_save_state(); + return 0; } int zmk_rgb_underglow_calc_effect(int direction) { - return (state.current_effect + UNDERGLOW_EFFECT_NUMBER + direction) % UNDERGLOW_EFFECT_NUMBER; + int count = zmk_rgb_effect_get_count(); + if (count == 0) + return 0; + return (state.current_effect + count + direction) % count; } int zmk_rgb_underglow_select_effect(int effect) { if (!led_strip) return -ENODEV; - if (effect < 0 || effect >= UNDERGLOW_EFFECT_NUMBER) { + int count = zmk_rgb_effect_get_count(); + if (effect < 0 || effect >= count) { return -EINVAL; } + struct zmk_rgb_effect *old_eff = zmk_rgb_effect_get(state.current_effect); + if (old_eff && old_eff->on_deselect) { + old_eff->on_deselect(); + } + state.current_effect = effect; state.animation_step = 0; + struct zmk_rgb_effect *new_eff = zmk_rgb_effect_get(state.current_effect); + if (new_eff && new_eff->on_select) { + new_eff->on_select(); + } + + if (state.on) { + if (new_eff && (new_eff->flags & ZMK_RGB_EFFECT_STATIC)) { + k_timer_stop(&underglow_tick); + zmk_rgb_request_refresh(); + } else { + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25)); + } + } + return zmk_rgb_underglow_save_state(); } @@ -374,6 +717,52 @@ int zmk_rgb_underglow_toggle(void) { return state.on ? zmk_rgb_underglow_off() : zmk_rgb_underglow_on(); } +/* --- Status overlay timer --- */ + +static void zmk_led_write_pixels_work(struct k_work *work); +static void zmk_rgb_underglow_status_update(struct k_timer *timer); + +K_WORK_DEFINE(underglow_write_work, zmk_led_write_pixels_work); +K_TIMER_DEFINE(underglow_status_update_timer, zmk_rgb_underglow_status_update, NULL); + +static void zmk_rgb_underglow_status_update(struct k_timer *timer) { + if (!state.status_active) + return; + state.status_animation_step++; + if (state.status_animation_step > (10000 / 25)) { + state.status_active = false; + k_timer_stop(&underglow_status_update_timer); + } + if (!k_work_is_pending(&underglow_write_work)) + k_work_submit(&underglow_write_work); +} + +static void zmk_led_write_pixels_work(struct k_work *work) { + zmk_led_write_pixels(); + if (!state.status_active) { + zmk_rgb_set_ext_power(); + } +} + +int zmk_rgb_underglow_status(void) { + if (!state.status_active) { + state.status_animation_step = 0; + } else { + if (state.status_animation_step > (500 / 25)) { + state.status_animation_step = 500 / 25; + } + } + state.status_active = true; + zmk_led_write_pixels(); + zmk_rgb_set_ext_power(); + + k_timer_start(&underglow_status_update_timer, K_NO_WAIT, K_MSEC(25)); + + return 0; +} + +/* --- HSB control functions --- */ + int zmk_rgb_underglow_set_hsb(struct zmk_led_hsb color) { if (color.h > HUE_MAX || color.s > SAT_MAX || color.b > BRT_MAX) { return -ENOTSUP; @@ -460,6 +849,8 @@ int zmk_rgb_underglow_change_spd(int direction) { return zmk_rgb_underglow_save_state(); } +/* --- Auto off / idle listeners --- */ + #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) || \ IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) struct rgb_underglow_sleep_state { @@ -473,7 +864,6 @@ static int rgb_underglow_auto_state(bool target_wake_state) { 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) { return 0; } @@ -481,13 +871,13 @@ static int rgb_underglow_auto_state(bool target_wake_state) { if (sleep_state.is_awake) { if (sleep_state.rgb_state_before_sleeping) { - return zmk_rgb_underglow_on(); + return zmk_rgb_underglow_transient_on(); } else { - return zmk_rgb_underglow_off(); + return zmk_rgb_underglow_transient_off(); } } else { sleep_state.rgb_state_before_sleeping = state.on; - return zmk_rgb_underglow_off(); + return zmk_rgb_underglow_transient_off(); } } @@ -509,8 +899,7 @@ static int rgb_underglow_event_listener(const zmk_event_t *eh) { } ZMK_LISTENER(rgb_underglow, rgb_underglow_event_listener); -#endif // IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) || - // IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) +#endif #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) ZMK_SUBSCRIPTION(rgb_underglow, zmk_activity_state_changed); diff --git a/app/src/sensors.c b/app/src/sensors.c index e1295de8..90ea1903 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -73,7 +73,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) { diff --git a/app/src/split/bluetooth/CMakeLists.txt b/app/src/split/bluetooth/CMakeLists.txt index f4e12a9d..4258b209 100644 --- a/app/src/split/bluetooth/CMakeLists.txt +++ b/app/src/split/bluetooth/CMakeLists.txt @@ -4,9 +4,12 @@ if (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE service.c) target_sources(app PRIVATE peripheral.c) + target_sources(app PRIVATE peripheral_layers.c) + endif() if (CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE central.c) + target_sources_ifdef(CONFIG_ZMK_SPLIT_BLE_PREF_IDLE app PRIVATE central_listener.c) endif() if (CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_PROXY) diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index ca0b261f..c5f11945 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -22,8 +22,8 @@ config ZMK_SPLIT_ROLE_CENTRAL 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 +config BT_L2CAP_TX_BUF_COUNT + default 5 if ZMK_SPLIT_ROLE_CENTRAL if ZMK_SPLIT_ROLE_CENTRAL @@ -74,6 +74,26 @@ config ZMK_SPLIT_BLE_PREF_TIMEOUT int "Supervision timeout to use for split central/peripheral connection" default 400 +config ZMK_SPLIT_BLE_PREF_IDLE + bool "Set slower split peripheral BLE params on idle to save power" + default y + +if ZMK_SPLIT_BLE_PREF_IDLE + +config ZMK_SPLIT_BLE_PREF_IDLE_INT + int "Peripheral idle connection interval in 1.25ms units" + default 18 + +config ZMK_SPLIT_BLE_PREF_IDLE_LATENCY + int "Peripheral idle latency in Connection Intervals" + default 10 + +config ZMK_SPLIT_BLE_PREF_IDLE_TIMEOUT + int "Peripheral idle supervision timeout in 10ms units" + default 400 + +endif # ZMK_SPLIT_BLE_PREF_IDLE + endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index b4b61ce7..382c7bad 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -33,6 +33,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include static int start_scanning(void); @@ -60,6 +61,8 @@ struct peripheral_slot { uint16_t update_hid_indicators; #endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) uint16_t selected_physical_layout_handle; + uint16_t update_layers_handle; + uint8_t position_state[POSITION_STATE_DATA_LEN]; uint8_t changed_positions[POSITION_STATE_DATA_LEN]; }; @@ -122,7 +125,7 @@ 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); + // memset(&peripheral_input_slots[i], 0, sizeof(struct peripheral_input_slot)); } } } @@ -219,6 +222,7 @@ int release_peripheral_slot(int index) { #if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) slot->update_hid_indicators = 0; #endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) + slot->update_layers_handle = 0; return 0; } @@ -620,6 +624,10 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, 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) + } else if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, + BT_UUID_DECLARE_128(ZMK_SPLIT_BT_UPDATE_LAYERS_UUID))) { + LOG_DBG("Found update Layers handle"); + slot->update_layers_handle = bt_gatt_attr_value_handle(attr); #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)) { @@ -707,6 +715,8 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, } #endif // IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) + subscribed = subscribed && slot->update_layers_handle; + return subscribed ? BT_GATT_ITER_STOP : BT_GATT_ITER_CONTINUE; } @@ -966,6 +976,10 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); k_work_submit(&peripheral_event_work); + // struct zmk_peripheral_battery_state_changed ev = { + // .source = peripheral_slot_index_for_conn(conn), .state_of_charge = 0}; + // k_msgq_put(&peripheral_batt_lvl_msgq, &ev, K_NO_WAIT); + // k_work_submit(&peripheral_batt_lvl_work); #endif // IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING) #if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) @@ -1141,6 +1155,42 @@ static struct settings_handler ble_central_settings_handler = { #endif // IS_ENABLED(CONFIG_SETTINGS) +static uint32_t layers_for_peripheral = 0; + +static void split_central_update_layers_callback(struct k_work *work) { + uint32_t layers = layers_for_peripheral; + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { + if (peripherals[i].state != PERIPHERAL_SLOT_STATE_CONNECTED) { + continue; + } + + if (peripherals[i].update_layers_handle == 0) { + continue; + } + + int err = + bt_gatt_write_without_response(peripherals[i].conn, peripherals[i].update_layers_handle, + &layers, sizeof(layers), true); + + if (err) { + LOG_ERR("Failed to send layers to peripheral (err %d)", err); + } else { + LOG_DBG("Sent Layers over to peripheral"); + raise_zmk_split_peripheral_layer_changed( + (struct zmk_split_peripheral_layer_changed){.layers = layers}); + } + } +} + +static K_WORK_DEFINE(split_central_update_layers, split_central_update_layers_callback); + +int zmk_split_central_update_layers(uint32_t new_layers) { + layers_for_peripheral = new_layers; + return k_work_submit_to_queue(&split_central_split_run_q, &split_central_update_layers); +} + +// valdur layers done + static int zmk_split_bt_central_init(void) { 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), @@ -1284,7 +1334,8 @@ static int finish_init() { 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); + LOG_DBG("Trigger key position state change for %d", + ev.event.data.key_position_event.position); 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 index f706d78f..3e89fb0b 100644 --- a/app/src/split/bluetooth/central_bas_proxy.c +++ b/app/src/split/bluetooth/central_bas_proxy.c @@ -30,7 +30,7 @@ static void blvl_ccc_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value 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; + const uint8_t source = (uint8_t)(uint32_t)attr->user_data; uint8_t level = 0; int rc = zmk_split_central_get_peripheral_battery_level(source, &level); @@ -60,7 +60,7 @@ static const struct bt_gatt_cpf aux_level_cpf = { #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_PERM_READ, read_blvl, NULL, 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), diff --git a/app/src/split/bluetooth/central_listener.c b/app/src/split/bluetooth/central_listener.c new file mode 100644 index 00000000..87e471cb --- /dev/null +++ b/app/src/split/bluetooth/central_listener.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include + +#include +#include + +static void set_sleep_params(struct bt_conn *conn, void *data) { + struct bt_conn_info info; + + bt_conn_get_info(conn, &info); + + if (info.role == BT_CONN_ROLE_CENTRAL) { + int err = + bt_conn_le_param_update(conn, BT_LE_CONN_PARAM(CONFIG_ZMK_SPLIT_BLE_PREF_IDLE_INT, + CONFIG_ZMK_SPLIT_BLE_PREF_IDLE_INT, + CONFIG_ZMK_SPLIT_BLE_PREF_IDLE_LATENCY, + CONFIG_ZMK_SPLIT_BLE_PREF_IDLE_TIMEOUT)); + + if (err) { + LOG_DBG("Failed to sleep split connection: %d", err); + } + } +} + +static void set_wake_params(struct bt_conn *conn, void *data) { + struct bt_conn_info info; + + bt_conn_get_info(conn, &info); + + if (info.role == BT_CONN_ROLE_CENTRAL) { + int err = bt_conn_le_param_update( + conn, + 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)); + + if (err) { + LOG_DBG("Failed to wake up split connection: %d", err); + } + } +} + +static void sleep_all() { + LOG_DBG("Setting idle connection parameters on peripherals"); + + bt_conn_foreach(BT_CONN_TYPE_LE, set_sleep_params, NULL); +} + +static void wake_all() { + LOG_DBG("Waking up from idle connection parameters on peripherals"); + + bt_conn_foreach(BT_CONN_TYPE_LE, set_wake_params, NULL); +} + +int central_event_handler(const zmk_event_t *eh) { + struct zmk_activity_state_changed *ev = as_zmk_activity_state_changed(eh); + if (ev == NULL) { + return -ENOTSUP; + } + + switch (ev->state) { + case ZMK_ACTIVITY_ACTIVE: + wake_all(); + break; + case ZMK_ACTIVITY_IDLE: + sleep_all(); + break; + case ZMK_ACTIVITY_SLEEP: + break; + default: + LOG_WRN("Unhandled activity state: %d", ev->state); + return -EINVAL; + } + return 0; +} + +ZMK_LISTENER(central, central_event_handler); +ZMK_SUBSCRIPTION(central, zmk_activity_state_changed); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 0d3ad2de..e4e7ba3a 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -68,7 +68,7 @@ static int start_advertising(bool low_duty) { 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); } }; @@ -96,13 +96,6 @@ static void connected(struct bt_conn *conn, uint8_t err) { } } -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]; @@ -114,6 +107,11 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { raise_zmk_split_peripheral_status_changed( (struct zmk_split_peripheral_status_changed){.connected = is_connected}); + + if (enabled) { + 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,7 +138,6 @@ 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, }; diff --git a/app/src/split/bluetooth/peripheral_layers.c b/app/src/split/bluetooth/peripheral_layers.c new file mode 100644 index 00000000..c5e8c68d --- /dev/null +++ b/app/src/split/bluetooth/peripheral_layers.c @@ -0,0 +1,25 @@ + +#include +#include + +#include +#include + +static uint32_t peripheral_layers = 0; + +void set_peripheral_layers_state(uint32_t new_layers) { peripheral_layers = new_layers; } + +bool peripheral_layer_active(uint8_t layer) { + return (peripheral_layers & (BIT(layer))) == (BIT(layer)); +}; + +uint8_t peripheral_highest_layer_active(void) { + if (peripheral_layers > 0) { + for (uint8_t layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer > 0; layer--) { + if ((peripheral_layers & (BIT(layer))) == (BIT(layer)) || layer == 0) { + return layer; + } + } + } + return 0; +} \ No newline at end of file diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index 5bbed137..9f02a4ca 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -31,9 +31,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) #include #endif // IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) +#include #include #include +#include #if ZMK_KEYMAP_HAS_SENSORS static struct sensor_event last_sensor_event; @@ -139,6 +141,31 @@ static ssize_t split_svc_get_selected_phys_layout(struct bt_conn *conn, return bt_gatt_attr_read(conn, attrs, buf, len, offset, &selected, sizeof(selected)); } +static uint32_t layers = 0; + +static void split_svc_update_layers_callback(struct k_work *work) { + LOG_DBG("Setting peripheral layers: %x", layers); + // set_peripheral_layers_state(layers); + raise_zmk_split_peripheral_layer_changed( + (struct zmk_split_peripheral_layer_changed){.layers = layers}); +} + +static K_WORK_DEFINE(split_svc_update_layers_work, split_svc_update_layers_callback); + +static ssize_t split_svc_update_layers(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(uint32_t)) { + return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); + } + + memcpy((uint8_t *)&layers + offset, buf, len); + + k_work_submit(&split_svc_update_layers_work); + + return len; +} + #if IS_ENABLED(CONFIG_ZMK_INPUT_SPLIT) static void split_input_events_ccc(const struct bt_gatt_attr *attr, uint16_t value) { @@ -204,8 +231,11 @@ BT_GATT_SERVICE_DEFINE( 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), ); + split_svc_get_selected_phys_layout, split_svc_select_phys_layout, NULL), + + BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_UPDATE_LAYERS_UUID), + BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE_ENCRYPT, NULL, + split_svc_update_layers, NULL), ); K_THREAD_STACK_DEFINE(service_q_stack, CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE); diff --git a/app/src/split/peripheral.c b/app/src/split/peripheral.c index b814df61..4157ffa2 100644 --- a/app/src/split/peripheral.c +++ b/app/src/split/peripheral.c @@ -11,17 +11,12 @@ #include #include -#include #include #include #include #include -#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) -#include -#endif - #include #include @@ -55,17 +50,7 @@ int zmk_split_transport_peripheral_command_handler( 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; diff --git a/app/src/split/wired/central.c b/app/src/split/wired/central.c index 0354e52d..157092f7 100644 --- a/app/src/split/wired/central.c +++ b/app/src/split/wired/central.c @@ -77,7 +77,7 @@ static const struct gpio_dt_spec detect_gpio = GPIO_DT_SPEC_INST_GET(0, detect_g #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" + "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/development/hardware-integration/new-shield#wired-split" #endif @@ -87,7 +87,7 @@ 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]; +uint8_t async_rx_buf[RX_BUFFER_SIZE / 2][2]; static struct zmk_split_wired_async_state async_state = { .process_tx_work = &publish_events, diff --git a/app/src/split/wired/peripheral.c b/app/src/split/wired/peripheral.c index 71d3da83..72300ca5 100644 --- a/app/src/split/wired/peripheral.c +++ b/app/src/split/wired/peripheral.c @@ -76,7 +76,7 @@ static const struct gpio_dt_spec detect_gpio = GPIO_DT_SPEC_INST_GET(0, detect_g #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" + "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/development/hardware-integration/new-shield#wired-split" #endif @@ -89,7 +89,7 @@ K_MSGQ_DEFINE(cmd_msg_queue, sizeof(struct zmk_split_transport_central_command), #if IS_ENABLED(CONFIG_ZMK_SPLIT_WIRED_UART_MODE_ASYNC) -uint8_t async_rx_buf[2][RX_BUFFER_SIZE / 2]; +uint8_t async_rx_buf[RX_BUFFER_SIZE / 2][2]; static struct zmk_split_wired_async_state async_state = { .rx_bufs = {async_rx_buf[0], async_rx_buf[1]}, diff --git a/app/src/studio/Kconfig b/app/src/studio/Kconfig index 1f4da6d3..d7d3d411 100644 --- a/app/src/studio/Kconfig +++ b/app/src/studio/Kconfig @@ -59,20 +59,11 @@ config ZMK_STUDIO_TRANSPORT_UART 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 @@ -80,12 +71,9 @@ config ZMK_STUDIO_TRANSPORT_BLE 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 @@ -93,8 +81,6 @@ config ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY 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 diff --git a/app/src/studio/gatt_rpc_transport.c b/app/src/studio/gatt_rpc_transport.c index dff18259..f0ab3152 100644 --- a/app/src/studio/gatt_rpc_transport.c +++ b/app/src/studio/gatt_rpc_transport.c @@ -25,7 +25,6 @@ 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) { @@ -126,14 +125,8 @@ static int gatt_stop_rx(void) { 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) { @@ -146,32 +139,34 @@ static void notif_rpc_tx_cb(struct k_work *work) { 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 notify_size = get_notify_size_for_conn(conn); + uint8_t notify_bytes[notify_size]; + while (ring_buf_size_get(tx_buf) > 0) { 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); + memcpy(notify_bytes + added, buf, len); added += len; ring_buf_get_finish(tx_buf, len); } + rpc_indicate_params.data = notify_bytes; rpc_indicate_params.len = added; - int err = bt_gatt_indicate(conn, &rpc_indicate_params); - if (err < 0) { + int notify_attempts = 5; + do { + int err = bt_gatt_indicate(conn, &rpc_indicate_params); + if (err >= 0) { + break; + } + LOG_WRN("Failed to notify the response %d", err); - k_sem_give(&indicate_sem); - } + k_sleep(K_MSEC(200)); + } while (notify_attempts-- > 0); } bt_conn_unref(conn); @@ -183,11 +178,6 @@ 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; @@ -204,7 +194,7 @@ static void gatt_tx_notify(struct ring_buf *tx_buf, size_t added, bool msg_done, static struct gatt_write_state tx_state = {}; static void *gatt_tx_user_data(void) { - memset(&tx_state, 0, sizeof(tx_state)); + memset(&tx_state, sizeof(tx_state), 0); return &tx_state; } diff --git a/app/src/studio/rpc.c b/app/src/studio/rpc.c index e79b5568..7b8dd605 100644 --- a/app/src/studio/rpc.c +++ b/app/src/studio/rpc.c @@ -87,7 +87,7 @@ static bool rpc_read_cb(pb_istream_t *stream, uint8_t *buf, size_t count) { do { uint8_t *buffer; - uint32_t len = ring_buf_get_claim(&rpc_rx_buf, &buffer, count - write_offset); + uint32_t len = ring_buf_get_claim(&rpc_rx_buf, &buffer, count); if (len > 0) { for (int i = 0; i < len; i++) { @@ -217,7 +217,7 @@ static void rpc_main(void) { 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); + thread_analyzer_print(); #endif // IS_ENABLED(CONFIG_THREAD_ANALYZER) bool status = pb_decode(&stream, &zmk_studio_Request_msg, &req); @@ -228,7 +228,7 @@ static void rpc_main(void) { int err = send_response(&resp); #if IS_ENABLED(CONFIG_THREAD_ANALYZER) - thread_analyzer_print(0); + thread_analyzer_print(); #endif // IS_ENABLED(CONFIG_THREAD_ANALYZER) if (err < 0) { LOG_ERR("Failed to send the RPC response %d", err); @@ -243,7 +243,7 @@ K_THREAD_DEFINE(studio_rpc_thread, CONFIG_ZMK_STUDIO_RPC_THREAD_STACK_SIZE, rpc_ NULL, K_LOWEST_APPLICATION_THREAD_PRIO, 0, 0); static void refresh_selected_transport(void) { - enum zmk_transport transport = zmk_endpoint_get_selected().transport; + enum zmk_transport transport = zmk_endpoints_selected().transport; k_mutex_lock(&rpc_transport_mutex, K_FOREVER); diff --git a/app/src/studio/uart_rpc_transport.c b/app/src/studio/uart_rpc_transport.c index 6dcac6d1..d4a4de83 100644 --- a/app/src/studio/uart_rpc_transport.c +++ b/app/src/studio/uart_rpc_transport.c @@ -65,7 +65,7 @@ static void uart_rx_main(void) { } 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); + uart_rx_main, NULL, NULL, NULL, K_LOWEST_APPLICATION_THREAD_PRIO, 0, 0); #endif 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/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 100% rename from app/tests/backlight/cycle/native_sim.keymap rename to app/tests/backlight/cycle/native_posix_64.keymap 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/security/read-hid-after-connect-with-auto-sec/snapshot.log b/app/tests/ble/security/read-hid-after-connect-with-auto-sec/snapshot.log index 4c8f2c27..fa40c20a 100644 --- 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 @@ -9,4 +9,3 @@ 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/split/peripheral-input/events.patterns b/app/tests/ble/split/peripheral-input/events.patterns index c08c1766..f8cf363c 100644 --- a/app/tests/ble/split/peripheral-input/events.patterns +++ b/app/tests/ble/split/peripheral-input/events.patterns @@ -1,2 +1 @@ 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/peripheral.overlay b/app/tests/ble/split/peripheral-input/peripheral.overlay index 8f403b5e..3c571a4f 100644 --- a/app/tests/ble/split/peripheral-input/peripheral.overlay +++ b/app/tests/ble/split/peripheral-input/peripheral.overlay @@ -21,7 +21,6 @@ , , , - , ; exit-after; }; diff --git a/app/tests/ble/split/peripheral-input/snapshot.log b/app/tests/ble/split/peripheral-input/snapshot.log index a31d449d..eaf0675d 100644 --- a/app/tests/ble/split/peripheral-input/snapshot.log +++ b/app/tests/ble/split/peripheral-input/snapshot.log @@ -19,17 +19,7 @@ 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/snapshot.log b/app/tests/ble/split/run-peripheral-behavior/snapshot.log index 2289d9c1..ae93d4d8 100644 --- a/app/tests/ble/split/run-peripheral-behavior/snapshot.log +++ b/app/tests/ble/split/run-peripheral-behavior/snapshot.log @@ -1,6 +1,6 @@ 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_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 3.5 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 diff --git a/app/tests/ble/split/set-hid-indicators/snapshot.log b/app/tests/ble/split/set-hid-indicators/snapshot.log index 580c139e..3e35cb2b 100644 --- a/app/tests/ble/split/set-hid-indicators/snapshot.log +++ b/app/tests/ble/split/set-hid-indicators/snapshot.log @@ -1,6 +1,6 @@ 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_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 3.5 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 @@ -9,5 +9,4 @@ 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/continue-with-modifiers/native_sim.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap similarity index 100% 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 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/locking/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap similarity index 63% rename from app/tests/toggle-layer/locking/native_posix_64.keymap rename to app/tests/caps-word/deactivate-by-second-press/native_posix.keymap index fc70576e..121a827c 100644 --- a/app/tests/toggle-layer/locking/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap @@ -7,19 +7,11 @@ 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) + 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% rename from app/tests/combo/layer-filter-0/native_sim.keymap rename to app/tests/combo/layer-filter-0/native_posix_64.keymap 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 100% rename from app/tests/combo/layer-filter-1/native_sim.keymap rename to app/tests/combo/layer-filter-1/native_posix_64.keymap diff --git a/app/tests/combo/multiple-timeouts/native_sim.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap similarity index 100% rename from app/tests/combo/multiple-timeouts/native_sim.keymap rename to app/tests/combo/multiple-timeouts/native_posix_64.keymap 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 100% rename from app/tests/combo/overlapping-combos-0/native_sim.keymap rename to app/tests/combo/overlapping-combos-0/native_posix_64.keymap 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 100% rename from app/tests/combo/overlapping-combos-1/native_sim.keymap rename to app/tests/combo/overlapping-combos-1/native_posix_64.keymap 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 100% rename from app/tests/combo/overlapping-combos-2/native_sim.keymap rename to app/tests/combo/overlapping-combos-2/native_posix_64.keymap 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 100% rename from app/tests/combo/overlapping-combos-3/native_sim.keymap rename to app/tests/combo/overlapping-combos-3/native_posix_64.keymap 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 100% 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 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 100% rename from app/tests/combo/partially-overlapping-combos/native_sim.keymap rename to app/tests/combo/partially-overlapping-combos/native_posix_64.keymap 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 100% 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 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 100% 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 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 100% 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 diff --git a/app/tests/combo/press-release/native_sim.keymap b/app/tests/combo/press-release/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-release/native_sim.keymap rename to app/tests/combo/press-release/native_posix_64.keymap diff --git a/app/tests/combo/press-timeout/native_sim.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-timeout/native_sim.keymap rename to app/tests/combo/press-timeout/native_posix_64.keymap 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 100% 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 diff --git a/app/tests/combo/press1-press2-release2-release1/native_sim.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press1-press2-release2-release1/native_sim.keymap rename to app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap diff --git a/app/tests/combo/press1-release1-press2-release2/native_sim.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press1-release1-press2-release2/native_sim.keymap rename to app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap 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 100% rename from app/tests/combo/require-prior-idle/native_sim.keymap rename to app/tests/combo/require-prior-idle/native_posix_64.keymap diff --git a/app/tests/combo/slowrelease-disabled/native_sim.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap similarity index 100% rename from app/tests/combo/slowrelease-disabled/native_sim.keymap rename to app/tests/combo/slowrelease-disabled/native_posix_64.keymap diff --git a/app/tests/combo/slowrelease-enabled/native_sim.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap similarity index 100% rename from app/tests/combo/slowrelease-enabled/native_sim.keymap rename to app/tests/combo/slowrelease-enabled/native_posix_64.keymap 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/layers-1/keycode_events.snapshot b/app/tests/encoders/layers-1/keycode_events.snapshot index 0adde28b..95019009 100644 --- a/app/tests/encoders/layers-1/keycode_events.snapshot +++ b/app/tests/encoders/layers-1/keycode_events.snapshot @@ -1,3 +1,3 @@ -layer_changed: layer 2 state 1 locked 1 +layer_changed: layer 2 state 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_posix_64.keymap similarity index 100% rename from app/tests/encoders/layers-1/native_sim.keymap rename to app/tests/encoders/layers-1/native_posix_64.keymap diff --git a/app/tests/encoders/layers-2/keycode_events.snapshot b/app/tests/encoders/layers-2/keycode_events.snapshot index 38cbe27d..153dea9c 100644 --- a/app/tests/encoders/layers-2/keycode_events.snapshot +++ b/app/tests/encoders/layers-2/keycode_events.snapshot @@ -1,4 +1,4 @@ -layer_changed: layer 1 state 1 locked 1 -layer_changed: layer 2 state 1 locked 1 +layer_changed: layer 1 state 1 +layer_changed: layer 2 state 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_posix_64.keymap similarity index 100% rename from app/tests/encoders/layers-2/native_sim.keymap rename to app/tests/encoders/layers-2/native_posix_64.keymap diff --git a/app/tests/encoders/rotate/native_sim.keymap b/app/tests/encoders/rotate/native_posix_64.keymap similarity index 100% rename from app/tests/encoders/rotate/native_sim.keymap rename to app/tests/encoders/rotate/native_posix_64.keymap 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 100% rename from app/tests/gresc/gresc-press-release/native_sim.keymap rename to app/tests/gresc/gresc-press-release/native_posix_64.keymap 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 100% rename from app/tests/gresc/gresc-two-instances/native_sim.keymap rename to app/tests/gresc/gresc-two-instances/native_posix_64.keymap 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 100% 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 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/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/many-nested/native_sim.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap similarity index 100% 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 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 100% 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 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/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-while-undecided/1-tap/native_sim.keymap b/app/tests/hold-tap/hold-while-undecided/1-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/1-tap/native_sim.keymap rename to app/tests/hold-tap/hold-while-undecided/1-tap/native_posix_64.keymap 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_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/2-hold/native_sim.keymap rename to app/tests/hold-tap/hold-while-undecided/2-hold/native_posix_64.keymap 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_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/3-linger/native_sim.keymap rename to app/tests/hold-tap/hold-while-undecided/3-linger/native_posix_64.keymap 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_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_sim.keymap rename to app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_posix_64.keymap 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 100% 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 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/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-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/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/key-repeat/press-and-release-after-key-usage/native_posix.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap new file mode 100644 index 00000000..9078f304 --- /dev/null +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&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) + >; +}; \ No newline at end of file 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/key-repeat/tap-when-rolling/native_posix.keymap b/app/tests/key-repeat/tap-when-rolling/native_posix.keymap new file mode 100644 index 00000000..bb129d14 --- /dev/null +++ b/app/tests/key-repeat/tap-when-rolling/native_posix.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; 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/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/kt-alt-tab/native_sim.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap similarity index 100% rename from app/tests/keytoggle/kt-alt-tab/native_sim.keymap rename to app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap 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 100% rename from app/tests/keytoggle/kt-modded-alpha/native_sim.keymap rename to app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap diff --git a/app/tests/keytoggle/kt-off/native_sim.keymap b/app/tests/keytoggle/kt-off/native_posix_64.keymap similarity index 100% rename from app/tests/keytoggle/kt-off/native_sim.keymap rename to app/tests/keytoggle/kt-off/native_posix_64.keymap diff --git a/app/tests/keytoggle/kt-on/native_sim.keymap b/app/tests/keytoggle/kt-on/native_posix_64.keymap similarity index 100% rename from app/tests/keytoggle/kt-on/native_sim.keymap rename to app/tests/keytoggle/kt-on/native_posix_64.keymap 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/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/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 100% 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 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 100% 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 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 100% rename from app/tests/macros/place-holder-parameters/native_sim.keymap rename to app/tests/macros/place-holder-parameters/native_posix_64.keymap 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/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/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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% rename from app/tests/momentary-layer/1-normal/native_sim.keymap rename to app/tests/momentary-layer/1-normal/native_posix_64.keymap 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 100% 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 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 100% rename from app/tests/momentary-layer/3-covered/native_sim.keymap rename to app/tests/momentary-layer/3-covered/native_posix_64.keymap diff --git a/app/tests/momentary-layer/4-nested/native_sim.keymap b/app/tests/momentary-layer/4-nested/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/4-nested/native_sim.keymap rename to app/tests/momentary-layer/4-nested/native_posix_64.keymap diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap rename to app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap 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/native_sim.keymap b/app/tests/pointing/mkp/native_posix.keymap similarity index 100% rename from app/tests/pointing/mkp/native_sim.keymap rename to app/tests/pointing/mkp/native_posix.keymap diff --git a/app/tests/pointing/mkp/native_sim.conf b/app/tests/pointing/mkp/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mkp/native_sim.conf rename to app/tests/pointing/mkp/native_posix_64.conf diff --git a/app/tests/pointing/mkp/native_posix_64.keymap b/app/tests/pointing/mkp/native_posix_64.keymap new file mode 100644 index 00000000..cec0b6e1 --- /dev/null +++ b/app/tests/pointing/mkp/native_posix_64.keymap @@ -0,0 +1,27 @@ +#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/native_sim.conf b/app/tests/pointing/mouse-move/move_diagonal/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/move_diagonal/native_sim.conf rename to app/tests/pointing/mouse-move/move_diagonal/native_posix_64.conf diff --git a/app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap b/app/tests/pointing/mouse-move/move_diagonal/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap rename to app/tests/pointing/mouse-move/move_diagonal/native_posix_64.keymap diff --git a/app/tests/pointing/mouse-move/move_x/native_sim.conf b/app/tests/pointing/mouse-move/move_x/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/move_x/native_sim.conf rename to app/tests/pointing/mouse-move/move_x/native_posix_64.conf diff --git a/app/tests/pointing/mouse-move/move_x/native_sim.keymap b/app/tests/pointing/mouse-move/move_x/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/move_x/native_sim.keymap rename to app/tests/pointing/mouse-move/move_x/native_posix_64.keymap diff --git a/app/tests/pointing/mouse-move/move_y/native_sim.conf b/app/tests/pointing/mouse-move/move_y/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/move_y/native_sim.conf rename to app/tests/pointing/mouse-move/move_y/native_posix_64.conf diff --git a/app/tests/pointing/mouse-move/move_y/native_sim.keymap b/app/tests/pointing/mouse-move/move_y/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/move_y/native_sim.keymap rename to app/tests/pointing/mouse-move/move_y/native_posix_64.keymap diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf b/app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf rename to app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.conf diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap b/app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.keymap 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.conf rename to app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_posix_64.keymap 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf rename to app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_posix_64.keymap 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.conf rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_posix_64.keymap 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.conf rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_posix_64.keymap 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 index 220da205..55fb9d57 100644 --- 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 @@ -1,4 +1,4 @@ -layer_changed: layer 1 state 1 locked 0 +layer_changed: layer 1 state 1 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 @@ -12,5 +12,5 @@ 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 +layer_changed: layer 1 state 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_posix_64.keymap 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 index 97ed7672..9520a4b4 100644 --- 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 @@ -1,6 +1,6 @@ Dispatching handle_position_state_changed Position excluded, continuing -layer_changed: layer 1 state 1 locked 0 +layer_changed: layer 1 state 1 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 @@ -17,7 +17,7 @@ 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 +layer_changed: layer 1 state 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_posix_64.keymap 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 index 214b8fea..f082de9f 100644 --- 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 @@ -1,6 +1,6 @@ Dispatching handle_position_state_changed Position excluded, continuing -layer_changed: layer 1 state 1 locked 0 +layer_changed: layer 1 state 1 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_posix_64.keymap 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 index 53555472..b528b8d0 100644 --- 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 @@ -27,7 +27,7 @@ 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 +layer_changed: layer 1 state 1 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -2/0 scroll_set: Mouse scroll set to 0/0 @@ -146,5 +146,5 @@ 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 +layer_changed: layer 1 state 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_posix_64.keymap 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 index 6cc1d8d9..a4b01e85 100644 --- 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 @@ -1,4 +1,4 @@ -layer_changed: layer 1 state 1 locked 0 +layer_changed: layer 1 state 1 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 @@ -12,10 +12,10 @@ 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 +layer_changed: layer 1 state 0 Dispatching handle_layer_state_changed Deactivating layer that was activated by this processor -layer_changed: layer 1 state 1 locked 0 +layer_changed: layer 1 state 1 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_posix_64.keymap diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf b/app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf rename to app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.conf diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap b/app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap rename to app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.keymap diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf b/app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf rename to app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.conf diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap b/app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap rename to app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.keymap diff --git a/app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf b/app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf rename to app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.conf diff --git a/app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap b/app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap rename to app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.keymap 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.conf rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.keymap rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_posix_64.keymap 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_posix_64.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.conf rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_posix_64.conf 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_posix_64.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.keymap rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_posix_64.keymap 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 100% 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 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 100% 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 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 100% 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 diff --git a/app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap b/app/tests/sticky-keys/11-lazy-timeout-during/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap rename to app/tests/sticky-keys/11-lazy-timeout-during/native_posix_64.keymap diff --git a/app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap b/app/tests/sticky-keys/11-lazy-timeout/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap rename to app/tests/sticky-keys/11-lazy-timeout/native_posix_64.keymap diff --git a/app/tests/sticky-keys/11-lazy/native_sim.keymap b/app/tests/sticky-keys/11-lazy/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/11-lazy/native_sim.keymap rename to app/tests/sticky-keys/11-lazy/native_posix_64.keymap diff --git a/app/tests/sticky-keys/12-macro/native_sim.keymap b/app/tests/sticky-keys/12-macro/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/12-macro/native_sim.keymap rename to app/tests/sticky-keys/12-macro/native_posix_64.keymap diff --git a/app/tests/sticky-keys/12-same-position-mods/native_sim.keymap b/app/tests/sticky-keys/12-same-position-mods/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/12-same-position-mods/native_sim.keymap rename to app/tests/sticky-keys/12-same-position-mods/native_posix_64.keymap 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_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/12-same-position-sk-sl/native_sim.keymap rename to app/tests/sticky-keys/12-same-position-sk-sl/native_posix_64.keymap 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/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 100% 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 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/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/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 100% 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 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 100% 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 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 100% 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 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/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..7c712a87 100644 --- a/app/tests/toggle-layer/behavior_keymap.dtsi +++ b/app/tests/toggle-layer/behavior_keymap.dtsi @@ -3,23 +3,13 @@ #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"; default_layer { bindings = < &kp B &tog 1 - &mo 2 &to 1>; + &kp D &to 1>; }; lower_layer { @@ -30,8 +20,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_sim.keymap b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap similarity index 100% rename from app/tests/toggle-layer/early-key-release/native_sim.keymap rename to app/tests/toggle-layer/early-key-release/native_posix_64.keymap 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/normal/native_sim.keymap b/app/tests/toggle-layer/normal/native_posix_64.keymap similarity index 100% rename from app/tests/toggle-layer/normal/native_sim.keymap rename to app/tests/toggle-layer/normal/native_posix_64.keymap diff --git a/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot b/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot index e7db477d..94b7b360 100644 --- a/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot +++ b/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot @@ -3,12 +3,12 @@ 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 +layer_changed: layer 1 state 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 +layer_changed: layer 1 state 0 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_posix_64.keymap similarity index 100% rename from app/tests/toggle-layer/toggle-mode-off/native_sim.keymap rename to app/tests/toggle-layer/toggle-mode-off/native_posix_64.keymap diff --git a/app/tests/toggle-layer/toggle-mode-on/native_sim.keymap b/app/tests/toggle-layer/toggle-mode-on/native_posix_64.keymap similarity index 100% rename from app/tests/toggle-layer/toggle-mode-on/native_sim.keymap rename to app/tests/toggle-layer/toggle-mode-on/native_posix_64.keymap 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/west.yml b/app/west.yml index 0d9d1e02..ce0785e3 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.5.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,13 @@ 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 + - name: nanopb + revision: 8c60555d6277a0360c876bd85d491fc4fb0cd74a + path: modules/lib/nanopb remote: zmkfirmware - name: zmk-studio-messages revision: 6cb4c283e76209d59c45fbcb218800cd19e9339d path: modules/msgs/zmk-studio-messages remote: zmkfirmware - group-filter: [+optional] self: west-commands: scripts/west-commands.yml diff --git a/docs/blog/2020-08-12-zmk-sotf-1.md b/docs/blog/2020-08-12-zmk-sotf-1.md index 9ea4038b..31c6ffc6 100644 --- a/docs/blog/2020-08-12-zmk-sotf-1.md +++ b/docs/blog/2020-08-12-zmk-sotf-1.md @@ -18,7 +18,7 @@ There's been lots of various activity in ZMK land! - 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. - 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`](/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/2022-04-10-zmk-sotf-5.md b/docs/blog/2022-04-10-zmk-sotf-5.md index e771f2e2..7abc2205 100644 --- a/docs/blog/2022-04-10-zmk-sotf-5.md +++ b/docs/blog/2022-04-10-zmk-sotf-5.md @@ -219,7 +219,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-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 more nuanced GH Actions automation for testing changes to ZMK. ## Coming Soon! diff --git a/docs/blog/2023-10-05-zmk-sotf-6.md b/docs/blog/2023-10-05-zmk-sotf-6.md index ba1bf63b..0e9f3768 100644 --- a/docs/blog/2023-10-05-zmk-sotf-6.md +++ b/docs/blog/2023-10-05-zmk-sotf-6.md @@ -104,7 +104,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/connection-issues#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). @@ -173,7 +173,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/hardware-integration/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 diff --git a/docs/blog/2024-01-05-zmk-tools.md b/docs/blog/2024-01-05-zmk-tools.md index f18ad30d..1104396d 100644 --- a/docs/blog/2024-01-05-zmk-tools.md +++ b/docs/blog/2024-01-05-zmk-tools.md @@ -19,7 +19,7 @@ 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. +[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](/docs/user-setup#user-config-setup-script), except without downloading a single thing. ### User Config Setup in Browser diff --git a/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx b/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx index d1bb7218..8c4cac43 100644 --- a/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx +++ b/docs/blog/2024-11-11-zmk-studio-mvp-ga.mdx @@ -225,7 +225,7 @@ return ( :::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. +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/development/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. 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/docs/config/battery.md b/docs/docs/config/battery.md index 0c3ba752..728cb8b2 100644 --- a/docs/docs/config/battery.md +++ b/docs/docs/config/battery.md @@ -41,7 +41,7 @@ Host support for multiple battery levels is undefined. It appears that in most o ### 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/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | ------------- | ---- | --------------------------------------------- | @@ -55,7 +55,7 @@ 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/3.5.0/build/dts/api/bindings/iio/afe/voltage-divider.html). ## nRF VDDH Battery Sensor diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index ce53ee99..e301dc96 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -154,29 +154,6 @@ You can use the following node to tweak the default 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. @@ -189,11 +166,10 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-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 | +| 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: @@ -201,29 +177,6 @@ You can use the following node to tweak the default 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) | - ## Macro Creates a custom behavior which triggers a sequence of other behaviors. @@ -403,8 +356,8 @@ 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. | | +| `x-input-code` | int | The [relative event code](https://github.com/zmkfirmware/zephyr/blob/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L245) for generated input events for the X-axis. | | +| `y-input-code` | int | The [relative event code](https://github.com/zmkfirmware/zephyr/blob/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L245) 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 | diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md index c9b8578c..83fb9ec0 100644 --- a/docs/docs/config/bluetooth.md +++ b/docs/docs/config/bluetooth.md @@ -16,4 +16,3 @@ See [Configuration Overview](index.md) for instructions on how to change these s | `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 | 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..0400b163 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -32,4 +32,4 @@ Each child node can have the following properties: | `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>` | diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index 2896b418..7f718953 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -53,21 +53,21 @@ 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/3.5.0/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/3.5.0/build/dts/api/bindings/display/solomon,ssd1306fb-i2c.html) +- [SSD1306 (spi)](https://docs.zephyrproject.org/3.5.0/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). +A full list of drivers provided by Zephyr can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/3.5.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) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | ----------------- | ---- | -------------------------------------------------------------------------------------------------------- | diff --git a/docs/docs/config/encoders.md b/docs/docs/config/encoders.md index 7f68a0e9..2052fc9d 100644 --- a/docs/docs/config/encoders.md +++ b/docs/docs/config/encoders.md @@ -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) diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index e81f65c3..d449f4dd 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -30,21 +30,21 @@ When using a [split keyboard](../features/split-keyboards.md), you can use a sin ZMK will search for config files in: -- [`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/boards/arm/` +- `/boards/arm/` +- `zmk-config/config/boards/arm/` (For backwards compatibility only, do not use.) -...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 and `` is the root directory of any [included module](../features/modules.mdx). 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 _in addition_ to [Zephyr board-defining files](https://docs.zephyrproject.org/3.5.0/hardware/porting/board_porting.html#create-your-board-directory): - `.conf` (Kconfig) - `.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/3.5.0/hardware/porting/board_porting.html#write-kconfig-files). ### Shield Folder @@ -57,14 +57,14 @@ When building with a shield, ZMK will search for config files in: ...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. -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 _in addition_ to [Zephyr shield-defining files](https://docs.zephyrproject.org/3.5.0/hardware/porting/shields.html#shield-porting-and-configuration): - `.conf` (Kconfig) - `.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/3.5.0/hardware/porting/shields.html) and [ZMK's new keyboard shield](../development/hardware-integration/new-shield.mdx) guide. ## Kconfig Files @@ -78,11 +78,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. +See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/3.5.0/build/kconfig/index.html) for more details on Kconfig files. :::tip @@ -112,9 +110,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: @@ -139,7 +135,7 @@ Devicetree files look like this: 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. +See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/3.5.0/build/dts/index.html) for more details on Devicetree files. :::tip @@ -166,7 +162,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/3.5.0/build/dts/intro-syntax-structure.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 +184,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/3.5.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. + +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/3.5.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/3.5.0/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/kscan.md b/docs/docs/config/kscan.md index 395342a2..6de0a4b1 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -25,7 +25,7 @@ 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/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | ---------------------- | ---- | ---------------------------------------------------------------------- | @@ -81,7 +81,7 @@ Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml]( | `toggle-mode` | bool | Use toggle switch mode | n | | `wakeup-source` | bool | Mark this kscan instance as able to wake the keyboard | 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)`: +Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](https://docs.zephyrproject.org/3.5.0/hardware/peripherals/gpio.html#api-reference) for the elements in `input-gpios` should be `(GPIO_ACTIVE_LOW | GPIO_PULL_UP)`: ```dts kscan0: kscan { @@ -151,7 +151,7 @@ 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.5.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 @@ -204,7 +204,7 @@ Define the transform with a [matrix transform](layout.md#matrix-transform). The 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)`. +The [GPIO flags](https://docs.zephyrproject.org/3.5.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 @@ -316,7 +316,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 diff --git a/docs/docs/config/layout.md b/docs/docs/config/layout.md index dafcb9cf..04fdf73b 100644 --- a/docs/docs/config/layout.md +++ b/docs/docs/config/layout.md @@ -11,7 +11,7 @@ Defines a mapping from keymap logical positions to physical [kscan](./kscan.md) 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. +See the [new shield guide](../development/hardware-integration/new-shield.mdx#matrix-transform) for more documentation on how to define a matrix transform. ### Devicetree @@ -174,7 +174,7 @@ Note that the entire addressable space does not need to be mapped. 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. +Read through the [page on physical layouts](../development/hardware-integration/physical-layouts.md) for more information. ### Devicetree @@ -211,7 +211,7 @@ The `key_physical_attrs` node is defined in [`dts/physical_layouts.dtsi`](https: ## 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. +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](../development/hardware-integration/physical-layouts.md) for more information. ### Devicetree 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 index 07388b07..8734c70d 100644 --- a/docs/docs/config/lighting.md +++ b/docs/docs/config/lighting.md @@ -7,7 +7,7 @@ See the [Lighting feature page](../features/lighting.md) for an overview of the ## 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 the [RGB underglow section](../features/lighting.md#rgb-underglow) in the Lighting feature page for more details, and [hardware integration page](../development/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. @@ -52,11 +52,11 @@ The `*_START` settings only determine the initial underglow state. Any changes y 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. +See the [RGB underglow hardware integration page](../development/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 the [backlight section](../features/lighting.md#backlight) in Lighting feature page for more details, and [hardware integration page](../development/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. @@ -79,7 +79,7 @@ The `*_START` settings only determine the initial backlight state. Any changes y ### 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/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | --------------- | ---- | -------------------------------------------- | @@ -87,7 +87,7 @@ Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intr 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) +- [gpio-leds](https://docs.zephyrproject.org/3.5.0/build/dts/api/bindings/led/gpio-leds.html) +- [pwm-leds](https://docs.zephyrproject.org/3.5.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. +See the [backlight hardware integration page](../development/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 index 63565e4a..a0e175d8 100644 --- a/docs/docs/config/pointing.md +++ b/docs/docs/config/pointing.md @@ -53,7 +53,7 @@ Additional properties can be set on child nodes, which allows changing the setti ## Input Split -Input splits are used for [pointing devices on split peripherals](../hardware-integration/pointing.mdx#listener-and-input-split-device). +Input splits are used for [pointing devices on split peripherals](../development/hardware-integration/pointing.mdx#listener-and-input-split-device). ### Devicetree 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 index 9aab0b02..d855e8ae 100644 --- a/docs/docs/config/split.md +++ b/docs/docs/config/split.md @@ -76,7 +76,7 @@ The following settings only apply when using wired split in polling mode: ### 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. +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](../development/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](../development/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: diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 1cf70a82..cae2b528 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -13,19 +13,13 @@ 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_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 | +| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | +| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | ### HID @@ -94,7 +88,7 @@ By default USB Boot protocol support is disabled, however certain situations suc ### 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/3.5.0/connectivity/bluetooth/bluetooth-arch.html) for more information on configuring Bluetooth. | Config | Type | Description | Default | @@ -133,12 +127,12 @@ 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. +[Snippets](https://docs.zephyrproject.org/3.5.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 +- board: nrfmicro_13_52833 snippet: nrf52833-nosd shield: corne_left ``` @@ -146,7 +140,7 @@ Enable snippets by adding `snippet: ` to your `build.yaml` for the appr 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 +west build -b nrfmicro_13_52833 -S nrf52833-nosd -- -DSHIELD=corne_left ``` ZMK implements the following system configuration snippets: diff --git a/docs/docs/customization.md b/docs/docs/customization.md index db7ea935..e35bb426 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -50,21 +50,21 @@ It is also possible to build firmware locally on your computer by following the 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). +More troubleshooting information for split keyboards can be found [here](troubleshooting/connection-issues.mdx#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.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: ```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/contributing/documentation.md b/docs/docs/development/contributing/documentation.md index 26ba14fe..5bca6303 100644 --- a/docs/docs/development/contributing/documentation.md +++ b/docs/docs/development/contributing/documentation.md @@ -11,8 +11,6 @@ This document outlines how to test your documentation changes locally and prepar 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 general process for updating the ZMK documentation is: 1. Update the documentation @@ -20,6 +18,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 +52,15 @@ 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` +:::danger 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. +:::note +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 - prettier and lint are unfortunately unable to do this automatically. +::: ## Submitting a Pull Request 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/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/battery.md b/docs/docs/development/hardware-integration/battery.md similarity index 82% rename from docs/docs/hardware-integration/battery.md rename to docs/docs/development/hardware-integration/battery.md index 9b717baf..d3276069 100644 --- a/docs/docs/hardware-integration/battery.md +++ b/docs/docs/development/hardware-integration/battery.md @@ -3,7 +3,7 @@ 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). +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: @@ -11,7 +11,7 @@ To enable a battery sensor on a new board, add the driver for the sensor to your - `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. +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. diff --git a/docs/docs/hardware-integration/dongle.mdx b/docs/docs/development/hardware-integration/dongle.mdx similarity index 88% rename from docs/docs/hardware-integration/dongle.mdx rename to docs/docs/development/hardware-integration/dongle.mdx index 822b6248..776b698a 100644 --- a/docs/docs/hardware-integration/dongle.mdx +++ b/docs/docs/development/hardware-integration/dongle.mdx @@ -6,7 +6,7 @@ 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: +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: @@ -18,7 +18,7 @@ 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. +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: @@ -119,7 +119,7 @@ You will now need to find and copy your keyboard's matrix transform into the `my #### 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";`. +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 @@ -141,7 +141,7 @@ Make a note of the label that the transform has, it will be used later. In the e #### Physical layout -A full physical layout is necessary to allow your dongle to be used with [ZMK Studio](../features/studio.md). +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. ; @@ -281,7 +281,7 @@ Make sure that the `transform` property uses the same label as your matrix trans ## 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] +Add the appropriate lines to your `build.yml` 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: @@ -289,26 +289,26 @@ include: # Your other keyboard parts here # ----------------------------------------- # Change the board appropriately, you can use any board - - board: nice_nano + - board: nice_nano_v2 shield: my_keyboard_dongle - - board: nice_nano + - board: nice_nano_v2 shield: settings_reset # Add these cmake-args to the peripherals you wish to use with the dongle - - board: nice_nano + - board: nice_nano_v2 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. +You can then flash the firmware to your device as detailed in our [user setup](../../user-setup.mdx#installing-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. +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. +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). +[^2]: If you are building locally, you can append these flags to the end of the [build command](../local-toolchain/build-flash.mdx#cmake-arguments). diff --git a/docs/docs/hardware-integration/encoders.md b/docs/docs/development/hardware-integration/encoders.md similarity index 89% rename from docs/docs/hardware-integration/encoders.md rename to docs/docs/development/hardware-integration/encoders.md index 4a9ea85f..16b489d1 100644 --- a/docs/docs/hardware-integration/encoders.md +++ b/docs/docs/development/hardware-integration/encoders.md @@ -18,12 +18,12 @@ In your configuration file you will need to add the following lines so that the 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. +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: +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 { @@ -53,7 +53,7 @@ Once you have defined the encoder sensors, you will have to add them to the list 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. +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: @@ -73,4 +73,4 @@ Add the following line to your keymap file to add default encoder behavior bindi 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. +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/hardware-metadata-files.md b/docs/docs/development/hardware-integration/hardware-metadata-files.md similarity index 98% rename from docs/docs/hardware-integration/hardware-metadata-files.md rename to docs/docs/development/hardware-integration/hardware-metadata-files.md index 62fdb348..13f51b55 100644 --- a/docs/docs/hardware-integration/hardware-metadata-files.md +++ b/docs/docs/development/hardware-integration/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,7 @@ 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). +- `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/hardware-integration/includes/_gpio-key-direct.md b/docs/docs/development/hardware-integration/includes/_gpio-key-direct.md similarity index 100% rename from docs/docs/hardware-integration/includes/_gpio-key-direct.md rename to docs/docs/development/hardware-integration/includes/_gpio-key-direct.md diff --git a/docs/docs/hardware-integration/includes/_gpio-key-matrix.md b/docs/docs/development/hardware-integration/includes/_gpio-key-matrix.md similarity index 100% rename from docs/docs/hardware-integration/includes/_gpio-key-matrix.md rename to docs/docs/development/hardware-integration/includes/_gpio-key-matrix.md diff --git a/docs/docs/hardware-integration/includes/_gpio-key-wakeup.md b/docs/docs/development/hardware-integration/includes/_gpio-key-wakeup.md similarity index 100% rename from docs/docs/hardware-integration/includes/_gpio-key-wakeup.md rename to docs/docs/development/hardware-integration/includes/_gpio-key-wakeup.md diff --git a/docs/docs/hardware-integration/includes/_sideband-direct.md b/docs/docs/development/hardware-integration/includes/_sideband-direct.md similarity index 64% rename from docs/docs/hardware-integration/includes/_sideband-direct.md rename to docs/docs/development/hardware-integration/includes/_sideband-direct.md index e224a584..f59673fd 100644 --- a/docs/docs/hardware-integration/includes/_sideband-direct.md +++ b/docs/docs/development/hardware-integration/includes/_sideband-direct.md @@ -1,8 +1,8 @@ ### 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. +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": +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 / { @@ -34,4 +34,4 @@ With that in place, the kscan sideband behavior will wrap the new driver: }; ``` -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). +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/development/hardware-integration/includes/_sideband-matrix.md similarity index 89% rename from docs/docs/hardware-integration/includes/_sideband-matrix.md rename to docs/docs/development/hardware-integration/includes/_sideband-matrix.md index c6de0f41..2d727801 100644 --- a/docs/docs/hardware-integration/includes/_sideband-matrix.md +++ b/docs/docs/development/hardware-integration/includes/_sideband-matrix.md @@ -1,6 +1,6 @@ ### 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. +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: @@ -63,4 +63,4 @@ With that in place, you would decorate the kscan driver: }; ``` -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). +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/development/hardware-integration/includes/_sideband-wakeup-direct.md similarity index 67% rename from docs/docs/hardware-integration/includes/_sideband-wakeup-direct.md rename to docs/docs/development/hardware-integration/includes/_sideband-wakeup-direct.md index dc389726..a3b8d565 100644 --- a/docs/docs/hardware-integration/includes/_sideband-wakeup-direct.md +++ b/docs/docs/development/hardware-integration/includes/_sideband-wakeup-direct.md @@ -1,6 +1,6 @@ ### 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": +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 / { @@ -25,4 +25,4 @@ The kscan sideband behavior needs to wrap the new driver to enable it: }; ``` -The properties of the `kscan-sideband-behaviors` node can be found in the [appropriate configuration section](../../config/kscan.md#kscan-sideband-behavior-driver). +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/development/hardware-integration/includes/_soft-off-behavior.md similarity index 69% rename from docs/docs/hardware-integration/includes/_soft-off-behavior.md rename to docs/docs/development/hardware-integration/includes/_soft-off-behavior.md index 9f9ac021..9967f398 100644 --- a/docs/docs/hardware-integration/includes/_soft-off-behavior.md +++ b/docs/docs/development/hardware-integration/includes/_soft-off-behavior.md @@ -1,6 +1,6 @@ ### 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: +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 / { diff --git a/docs/docs/hardware-integration/includes/_soft-off-waker.md b/docs/docs/development/hardware-integration/includes/_soft-off-waker.md similarity index 88% rename from docs/docs/hardware-integration/includes/_soft-off-waker.md rename to docs/docs/development/hardware-integration/includes/_soft-off-waker.md index d6349b46..88b830e3 100644 --- a/docs/docs/hardware-integration/includes/_soft-off-waker.md +++ b/docs/docs/development/hardware-integration/includes/_soft-off-waker.md @@ -13,5 +13,5 @@ We need to add another device which will be enabled only when the keyboard is go }; ``` -The properties for the `gpio-key-wakeup-trigger` node can be found in the [appropriate configuration section](../../config/power.md#gpio-key-wakeup-trigger). +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/development/hardware-integration/index.mdx similarity index 70% rename from docs/docs/hardware-integration/index.mdx rename to docs/docs/development/hardware-integration/index.mdx index 5c7ed01b..7222f5a7 100644 --- a/docs/docs/hardware-integration/index.mdx +++ b/docs/docs/development/hardware-integration/index.mdx @@ -12,10 +12,10 @@ Please see pages in the sidebar for guides and reference that describe different 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. + - 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. @@ -23,7 +23,7 @@ These core architectural elements are defined per-keyboard, and _where_ they are ## 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). +Also see the Zephyr documentation on [boards](https://docs.zephyrproject.org/3.5.0/glossary.html#term-board) and [shields](https://docs.zephyrproject.org/3.5.0/hardware/porting/shields.html). ### What is a "board"? @@ -41,7 +41,7 @@ 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". +["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. @@ -52,7 +52,7 @@ But each board comes with its own features (MCU, flash, BLE, etc.) which must al 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. +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 @@ -67,51 +67,50 @@ values={[ -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. +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/arm/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): +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/arm/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.board ├── 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): +These files include [base Kconfig files](https://docs.zephyrproject.org/3.5.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.board` file that defines the toplevel [Kconfig](https://docs.zephyrproject.org/3.5.0/build/kconfig/index.html) items 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`](../config/system.md#general) to a value, for the product name to be used for USB/BLE info + - Setting [`ZMK_KEYBOARD_NAME`](../../config/system.md#general) to a value, for the product name to be used for USB/BLE info, + - Setting [`ZMK_USB`](../../config/system.md#usb) and/or [`ZMK_BLE`](../../config/system.md#bluetooth) for the default values for which HID transport(s) to enable by default -[Configuration files](../config/index.md#kconfig-files) that set the visible Kconfig symbols: +[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. + These are mostly SoC settings around the specific hardware configuration. -[Devicetree files](../config/index.md#devicetree-files): +[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 [chosen](https://docs.zephyrproject.org/3.5.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. +See Zephyr's [board porting guide](https://docs.zephyrproject.org/3.5.0/hardware/porting/board_porting.html) for information on creating a new board. +Also see the [new keyboard shield guide](new-shield.mdx#shield-overlays) for information on parts of the devicetree specifically related to ZMK. [^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. @@ -120,11 +119,11 @@ See also our [new board guide](new-board.md) for information on creating a ZMK-c -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. +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): +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): ``` @@ -140,11 +139,11 @@ 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): +[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. + - Kscan, matrix transform and physical layout devicetree nodes as described above, where the kscan node uses the interconnect [nexus node](https://docs.zephyrproject.org/3.5.0/hardware/porting/shields.html#gpio-nexus-nodes) aliases such as `&pro_micro` for GPIO pins. + - A [chosen](https://docs.zephyrproject.org/3.5.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: diff --git a/docs/docs/hardware-integration/lighting/backlight.mdx b/docs/docs/development/hardware-integration/lighting/backlight.mdx similarity index 98% rename from docs/docs/hardware-integration/lighting/backlight.mdx rename to docs/docs/development/hardware-integration/lighting/backlight.mdx index 8b484d08..f7b221da 100644 --- a/docs/docs/hardware-integration/lighting/backlight.mdx +++ b/docs/docs/development/hardware-integration/lighting/backlight.mdx @@ -7,7 +7,7 @@ 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. +Please see [lighting feature page](../../../features/lighting.md#backlight) for an introduction on the feature. .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. +For example: the `kyria` shield has a [`boards/nice_nano_v2.overlay`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/boards/nice_nano_v2.overlay) and a [`boards/nrfmicro_13.overlay`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/boards/nrfmicro_13.overlay), which configure a WS2812 LED strip for the `nice_nano_v2` and `nrfmicro_13` boards respectively. ### nRF52-Based Boards -Using an SPI-based LED strip driver on the `&spi3` interface is the simplest option for nRF52-based boards. +Using an SPI-based LED strip driver on the `&spi3` interface is the simplest option for nRF52-based boards. 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. :::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 list of low frequency I/O pins for the nRF52840 can be found [here](https://docs.nordicsemi.com/bundle/ps_nrf52840/page/pin.html). + ::: The following example uses `P0.06` as the "Data In" pin of a WS2812-compatible LED strip: @@ -67,9 +69,13 @@ The following example uses `P0.06` as the "Data In" pin of a WS2812-compatible L }; ``` +:::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 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. diff --git a/docs/docs/hardware-integration/new-shield.mdx b/docs/docs/development/hardware-integration/new-shield.mdx similarity index 85% rename from docs/docs/hardware-integration/new-shield.mdx rename to docs/docs/development/hardware-integration/new-shield.mdx index de9eca55..1cbc079d 100644 --- a/docs/docs/hardware-integration/new-shield.mdx +++ b/docs/docs/development/hardware-integration/new-shield.mdx @@ -40,11 +40,15 @@ export const SplitInvisTabs = (props) => ( ); +:::danger +Before reading this section, it is **vital** that you read through our [clean room policy](../contributing/clean-room.md). +::: + 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 [ZMK module](../module-creation.md) to contain your shield. - Create a new shield directory. - Add the base Kconfig files. - Add the shield overlay file defining: @@ -54,19 +58,10 @@ The high level steps are: - 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). +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. -::: +It may be helpful to review the upstream [shields documentation](https://docs.zephyrproject.org/3.5.0/hardware/porting/shields.html#shields) to get a proper understanding of the underlying system before continuing. ## New ZMK Module Repository @@ -89,9 +84,9 @@ Follow these steps to create your new repository: 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. +See also the page on [module creation](../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 +We recommend that you take this moment to name your module according to our [convention](../module-creation.md), i.e. your `zephyr/module.yml` file should begin with ```yaml title="zephyr/module.yml" name: zmk-keyboard- @@ -108,10 +103,10 @@ 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. +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`. +There are two required [Kconfig](https://docs.zephyrproject.org/3.5.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`. @@ -208,7 +203,7 @@ 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. +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 @@ -231,7 +226,7 @@ Split keyboards can have multiple `.conf` files, one for each part. For example: 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`. +The shared configuration in `my_keyboard.conf` is only applied when you are building with a [`zmk-config` folder](../local-toolchain/build-flash.mdx#building-from-zmk-config-folder) and it is present at `config/my_keyboard.conf`. ::: @@ -246,7 +241,7 @@ 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). +- 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). @@ -280,7 +275,7 @@ To use GPIO pins that are not part of the interconnects as described above, you 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. +The [Keyboard Scan configuration documentation](../../config/kscan.md) has the full details on configuring the kscan driver. @@ -450,7 +445,7 @@ The matrix transform is also used to "correct" pin orderings into something that 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. +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 @@ -460,7 +455,7 @@ Physical layouts organize the matrix transform, kscan and optionally the physica -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: +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 / { @@ -478,7 +473,7 @@ These nodes should be placed in `my_keyboard.overlay` for unibody keyboards and -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. +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 @@ -501,7 +496,7 @@ Set the `chosen` node to a defined "default" physical layout. This should also b }; ``` -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. +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: @@ -524,7 +519,7 @@ If all of your physical layouts use the same `kscan` node under the hood, you ca 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"`: +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 / { @@ -535,7 +530,7 @@ If testing the experimental [wired split](../features/split-keyboards.md) suppor }; ``` -See the [wired split](../config/split.md#wired-split) configuration for more details. +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. @@ -573,8 +568,8 @@ Here is an example simple keymap for a 3x3 macropad, with only one layer: ``` 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. +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 @@ -604,12 +599,12 @@ 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). +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. +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). @@ -617,5 +612,5 @@ Next, [update the `build.yaml`](../customization.md#building-additional-keyboard ### 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). +Follow [our guide for getting set up](../local-toolchain/setup/index.md), then follow the [instructions for building and flashing locally](../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/development/hardware-integration/physical-layouts.md similarity index 89% rename from docs/docs/hardware-integration/physical-layouts.md rename to docs/docs/development/hardware-integration/physical-layouts.md index 60a29a8d..281b1c97 100644 --- a/docs/docs/hardware-integration/physical-layouts.md +++ b/docs/docs/development/hardware-integration/physical-layouts.md @@ -6,8 +6,8 @@ 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) +- 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`. @@ -35,11 +35,11 @@ Every physical layout needs a matrix transform, and optionally can also have a k }; ``` -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. +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. +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: @@ -62,7 +62,11 @@ A key description has the shape `<&key_physical_attrs w h x y r rx ry>` with the 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. +:::tip + +We recommend the use of [this tool](https://zmk-physical-layout-converter.streamlit.app/) 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 [this other tool](https://nickcoutsos.github.io/keymap-layout-tools/) 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 @@ -167,7 +171,7 @@ If necessary, you can also define multiple kscan instances. ### 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. +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 @@ -199,11 +203,15 @@ A child node is defined for every layout the keyboard can have. The `positions` 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. +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). +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. +:::tip + +We recommend the use of [this tool](https://zmk-layout-helper.netlify.app/), distinct from the previous two mentioned, for the purposes of writing a position map. + +::: #### Writing a position map @@ -249,7 +257,7 @@ Next write the child nodes for every other layout with respect to the reference. Consider the following macropad/numpad with two physical layouts: -![A 4x5 numpad/macropad](../assets/hardware-integration/numpad.svg) +![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: diff --git a/docs/docs/hardware-integration/pinctrl.mdx b/docs/docs/development/hardware-integration/pinctrl.mdx similarity index 97% rename from docs/docs/hardware-integration/pinctrl.mdx rename to docs/docs/development/hardware-integration/pinctrl.mdx index 67dec613..7c61f50d 100644 --- a/docs/docs/hardware-integration/pinctrl.mdx +++ b/docs/docs/development/hardware-integration/pinctrl.mdx @@ -8,11 +8,15 @@ 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. +:::info +This page exists to provide a guide to [Pin Control](https://docs.zephyrproject.org/3.5.0/hardware/pinctrl/index.html#pin-control) for ZMK users and designers. Refer to [Zephyr's page on Pin Control](https://docs.zephyrproject.org/3.5.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). +:::warning +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/3.5.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 @@ -23,14 +27,18 @@ Pin control is always defined for a _board_, never for a shield: ```plaintext boards/shields/sofle/ ├── boards/ - │ ├── nice_nano_nrf52840_zmk.overlay - │ ├── nrfmicro_nrf52840_zmk_1_3_0.overlay + │ ├── nice_nano.overlay + │ ├── nice_nano_v2.overlay + │ ├── nrfmicro_11.overlay + │ └── nrfmicro_13.overlay └── ``` Note that you will need to define a separate overlay _for each_ of the boards to be used with the shield. +:::info 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 @@ -102,7 +110,7 @@ All of your configuration will happen by adjusting the `pinctrl` node. Changes a 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. +Child nodes are (generally, there are [exceptions](https://docs.zephyrproject.org/3.5.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. ( -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/v3.5.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/v3.5.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`: +For example, if setting up an [SPI device](https://github.com/zmkfirmware/zephyr/blob/v3.5.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`: @@ -81,7 +81,7 @@ The specifics of the properties required to set for a given driver will vary; al ## 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. +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. @@ -246,7 +246,7 @@ Here we first include the shared file, and then enable the input listener that i 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). +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 @@ -263,8 +263,8 @@ As an example, you could enhance the listener defined in the previous section wi ## 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: +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/3.5.0/kconfig.html#CONFIG_SPI), [I2C](https://docs.zephyrproject.org/3.5.0/hardware/peripherals/i2c.html#configuration-options)) used by the pointing device: diff --git a/docs/docs/hardware-integration/shift-registers.md b/docs/docs/development/hardware-integration/shift-registers.md similarity index 93% rename from docs/docs/hardware-integration/shift-registers.md rename to docs/docs/development/hardware-integration/shift-registers.md index 4a5f02a9..f2bd9977 100644 --- a/docs/docs/hardware-integration/shift-registers.md +++ b/docs/docs/development/hardware-integration/shift-registers.md @@ -9,11 +9,13 @@ Shift registers are the recommended method of adding additional GPIO pins to MCU 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. ::: +:::tip 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. +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. @@ -23,7 +25,7 @@ You will want to make sure that the data and clock pins of the shift register ar 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) +![A fragment of a schematic featuring two shift registers daisy chained together.](../../assets/hardware-integration/shift-register-daisy.png) ## Configuration diff --git a/docs/docs/hardware-integration/soft-off-setup.mdx b/docs/docs/development/hardware-integration/soft-off-setup.mdx similarity index 89% rename from docs/docs/hardware-integration/soft-off-setup.mdx rename to docs/docs/development/hardware-integration/soft-off-setup.mdx index 8ca1cbd6..097595b1 100644 --- a/docs/docs/hardware-integration/soft-off-setup.mdx +++ b/docs/docs/development/hardware-integration/soft-off-setup.mdx @@ -16,7 +16,7 @@ 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. +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. @@ -68,14 +68,14 @@ Several items work together to make both triggering soft off properly, and setti ### 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. +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. +Zephyr's basic [GPIO Key](https://docs.zephyrproject.org/3.5.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. */} Keyboards with onboard MCU chips are simply treated as the - [board](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html) + [board](https://docs.zephyrproject.org/3.5.0/hardware/porting/board_porting.html) as far as Zephyr™ is concerned. Given the following: @@ -49,9 +49,9 @@ with an onboard MCU or one that uses an MCU board add-on. ZMK treats keyboards that take an MCU addon board as - [shields](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html), + [shields](https://docs.zephyrproject.org/3.5.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). + [board](https://docs.zephyrproject.org/3.5.0/hardware/porting/board_porting.html). Given the following: @@ -94,19 +94,19 @@ 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) +[`west config`](https://docs.zephyrproject.org/3.5.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 +west config build.cmake-args -- -DSHIELD=kyra_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" + -- "-DSHIELD=kyra_left -DZMK_CONFIG=/absolute/path/to/zmk-config" ``` ### Pristine Building @@ -114,7 +114,7 @@ west config build.cmake-args \ 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 +west build -p -b nice_nano_v2 -- -DSHIELD=kyria_left ``` ### Building For Split Keyboards @@ -126,13 +126,13 @@ For split keyboards, you will have to build and flash each side separately the f 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 +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 -- -DSHIELD=kyria_right +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. @@ -148,19 +148,19 @@ ZMK supports loading additional boards, shields, code, etc. from [external ZMK m 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" +west build -b nice_nano_v2 -- -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" +west build -b nice_nano_v2 -- -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) +can build using files from your [`zmk-config` folder](../../user-setup.mdx#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 labeled `config` within your `zmk-config` folder.** @@ -198,7 +198,7 @@ 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. +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.5.0/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/3.5.0/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/3.5.0/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/3.5.0/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/3.5.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. diff --git a/docs/docs/development/local-toolchain/posix-board.md b/docs/docs/development/local-toolchain/posix-board.md index 37a37076..5a809c02 100644 --- a/docs/docs/development/local-toolchain/posix-board.md +++ b/docs/docs/development/local-toolchain/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/setup/native.mdx b/docs/docs/development/local-toolchain/setup/native.mdx index 3c82a60e..822359f0 100644 --- a/docs/docs/development/local-toolchain/setup/native.mdx +++ b/docs/docs/development/local-toolchain/setup/native.mdx @@ -73,17 +73,13 @@ export const WinTermTabs = (props) => ( ## 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: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.5.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) +- [Select and Update OS](https://docs.zephyrproject.org/3.5.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.5.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. +Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/3.5.0/develop/getting_started/installation_linux.html) page may be of use for users of Linux distributions which are not based on Ubuntu. ::: ## 2. Source Code @@ -103,7 +99,7 @@ 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. +These steps are very similar to Zephyr's [Get Zephyr and install Python dependencies](https://docs.zephyrproject.org/3.5.0/develop/getting_started/index.html#get-zephyr-and-install-python-dependencies) instructions, but specialized for ZMK. ::: @@ -195,16 +191,22 @@ west update 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. +6. Export a [Zephyr CMake package](https://docs.zephyrproject.org/3.5.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`: +7. Install the additional dependencies found in Zephyr's `requirements-base.txt`: ```sh -west packages pip --install +pip install -r zephyr/scripts/requirements-base.txt +``` + +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies: + +```sh +pip install -r zephyr/scripts/requirements-extra.txt ``` @@ -284,7 +286,7 @@ west update 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. +3. Export a [Zephyr CMake package](https://docs.zephyrproject.org/3.5.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 @@ -293,29 +295,47 @@ west zephyr-export -4. Install the additional Zephyr dependencies using `west`: +4. Install the additional dependencies found in Zephyr's `requirements-base.txt`: ```sh -west packages pip --install +pip3 install --user -r zephyr/scripts/requirements-base.txt +``` + +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies: + +```sh +pip3 install -r zephyr/scripts/requirements-extra.txt ``` -4. Install the additional Zephyr dependencies using `west`: +4. Install the additional dependencies found in Zephyr's `requirements-base.txt`: ```sh -west packages pip --install +pip install -r zephyr/scripts/requirements-base.txt +``` + +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies: + +```sh +pip install -r zephyr/scripts/requirements-extra.txt ``` -4. Install the additional Zephyr dependencies using `west`: +4. Install the additional dependencies found in Zephyr's `requirements-base.txt`. ```sh -west packages pip --install +pip3 install -r zephyr/scripts/requirements-base.txt +``` + +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies: + +```sh +pip3 install -r zephyr/scripts/requirements-extra.txt ``` @@ -325,7 +345,7 @@ 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). +Return to Zephyr's Getting Started Guide and [Install Zephyr SDK](https://docs.zephyrproject.org/3.5.0/develop/getting_started/index.html#install-zephyr-sdk). ### OS-Specific Notes @@ -340,7 +360,7 @@ Return to Zephyr's Getting Started Guide and [Install Zephyr SDK](https://docs.z #### 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. +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.5.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: @@ -348,7 +368,7 @@ First, the cross compiler should be installed: 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: +Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/3.5.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 diff --git a/docs/docs/development/module-creation.md b/docs/docs/development/module-creation.md index f3d351d7..edbd96b6 100644 --- a/docs/docs/development/module-creation.md +++ b/docs/docs/development/module-creation.md @@ -10,9 +10,11 @@ sidebar_label: ZMK Module Creation - 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). +See also Zephyr's [page on modules](https://docs.zephyrproject.org/3.5.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. +:::tip +For open source hardware designs, it can be convenient to use [Git submodules](https://github.blog/open-source/git/working-with-submodules/) to have the ZMK module also be a Git submodule of the repository hosting the hardware design. +::: ## Module Setup @@ -69,13 +71,13 @@ Next, you need to define the options to build your module. These also go into `z - `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). + - `snippet_root` points to the parent directory of a `snippets` directory, which contains [snippets](https://docs.zephyrproject.org/3.5.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. +If `zephyr/module.yml` has anything listed under `depends`, then you should also define a [west manifest](https://docs.zephyrproject.org/3.5.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: @@ -124,22 +126,22 @@ The below table reminds of the purpose of each of these files and folders, if yo | `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) | +| `snippets/` | Folder for [snippets](https://docs.zephyrproject.org/3.5.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). +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 [here](https://github.com/zephyrproject-rtos/zephyr/blob/main/cmake/modules/extensions.cmake#L454) for the definition and some documentation in the comments, with an example [here](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: +- Keyboard: https://github.com/petejohanson/zmk-keyboards-katori +- Behavior: https://github.com/urob/zmk-leader-key +- Driver: https://github.com/petejohanson/cirque-input-module +- Feature: https://github.com/joelspadin/zmk-locales +- VFX: https://github.com/caksoylar/zmk-rgbled-widget diff --git a/docs/docs/development/new-behavior.mdx b/docs/docs/development/new-behavior.mdx index 9eb66581..321b62e2 100644 --- a/docs/docs/development/new-behavior.mdx +++ b/docs/docs/development/new-behavior.mdx @@ -12,517 +12,194 @@ Before reading this section, it is **vital** that you read through our [clean ro ## 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). +This document outlines how to develop a [behavior](../keymaps/behaviors/index.mdx) for ZMK and prepare the changes for a pull request. -:::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 +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](../keymaps/index.mdx) 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 a new behavior repository](#creating-a-new-behavior-repository) -1. [Develop the behavior functionality](#developing-the-behavior-functionality) +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. [Provide licensing information](#licensing-information) +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/4.1.0/build/dts/api/api.html) -- [Zephyr Device Driver Model](https://docs.zephyrproject.org/4.1.0/kernel/drivers/index.html) +- [Zephyr Devicetree API](https://docs.zephyrproject.org/3.5.0/build/dts/api/api.html) +- [Zephyr Device Driver Model](https://docs.zephyrproject.org/3.5.0/kernel/drivers/index.html) ::: -## Creating a new Behavior Repository +## Creating the Behavior -### Initializing a new Behavior Module +### Creating the Devicetree Binding (`.yaml`) -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). +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: -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" +```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: Mod Morph Behavior +description: Hold or Tap behavior // highlight-next-line -compatible: "zmk,behavior-mod-morph" +compatible: "zmk,behavior-hold-tap" // highlight-next-line -include: zero_param.yaml # Additional parameters +include: two_param.yaml // highlight-next-line properties: bindings: - type: phandle-array + type: phandles required: true - mods: + tapping-term-ms: type: int - required: true - keep-mods: + 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: [] ``` -It can be seen that the `.yaml` files used for new behaviors' devicetree bindings consist of the following fields: +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 `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. +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 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). +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`. -In the example above, `zmk,behavior-mod-morph.yaml` lists `compatible: "zmk,behavior-mod-morph"`. +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` additional parameters +#### `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. - -| `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. -::: +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. -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). +These are additional variables required to configure a particular instance of a behavior. `properties` can be of the following types: -### Behavior Source Files (`.c`) +- `path` +- `compound` +- `array` +- `string` +- `string-array` +- `boolean` +- `int` +- `uint8-array` +- `phandle`. +- `phandle-array` +- `phandles` -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. +:::info +For more information on additional `properties`, refer to [Zephyr's documentation on Devicetree bindings](https://docs.zephyrproject.org/3.5.0/build/dts/bindings-syntax.html#properties). +::: -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. +### Creating the Driver (`.c`) -The code templates below show the differences between these categories, along with the essential components of a behavior source file. +:::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/3.5.0/build/dts/api/api.html) +- [Zephyr Device Driver Model](https://docs.zephyrproject.org/3.5.0/kernel/drivers/index.html) -```c title="src/behaviors/behavior_.c" -/* - * Copyright (c) XXXX The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +::: -#define DT_DRV_COMPAT zmk_behavior_ +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 - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#include #include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + #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-Unique Data Struct (Optional) +struct behavior__data { + bool example_data_param1; + bool example_data_param2; + bool example_data_param3; }; -// Instance-specific Config struct (Optional) -struct behavior__config { - bool config_param1; - bool config_param2; - bool config_param3; +// Instance-Unique Config Struct (Optional) +struct behavior__config { + bool example_config_param1; + bool example_config_param2; + bool example_config_param3; }; // Initialization Function (Optional) -static int _init(const struct device *dev) { +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; -} +// API Structure +static const struct behavior_driver_api _driver_api = { -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 +BEHAVIOR_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 (Both Optional) + &_data, &_config, // Behavior Data Pointer, Behavior Configuration Pointer (Both Optional) + POST_KERNEL, 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`) -```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 +#### 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)). +- `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/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_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`) @@ -530,12 +207,107 @@ The dependencies required for any ZMK behavior are: 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 +##### ZMK event manager -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. +Including `zmk/event_manager.h` is required for the following dependencies to function properly. -You can see a few examples of how the metadata is implemented in practice for the following behaviors: +- `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`). + +#### `BEHAVIOR_DT_INST_DEFINE` + +`BEHAVIOR_DT_INST_DEFINE` is a special ZMK macro. It forwards all the parameters to Zephyr's `DEVICE_DT_INST_DEFINE` macro to define the driver instance, then it adds the driver to a list of ZMK behaviors so they can be found by `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/3.5.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](#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 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: + +##### Initialization function (optional) + +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). +- `.parameter_metadata`: Defined in ``. Pointer to metadata describing the parameters to use with the behavior so the behavior may be used with [ZMK Studio](../features/studio.md). +- `.get_parameter_metadata`: Defined in ``. 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). +- `.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](../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`. + ::: + +##### 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: - [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) @@ -543,12 +315,10 @@ You can see a few examples of how the metadata is implemented in practice for th 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. +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 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: +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 @@ -638,207 +408,135 @@ static const struct behavior_driver_api behavior_bt_driver_api = { }; ``` -### ZMK API struct +##### Data pointers (optional) -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: +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; +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. +The fourth cell of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific data is not required. -#### Optional: Configuration pointers +##### 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/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` +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/3.5.0/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](#behavior_dt_inst_define) and the [`properties` of the hold-tap devicetree binding](#creating-the-devicetree-binding-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. +The fifth cell of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific configurations are not required. -### Keycodes +:::warning +Remember that `.c` files should be formatted according to `clang-format` to ensure that checks run smoothly once the pull request is submitted. +::: -Let us examine one of the simplest behavior actions: sending and releasing keycodes. +### Updating `app/CmakeLists.txt` to Include the New Driver -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. +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. -```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); -} +```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() +``` -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); -} +For behaviors that do not require [central locality](../features/split-keyboards.md#behaviors-with-locality), the following options for updating `app/CMakeLists.txt` also exist: -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) +- 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"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; + mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; + }; + }; }; ``` -### Layers +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 label and name of the behavior, as seen in line 11 of the `gresc` example. -All functions that interact with layers can be found in `keymap.h`. +:::warning -Layers can be identified in two ways: an "order-independent" `zmk_keymap_layer_id_t`, and an "order-dependent" `zmk_keymap_layer_index_t`. +If your behavior has its [`locality`](#api-structure) property set to anything other than `BEHAVIOR_LOCALITY_CENTRAL`, then the name of the node must be at most 8 characters long, or it will fail to be invoked on the peripheral half of a split keyboard. -| 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. | +In the above example, `grave_escape` is too long, so it would need to be shortened, e.g. -### ZMK Events +```dts +// Behavior can be invoked on peripherals, so name must be <= 8 characters. +/omit-if-no-ref/ gresc: gresc { ... }; +``` -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 +After creating the `.dtsi` from above, update `app/dts/behaviors.dtsi` to include your newly predefined behavior instance, making it accessible by the devicetree. -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. | +```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 `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. +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. @@ -856,52 +554,24 @@ Zephyr currently does not support logging over Bluetooth, so any use of the seri 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? +- 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. - 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. +Consider also including visual aids alongside written documentation if it adds clarity. :::info -If submitting a pull request, see [Documentation](contributing/documentation.md) for more information on writing, testing, and formatting ZMK documentation. +See [Documentation](contributing/documentation.md) for more information on writing, testing, and formatting ZMK documentation. ::: -## Licensing Information +## Submitting a Pull Request -:::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. +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. @@ -929,15 +599,6 @@ values={[ :::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. +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/usb-logging.mdx b/docs/docs/development/usb-logging.mdx index 5a9fc868..45c54ad0 100644 --- a/docs/docs/development/usb-logging.mdx +++ b/docs/docs/development/usb-logging.mdx @@ -28,7 +28,7 @@ requires adding a `snippet: zmk-usb-logging` to your `build.yaml` file for any b ```yaml --- include: - - board: nice_nano + - board: nice_nano_v2 shield: corne_left snippet: zmk-usb-logging ``` @@ -36,12 +36,12 @@ include: 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" +west build -b nice_nano_v2 -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). +Logging can be further configured using Kconfig described in [the Zephyr documentation](https://docs.zephyrproject.org/3.5.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. @@ -68,7 +68,7 @@ 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. +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) @@ -86,13 +86,7 @@ You can connect to the device with [tio](https://tio.github.io/) (can be install 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. +You should see tio printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable. @@ -103,7 +97,7 @@ From there, you should see the various log messages from ZMK and Zephyr, dependi 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. +To do so, you need to follow the upstream Zephyr [`cdc-acm-console` snippet requirements](https://docs.zephyrproject.org/3.5.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. diff --git a/docs/docs/faq.md b/docs/docs/faq.md index fa9fcea5..da34f58b 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/3.5.0/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/3.5.0/build/dts/index.html) and [Kconfig](https://docs.zephyrproject.org/3.5.0/build/kconfig/index.html). +- A BLE stack that periodically obtains [qualification](https://docs.zephyrproject.org/3.5.0/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/3.5.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._ ### Does ZMK compile for AVR? @@ -51,7 +51,7 @@ ZMK is still in its infancy, so there’s a learning curve involved. But if you 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. +Please see the [explainer on boards & shields](development/hardware-integration/index.mdx#boards--shields) for more details. ### Does ZMK support wired split? @@ -63,7 +63,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, it is possible to [create a dongle](development/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. ### What bootloader does ZMK use? diff --git a/docs/docs/features/battery.md b/docs/docs/features/battery.md index 1a34c02f..4d77d805 100644 --- a/docs/docs/features/battery.md +++ b/docs/docs/features/battery.md @@ -16,4 +16,4 @@ 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. +If you are using a custom board, see [battery sensing hardware integration page](../development/hardware-integration/battery.md) to add support. diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 5b128556..267f2e3d 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -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 [Hardware Integration page for encoders](../development/hardware-integration/encoders.md) for instructions on adding them to your keyboard. 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 index 2276488e..3d64b870 100644 --- a/docs/docs/features/lighting.md +++ b/docs/docs/features/lighting.md @@ -11,7 +11,7 @@ Your keyboard likely uses only one type, depending on the type of LED hardware i - [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 +:::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, as described above. @@ -42,11 +42,13 @@ 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. +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](../config/index.md) for more instructions on how to use Kconfig. @@ -73,7 +75,7 @@ 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. +See [RGB underglow hardware integration page](../development/hardware-integration/lighting/underglow.md) on adding underglow support to a ZMK keyboard. ## Backlight @@ -100,4 +102,4 @@ 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. +See [backlight hardware integration page](../development/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 index d428d0eb..4818ecd3 100644 --- a/docs/docs/features/low-power-states.md +++ b/docs/docs/features/low-power-states.md @@ -44,9 +44,13 @@ It is recommended to add the `wakeup-source` property to `kscan` devices even if 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 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. + +:::note + 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: @@ -74,4 +78,4 @@ You can then wake up the keyboard by pressing the reset button once, and repeati ### Adding Soft Off to a Keyboard -Please refer to the [corresponding page under hardware integration](../hardware-integration/soft-off-setup.mdx) for details. +Please refer to the [corresponding page under hardware integration](../development/hardware-integration/soft-off-setup.mdx) for details. diff --git a/docs/docs/features/modules.mdx b/docs/docs/features/modules.mdx index 898c294b..83fbd9bf 100644 --- a/docs/docs/features/modules.mdx +++ b/docs/docs/features/modules.mdx @@ -6,7 +6,7 @@ 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: +ZMK makes use of [Zephyr modules](https://docs.zephyrproject.org/3.5.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 @@ -27,11 +27,11 @@ The shift to using modules for keyboards is a relatively recent one, and not all 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). +1. Find the URL base (the parent URL) for the module and add it as an entry to the [remotes](https://docs.zephyrproject.org/3.5.0/develop/west/manifest.html#remotes). +2. Add the module as an entry to the [projects](https://docs.zephyrproject.org/3.5.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). +For more information on `west.yml`, see [West Manifests](https://docs.zephyrproject.org/3.5.0/develop/west/manifest.html). #### Examples diff --git a/docs/docs/features/pointing.md b/docs/docs/features/pointing.md index 92772722..b22485ab 100644 --- a/docs/docs/features/pointing.md +++ b/docs/docs/features/pointing.md @@ -24,7 +24,7 @@ See the [mouse emulation behaviors](../keymaps/behaviors/mouse-emulation.md) for 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. +For more information, refer to the [pointer hardware integration](../development/hardware-integration/pointing.mdx) documentation. ## Input Processors diff --git a/docs/docs/features/split-keyboards.md b/docs/docs/features/split-keyboards.md index 1f3e6675..c10c305b 100644 --- a/docs/docs/features/split-keyboards.md +++ b/docs/docs/features/split-keyboards.md @@ -8,7 +8,7 @@ ZMK supports setups where a keyboard is split into two or more physical parts (a ## 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 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](../development/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. @@ -23,7 +23,7 @@ You can refer to the [power profiler](/power-profiler) to see battery life estim ### 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. +The [new shield guide](../development/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. @@ -44,7 +44,7 @@ Many popular cables, in particular, TRRS/TRS cables, can cause irreparable damag ### 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. +[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](../development/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. @@ -87,7 +87,7 @@ Similar to how [bluetooth profiles](bluetooth.md) are managed between the keyboa 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. +For this, please follow [the specified procedure](../troubleshooting/connection-issues.mdx#split-keyboard-halves-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. diff --git a/docs/docs/features/studio.md b/docs/docs/features/studio.md index 19760245..8b955644 100644 --- a/docs/docs/features/studio.md +++ b/docs/docs/features/studio.md @@ -6,7 +6,7 @@ ZMK Studio provides runtime update functionality to ZMK powered devices, allowin :::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. +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 [here](/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. ::: @@ -54,7 +54,7 @@ Generally, if you intend to use ZMK Studio, then you should not make any further ## Accessing ZMK Studio -You can use ZMK Studio with Chrome/Edge at . +You can use ZMK Studio with Chrome/Edge at https://zmk.studio/. To use the native app for Linux, macOS, or Windows, visit the [download page](https://zmk.studio/download). @@ -87,11 +87,11 @@ For a split keyboard, you should do this _only_ for your central/left side, e.g. ```yaml title="build.yaml" --- include: - - board: nice_nano + - board: nice_nano_v2 shield: corne_left snippet: studio-rpc-usb-uart cmake-args: -DCONFIG_ZMK_STUDIO=y - - board: nice_nano + - board: nice_nano_v2 shield: corne_right ``` @@ -100,7 +100,7 @@ include: 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 \ +west build -d build/cl_studio -b nice_nano_v2 \ -S studio-rpc-usb-uart -- -DSHIELD=corne_left -DCONFIG_ZMK_STUDIO=y ``` @@ -172,12 +172,12 @@ The reserved layers will be ignored during regular ZMK builds but will become av 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 [dedicated page on physical layouts](../development/hardware-integration/physical-layouts.md), informing you how to define one +- The [new shield guide](../development/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). +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/3.5.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). +Finally, once you have successfully built and tested firmware with ZMK Studio enabled, add the `studio` flag to your keyboard's [metadata](../development/hardware-integration/hardware-metadata-files#features). 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/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/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.mdx b/docs/docs/hardware.mdx index 770ef2eb..75209923 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,35 +28,20 @@ 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 specific [boards / shields](development/hardware-integration/index.mdx#boards--shields) that have been implemented and tested by the ZMK contributors, listed below. @@ -61,6 +51,7 @@ Zephyr boards come with minimal configuration. ZMK board variants add the necess 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. -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. +{/* prettier-ignore */} +Contributing + +If you'd like to add support for a new keyboard shield, head over to the [New Keyboard Shield](development/hardware-integration/new-shield.mdx) documentation and note the [clean room design requirements](development/contributing/clean-room.md). diff --git a/docs/docs/intro.mdx b/docs/docs/intro.mdx index f73e5b69..714d2bf3 100644 --- a/docs/docs/intro.mdx +++ b/docs/docs/intro.mdx @@ -40,7 +40,7 @@ Below table lists major features/capabilities currently supported in ZMK, as wel | [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 a Wide Range of 32-bit Microcontrollers](https://docs.zephyrproject.org/3.5.0/boards/index.html) | ✅ | | Support for AVR/8-bit Chips | ❌ | 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/backlight.md b/docs/docs/keymaps/behaviors/backlight.md index c65b03ef..6dbb6e7b 100644 --- a/docs/docs/keymaps/behaviors/backlight.md +++ b/docs/docs/keymaps/behaviors/backlight.md @@ -37,7 +37,7 @@ Here is a table describing the action for each define: - 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. +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/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. ::: diff --git a/docs/docs/keymaps/behaviors/bluetooth.md b/docs/docs/keymaps/behaviors/bluetooth.md index 44e38d30..93d08428 100644 --- a/docs/docs/keymaps/behaviors/bluetooth.md +++ b/docs/docs/keymaps/behaviors/bluetooth.md @@ -48,7 +48,7 @@ Here is a table describing the command for each define: | `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`. | :::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. +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. ::: diff --git a/docs/docs/keymaps/behaviors/hold-tap.mdx b/docs/docs/keymaps/behaviors/hold-tap.mdx index c4d27d9d..755230a2 100644 --- a/docs/docs/keymaps/behaviors/hold-tap.mdx +++ b/docs/docs/keymaps/behaviors/hold-tap.mdx @@ -66,7 +66,7 @@ By default, layer-tap is configured with the ["tap-preferred" `flavor`](#interru Example: ```dts -< 1 A +< 3 SPACE ``` ### Configuration @@ -146,7 +146,7 @@ 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: +Below is an example of a left hand behavior: ```dts / { @@ -185,7 +185,7 @@ Below is a brief overview of the options set. 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. +- [Positional hold taps](#positional-hold-tap-and-hold-trigger-key-positions) with [`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. @@ -208,8 +208,8 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr as: auto_shift { compatible = "zmk,behavior-hold-tap"; #binding-cells = <2>; - tapping-term-ms = <135>; - quick-tap-ms = <0>; + tapping_term_ms = <135>; + quick_tap_ms = <0>; flavor = "tap-preferred"; bindings = <&kp>, <&kp>; }; @@ -299,7 +299,7 @@ One workaround is to create a [macro](macros.md) that invokes those behaviors an 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: +This default interrupt flavor is called "hold-preferred". While this flavor may work well for a ctrl/escape key, but 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. @@ -312,7 +312,7 @@ When the hold-tap key is released and the hold behavior has not been triggered, #### Comparison to QMK -The `hold-preferred` flavor works similarly to the `HOLD_ON_OTHER_KEY_PRESS` setting in 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. ```dts @@ -333,10 +333,6 @@ By default this behavior is disabled. }; ``` -#### 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. @@ -372,10 +368,12 @@ Including `hold-trigger-key-positions` in your hold-tap definition turns on the 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. +:::info +`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. +::: +
The following example uses a hold-tap behavior definition configured with the `hold-preferred` flavor, and with positional hold-tap enabled: @@ -417,7 +415,7 @@ the hold-tap. For home-row mods, this is not always ideal, because it prevents c
#### `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. +If set, instead of the keys 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 { @@ -435,10 +433,6 @@ If enabled, the hold behavior will immediately be held on hold-tap press, and wi }; ``` -:::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. diff --git a/docs/docs/keymaps/behaviors/layers.md b/docs/docs/keymaps/behaviors/layers.md index 37b23e88..66501fcc 100644 --- a/docs/docs/keymaps/behaviors/layers.md +++ b/docs/docs/keymaps/behaviors/layers.md @@ -82,7 +82,6 @@ Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`: #binding-cells = <1>; display-name = "Toggle Layer On"; toggle-mode = "on"; - locking; }; }; }; @@ -90,14 +89,6 @@ Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`: 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. diff --git a/docs/docs/keymaps/behaviors/macros.md b/docs/docs/keymaps/behaviors/macros.md index 45780bfa..a06efaf3 100644 --- a/docs/docs/keymaps/behaviors/macros.md +++ b/docs/docs/keymaps/behaviors/macros.md @@ -312,6 +312,10 @@ 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 diff --git a/docs/docs/keymaps/behaviors/outputs.md b/docs/docs/keymaps/behaviors/outputs.md index 77090a17..20ce8a69 100644 --- a/docs/docs/keymaps/behaviors/outputs.md +++ b/docs/docs/keymaps/behaviors/outputs.md @@ -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 @@ -46,7 +45,7 @@ The output selection behavior changes the preferred output on press. - 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. +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. ::: diff --git a/docs/docs/keymaps/behaviors/power.md b/docs/docs/keymaps/behaviors/power.md index f118d0ca..4c333080 100644 --- a/docs/docs/keymaps/behaviors/power.md +++ b/docs/docs/keymaps/behaviors/power.md @@ -44,11 +44,11 @@ Here is a table describing the command for each define: - 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. +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 diff --git a/docs/docs/keymaps/behaviors/sticky-key.md b/docs/docs/keymaps/behaviors/sticky-key.md index b71bf3e4..2f3be905 100644 --- a/docs/docs/keymaps/behaviors/sticky-key.md +++ b/docs/docs/keymaps/behaviors/sticky-key.md @@ -38,7 +38,7 @@ Some typists may find that using a sticky shift key interspersed with rapid typi 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. +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 wrappping 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` diff --git a/docs/docs/keymaps/behaviors/underglow.md b/docs/docs/keymaps/behaviors/underglow.md index 245c6858..ecffca75 100644 --- a/docs/docs/keymaps/behaviors/underglow.md +++ b/docs/docs/keymaps/behaviors/underglow.md @@ -56,7 +56,7 @@ 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. +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/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. ::: diff --git a/docs/docs/keymaps/input-processors/behaviors.md b/docs/docs/keymaps/input-processors/behaviors.md index 032774c7..a6244ed3 100644 --- a/docs/docs/keymaps/input-processors/behaviors.md +++ b/docs/docs/keymaps/input-processors/behaviors.md @@ -7,8 +7,12 @@ sidebar_label: Behaviors 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. +:::note + 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. ::: @@ -72,6 +76,6 @@ The behaviors input processor uses a `compatible` property of `"zmk,input-proces ### 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. +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v3.5.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/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L180). 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 index 05e0bc84..62201ab4 100644 --- a/docs/docs/keymaps/input-processors/code-mapper.md +++ b/docs/docs/keymaps/input-processors/code-mapper.md @@ -59,5 +59,5 @@ The code mapper input processor uses a `compatible` property of `"zmk,input-proc ### 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. +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v3.5.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/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L245). 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/scaler.md b/docs/docs/keymaps/input-processors/scaler.md index 2d0a30cf..fe6c6714 100644 --- a/docs/docs/keymaps/input-processors/scaler.md +++ b/docs/docs/keymaps/input-processors/scaler.md @@ -73,5 +73,5 @@ The scaler input processor uses a `compatible` property of `"zmk,input-processor ### 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) +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v3.5.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/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L245) diff --git a/docs/docs/keymaps/input-processors/transformer.md b/docs/docs/keymaps/input-processors/transformer.md index 65feb920..1c4a531e 100644 --- a/docs/docs/keymaps/input-processors/transformer.md +++ b/docs/docs/keymaps/input-processors/transformer.md @@ -70,6 +70,6 @@ The transform input processor uses a `compatible` property of `"zmk,input-proces ### 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) +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v3.5.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/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L245) +- `y-codes` - The specific Y codes within the given type to transform, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v3.5.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L245) diff --git a/docs/docs/keymaps/list-of-keycodes.mdx b/docs/docs/keymaps/list-of-keycodes.mdx index 3ee88367..c62d5875 100644 --- a/docs/docs/keymaps/list-of-keycodes.mdx +++ b/docs/docs/keymaps/list-of-keycodes.mdx @@ -9,6 +9,11 @@ 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. +:::warning +Take extra notice of the spelling of the keycodes, especially the shorthand spelling. +Otherwise, it will result in an elusive parsing error! +::: + :::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), diff --git a/docs/docs/troubleshooting/building-issues.md b/docs/docs/troubleshooting/building-issues.md index ca53e9bf..13b861b1 100644 --- a/docs/docs/troubleshooting/building-issues.md +++ b/docs/docs/troubleshooting/building-issues.md @@ -7,7 +7,7 @@ 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). +For more information, see [Zephyr's CMake Package](https://docs.zephyrproject.org/3.5.0/build/zephyr_cmake_package.html). ## West Build Errors @@ -53,10 +53,12 @@ A `devicetree_generated.h` error that follows with an "undeclared here" string i 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](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`. +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 `SPACE` that should have been `&kp SPACE`. ::: ## Diagnosing Unexpected Build Results @@ -75,7 +77,7 @@ If you are building locally, this file can be found inside the build folder at ` 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 ++ west build -s zmk/app -d /tmp/tmp.8cJefinXCb -b corneish_zen_v2_left -- -DZMK_CONFIG=/tmp/zmk-config/config -DZMK_EXTRA_MODULES=/__w/zmk-config/zmk-config ... -- ZMK Config Kconfig: /tmp/zmk-config/config/corneish_zen.conf ... @@ -96,10 +98,9 @@ If you are building locally, this file can be found inside the build folder at ` 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 ++ west build -s zmk/app -d /tmp/tmp.8cJefinXCb -b corneish_zen_v2_left -- -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 BOARD.dts: /tmp/zmk-config/zmk/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts -- 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 index 83cdd478..6689885a 100644 --- a/docs/docs/troubleshooting/connection-issues.mdx +++ b/docs/docs/troubleshooting/connection-issues.mdx @@ -8,15 +8,14 @@ description: Troubleshooting wireless connection issues of ZMK devices. [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 Halves 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: +[Split keyboard](../features/split-keyboards.md) halves 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. +- Switching which halves are the central/peripheral. +- Replacing the controller for one of the halves. -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. +These issues can be resolved by flashing a settings reset firmware to both controllers. :::warning @@ -30,11 +29,11 @@ If you are using GitHub Actions to build your firmware as described in the [user ```yml include: - - board: nice_nano + - board: nice_nano_v2 shield: corne_left - - board: nice_nano + - board: nice_nano_v2 shield: corne_right - - board: nice_nano + - board: nice_nano_v2 shield: settings_reset ``` @@ -46,16 +45,16 @@ If you use a [local development environment](../development/local-toolchain/setu ### Reset Split Keyboard Procedure -Perform the following steps to reset **_all_** parts of your split keyboard: +Perform the following steps to reset **_both_** halves 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). +1. Put each half of the split keyboard into bootloader mode. +1. Flash one of the halves of the split with the settings reset firmware. +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). -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. +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. -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. +Once this is done, you can remove/forget the keyboard on each host device and pair it again. :::info @@ -77,7 +76,7 @@ For connectivity problems caused by hardware, please see [the appropriate sectio 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. +- Disabling PHY 2Mbps ([`CONFIG_BT_CTLR_PHY_2M=n`](https://docs.zephyrproject.org/3.5.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 @@ -95,7 +94,7 @@ 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. +Other microcontrollers may have similar configuration options [found in the Zephyr documentation](https://docs.zephyrproject.org/3.5.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 @@ -107,7 +106,7 @@ Some users may experience a poor connection between the keyboard and the host. T 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) +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/3.5.0/kconfig.html#CONFIG_BT_CTLR_TX_PWR) :::info This setting can also improve the connection strength between the keyboard halves for split keyboards. diff --git a/docs/docs/troubleshooting/hardware-issues.mdx b/docs/docs/troubleshooting/hardware-issues.mdx index fc234e7c..9890b6d0 100644 --- a/docs/docs/troubleshooting/hardware-issues.mdx +++ b/docs/docs/troubleshooting/hardware-issues.mdx @@ -70,7 +70,7 @@ include: # ------------------- # Your keyboards here # ------------------- - - board: nice_nano # Replace with the Pro Micro-compatible board you're using + - board: nice_nano_v2 # Replace with the Pro Micro-compatible board you're using shield: tester_pro_micro ``` @@ -89,7 +89,7 @@ include: # ------------------- # Your keyboards here # ------------------- - - board: xiao_ble # Replace with the Xiao-compatible board you're using + - board: seeeduino_xiao_ble # Replace with the Xiao-compatible board you're using shield: tester_xiao ``` @@ -175,7 +175,7 @@ Once you have done so, you will need to adjust the `kscan` of your keyboard slig }; ``` -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). +could have the pin `&pro_micro 6` (D6 in the [Pro Micro pinout](../development/hardware-integration/new-shield.mdx#shield-overlays)) replaced with `&gpio0 8` (P0.08 for nRF MCUs). ```dts title=".keymap" &kscan0 { diff --git a/docs/docs/zmk-cli.mdx b/docs/docs/user-setup-cli.mdx similarity index 51% rename from docs/docs/zmk-cli.mdx rename to docs/docs/user-setup-cli.mdx index 1e278d39..d486d763 100644 --- a/docs/docs/zmk-cli.mdx +++ b/docs/docs/user-setup-cli.mdx @@ -1,31 +1,167 @@ --- -title: ZMK CLI -sidebar_label: ZMK CLI +title: (EXPERIMENTAL) Installing ZMK +sidebar_label: (EXPERIMENTAL) Installing ZMK --- -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. +This is an **experimental** command line program to help set up ZMK. [Click here to return to the main documentation](user-setup.mdx). -See the [ZMK installation guide](user-setup.mdx#prerequisites) for instructions on installing ZMK CLI. +ZMK CLI walks you through installing ZMK and setting up a GitHub repository to store and build custom firmware. It also automates some common tasks such as adding new keyboards to your repository. -The instructions below contain commands that need to be run in a terminal program. On most operating systems, the program is simply named "Terminal". +The instructions below contain commands that need to be run in a terminal program. On Windows, use the [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) or PowerShell. On other operating systems, the terminal program is usually just named "Terminal". -On Windows, get [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) from the Microsoft Store if it isn't already installed. +:::info +If you use this program, any bug reports are highly appreciated. We are happy to help you fix your setup if you encounter a bug through the usage of this program. +::: -## Updating ZMK CLI +## Installation -To update to the latest version of ZMK, run the following command in a terminal: +### Preliminaries + +#### Make sure you have Git installed + +The below commands should print a version number if the program is installed. ```sh -uv tool upgrade zmk +git --version ``` +
+ I don't have Git installed. + +Install Git from https://git-scm.com/downloads. + +If you have Windows 11, you can instead open a terminal and run: + +```sh +winget install git.git +``` + +Re-open your terminal and test to make sure it is now installed. + +
+ +#### Make sure you have Python installed + +ZMK CLI requires Python 3.10 or newer. + +```sh +python3 --version +``` + +Note that some operating systems may use `python` in place of `python3`. + +
+ I don't have Python 3.10 or newer installed. + +##### On Windows and macOS + +Install the latest version of Python from https://www.python.org/downloads/. + +If you have Windows 11, you can instead open a terminal and run: + +```sh +winget install python3 +``` + +Re-open your terminal and test to make sure it is now installed. + +##### On Linux + +Install `python3` with your package manager. + +If the version is older than 3.10, you will need to find and install a package for a newer version of Python. On Ubuntu 20.04 and older, you can get Python 3.10 from the deadsnakes PPA with the following commands: + +```sh +sudo add-apt-repository ppa:deadsnakes/ppa +sudo apt install python3.10 +``` + +You will then need to replace `python3` with `python3.10` in the rest of the installation instructions. + +Re-open your terminal and test to make sure it is now installed. + +
+ +#### (Recommended) Make sure you have pipx installed + +ZMK CLI can be installed with pip, but using [pipx](https://github.com/pypa/pipx) is recommended to avoid conflicts between Python packages. + +```sh +pipx --version +``` + +
+ I don't have pipx installed. + +### On Windows and Linux + +Open a terminal and run: + +```sh +python3 -m pip install --user pipx +python3 -m pipx ensurepath +``` + +Some Linux distributions may disallow installing packages with pip. If this gives you an error, see the [install instructions](https://github.com/pypa/pipx?tab=readme-ov-file#on-linux) specific to your distribution. + +Re-open your terminal and test to make sure it is now installed. + +### On macOS + +Open Terminal and run: + +```sh +brew install pipx +pipx ensurepath +``` + +Re-open your terminal and test to make sure it is now installed. + +
+ +### Install ZMK CLI + +Run the following commands: + +```sh +pipx install zmk +zmk --help +``` + +It should print a help message if everything installed correctly. + +On Linux, you may get an error saying you need to install another package such as `python3.10-venv`. If so, follow the instructions in the error message, then try the above commands again. + ## 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. +:::warning +If you have already created a repo and cloned it to your computer, you do not need to run this command. Set the [user.home](#userhome) setting to point to the existing repo instead. +::: + +The `zmk init` command walks you through creating a GitHub repository, then clones it to your computer so you can edit it. + +Open a terminal and use the `cd` command to move to a directory where you'd like to place the ZMK files, 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, you can enter its URL when prompted, for example: + +``` +Repository URL: https://github.com/myusername/zmk-config +``` + +Otherwise, leave this first prompt blank and press Enter, and it will walk you through creating a new repo. + +Once you finish following all the instructions, 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. + +Now that you have a repo created, see the instructions below for how ZMK CLI can automate some common tasks, or see [Customizing ZMK](customization.md) for more hands-on customization information. ### Keyboard Management @@ -51,26 +187,19 @@ Run `zmk keyboard list` to print a list of supported keyboard hardware. 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. +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](development/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 +zmk module add # Add a module +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: diff --git a/docs/docs/user-setup.mdx b/docs/docs/user-setup.mdx index ba96b489..9fd33317 100644 --- a/docs/docs/user-setup.mdx +++ b/docs/docs/user-setup.mdx @@ -6,32 +6,14 @@ 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. - +:::info +ZMK currently has an **experimental** command line program set to replace the below steps. It is designed to automate a number of steps for you and be easier to use. Give it a try by following the instructions found [here](user-setup-cli.mdx). Feedback and bug reports are very much welcome. ::: ## Summary @@ -42,325 +24,185 @@ to build your firmware for you in the cloud, which you can then download and fla 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. +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 -You will need to install a few tools before you can get started. +The remainder of this guide assumes the following prerequisites: -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. +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 -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. +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. ::: -### Set Up a GitHub Account +## GitHub Repo -You will need a GitHub account. [Create an account](https://github.com/signup) if you don't have one yet. +Before running the setup script, you will first need to create a new GitHub repository to host the config. -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: +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" -#### Authenticate with GitHub CLI +## User Config Setup Script -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. +To start the setup process, run the following from your command line prompt: -```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) +```bash +bash -c "$(curl -fsSL https://zmk.dev/setup.sh)" ``` - + -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 +```bash +bash -c "$(wget https://zmk.dev/setup.sh -O -)" '' --wget ``` - + -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) +```powershell +powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://zmk.dev/setup.ps1'))" ``` - +
-### Install ZMK CLI +### Keyboard Selection -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... +When prompted, enter the number for the corresponding keyboard you would like to target: ``` -error: Executable already exists: zmk.exe (use `--force` to overwrite) +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: ``` -...run the following commands to remove the pipx version and reinstall it with uv: +:::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/hardware-integration/new-shield.mdx) if you are adding support for a composite keyboard. +::: -```sh -python3 -m pipx uninstall zmk -uv tool install zmk -``` +### MCU Board Selection -
- -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: +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: ``` -Repository URL: https://github.com/myusername/zmk-config +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) Seeed Studio XIAO SAMD21 +3) nice!nano v1 7) nRFMicro 1.1/1.2 11) Seeed Studio XIAO nRF52840 +4) nice!nano v2 8) nRFMicro 1.3/1.4 12) Quit +Pick an MCU board: ``` -Otherwise, select "Create a new ZMK config repo", and follow the instructions to create a new repo. +### Keymap Customization -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. +At the next prompt, you have an opportunity to decide if you want the stock keymap file copied in +for further customization: -### Add a Keyboard - -To start building firmware for a new keyboard, run the following command: - -```sh -zmk keyboard add +``` +Copy in the stock keymap for customization? [Yn]: ``` -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. +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`. -
- My keyboard isn't listed +### GitHub Details -If ZMK doesn't support your keyboard by default, you have two options: +In order to have your new configuration automatically pushed, and then built using GitHub Actions, enter +some information about your particular GitHub info: -**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 +``` +GitHub Username (leave empty to skip GitHub repo creation): petejohanson +GitHub Repo Name: zmk-config +GitHub Repo: https://github.com/petejohanson/zmk-config.git ``` -For example, `zmk module add https://github.com/cannonkeys/zmk-cannonkeys-keyboards` would add support for CannonKeys keyboards. +Only the GitHub username is required; if you are happy with the defaults offered in the square brackets, you can simply hit `Enter`. -Run `zmk keyboard add` again, and the new keyboards should appear in the list. +:::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`. +::: -**Create It Yourself** +### Confirming Selections -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. +The setup script will confirm all of your selections one last time, before performing the setup: -ZMK CLI can also help generate some of the boilerplate for defining a new keyboard: +``` +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 -```sh -zmk keyboard new +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. -### Edit Your Keymap and Configuration +:::info -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.) +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. ::: -## Install the Firmware +## Installing 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. +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. If the build was successful, the right side panel will include +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) -:::info[Fixing build errors] +Once downloaded, extract the zip and you can verify it should contain one or more `uf2` files, which will be copied to +your keyboard. -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. +### Flashing UF2 Files -::: - -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. +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 @@ -376,12 +218,6 @@ Please refer to [split keyboards documentation](features/split-keyboards.md) for ::: -### 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. @@ -396,7 +232,7 @@ Please refer to [the pairing section in the split keyboards documentation](featu :::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 +[recommended troubleshooting procedure](troubleshooting/connection-issues.mdx#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/docusaurus.config.js b/docs/docusaurus.config.js index 535e3e49..801eac92 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,13 @@ 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: { @@ -82,29 +51,16 @@ 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, + to: "keymap-upgrader", + label: "Keymap Upgrader", + position: "left", }, { href: "https://zmk.studio/", @@ -113,8 +69,7 @@ module.exports = { }, { href: "https://github.com/zmkfirmware/zmk", - "aria-label": "ZMK GitHub Repository", - className: "header-github-link", + label: "GitHub", position: "right", }, ], @@ -152,6 +107,10 @@ module.exports = { label: "Mastodon", href: "https://fosstodon.org/@zmk", }, + { + label: "Twitter", + href: "https://twitter.com/ZMKFirmware", + }, ], }, { diff --git a/docs/package-lock.json b/docs/package-lock.json index f046e505..d4d6acd7 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,15 +8,15 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.10.1", - "@docusaurus/preset-classic": "^3.10.1", - "@docusaurus/theme-mermaid": "^3.10.1", + "@docusaurus/core": "^3.8.0", + "@docusaurus/preset-classic": "^3.8.0", + "@docusaurus/theme-mermaid": "^3.8.0", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^3.1.0", "classnames": "^2.2.6", - "js-yaml": "^4.1.1", + "js-yaml": "^4.1.0", "react": "^18.0.0", "react-async": "^10.0.1", "react-copy-to-clipboard": "^5.0.3", @@ -26,71 +26,69 @@ "web-tree-sitter": "^0.24.3" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", - "@eslint/js": "^9.39.2", + "@docusaurus/module-type-aliases": "^3.6.3", + "@docusaurus/tsconfig": "^3.6.3", + "@docusaurus/types": "^3.6.3", + "@eslint/js": "^9.23.0", "@types/glob": "^8.1.0", "@types/js-yaml": "^4.0.5", "@types/react": "^18.3.12", "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", - "eslint": "^9.39.2", - "eslint-plugin-mdx": "^3.6.2", + "eslint": "^9.23.0", + "eslint-plugin-mdx": "^3.3.2", "eslint-plugin-react": "^7.37.5", - "globals": "^17.6.0", + "globals": "^16.0.0", "json-schema-to-typescript": "^15.0.3", "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": "^3.4.2", + "string-replace-loader": "^3.1.0", + "typescript": "^5.7.2", + "typescript-eslint": "^8.30.1", + "webpack": "^5.97.1" } }, "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==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", - "@algolia/autocomplete-shared": "1.19.8" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" } }, "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==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.19.8" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, "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==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -98,99 +96,99 @@ } }, "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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.25.0.tgz", + "integrity": "sha512-1pfQulNUYNf1Tk/svbfjfkLBS36zsuph6m+B6gDkPEivFmso/XnRgwDvjAx80WNtiHnmeNjIXdF7Gos8+OLHqQ==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.25.0.tgz", + "integrity": "sha512-AFbG6VDJX/o2vDd9hqncj1B6B4Tulk61mY0pzTtzKClyTDlNP0xaUiEKhl6E7KO9I/x0FJF5tDCm0Hn6v5x18A==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.25.0.tgz", + "integrity": "sha512-il1zS/+Rc6la6RaCdSZ2YbJnkQC6W1wiBO8+SH+DE6CPMWBU6iDVzH0sCKSAtMWl9WBxoN6MhNjGBnCv9Yy2bA==", "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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.25.0.tgz", + "integrity": "sha512-blbjrUH1siZNfyCGeq0iLQu00w3a4fBXm0WRIM0V8alcAPo7rWjLbMJMrfBtzL9X5ic6wgxVpDADXduGtdrnkw==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.25.0.tgz", + "integrity": "sha512-aywoEuu1NxChBcHZ1pWaat0Plw7A8jDMwjgRJ00Mcl7wGlwuPt5dJ/LTNcg3McsEUbs2MBNmw0ignXBw9Tbgow==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.25.0.tgz", + "integrity": "sha512-a/W2z6XWKjKjIW1QQQV8PTTj1TXtaKx79uR3NGBdBdGvVdt24KzGAaN7sCr5oP8DW4D3cJt44wp2OY/fZcPAVA==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.25.0.tgz", + "integrity": "sha512-9rUYcMIBOrCtYiLX49djyzxqdK9Dya/6Z/8sebPn94BekT+KLOpaZCuc6s0Fpfq7nx5J6YY5LIVFQrtioK9u0g==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.0" @@ -203,86 +201,99 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.52.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.1.tgz", - "integrity": "sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.25.0.tgz", + "integrity": "sha512-jJeH/Hk+k17Vkokf02lkfYE4A+EJX+UgnMhTLR/Mb+d1ya5WhE+po8p5a/Nxb6lo9OLCRl6w3Hmk1TX1e9gVbQ==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.0" } }, "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==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.25.0.tgz", + "integrity": "sha512-Ls3i1AehJ0C6xaHe7kK9vPmzImOn5zBg7Kzj8tRYIcmCWVyuuFwCIsbuIIz/qzUf1FPSWmw0TZrGeTumk2fqXg==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.25.0.tgz", + "integrity": "sha512-79sMdHpiRLXVxSjgw7Pt4R1aNUHxFLHiaTDnN2MQjHwJ1+o3wSseb55T9VXU4kqy3m7TUme3pyRhLk5ip/S4Mw==", "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" + "@algolia/client-common": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.25.0.tgz", + "integrity": "sha512-JLaF23p1SOPBmfEqozUAgKHQrGl3z/Z5RHbggBu6s07QqXXcazEsub5VLonCxGVqTv6a61AAPr8J1G5HgGGjEw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.52.1" + "@algolia/client-common": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.25.0.tgz", + "integrity": "sha512-rtzXwqzFi1edkOF6sXxq+HhmRKDy7tz84u0o5t1fXwz0cwx+cjpmxu/6OQKTdOJFS92JUYHsG51Iunie7xbqfQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.52.1" + "@algolia/client-common": "5.25.0" }, "engines": { "node": ">= 14.0.0" } }, "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==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.25.0.tgz", + "integrity": "sha512-ZO0UKvDyEFvyeJQX0gmZDQEvhLZ2X10K+ps6hViMo1HgE2V8em00SwNsQ+7E/52a+YiBkVWX61pJJJE44juDMQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.52.1" + "@algolia/client-common": "5.25.0" }, "engines": { "node": ">= 14.0.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@antfu/install-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", @@ -296,6 +307,15 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "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", @@ -315,12 +335,12 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -329,30 +349,30 @@ } }, "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==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "license": "MIT", "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==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "license": "MIT", "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", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -377,15 +397,15 @@ } }, "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==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", + "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -393,25 +413,25 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.25.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==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -430,17 +450,17 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "license": "MIT", "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", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -460,13 +480,13 @@ } }, "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==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -486,65 +506,56 @@ } }, "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==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.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", - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -554,35 +565,35 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.25.9" }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "license": "MIT", "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.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -592,14 +603,14 @@ } }, "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==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "license": "MIT", "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-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -609,13 +620,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -631,57 +642,57 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "license": "MIT", "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "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==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" }, "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==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz", + "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -691,13 +702,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -707,12 +718,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -722,12 +733,12 @@ } }, "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==", + "version": "7.25.9", + "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.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -737,14 +748,14 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "license": "MIT", "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.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -754,13 +765,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -794,12 +805,12 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -809,12 +820,12 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -824,12 +835,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -839,12 +850,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -870,12 +881,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -885,14 +896,14 @@ } }, "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==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "license": "MIT", "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.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -902,14 +913,14 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "license": "MIT", "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.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -919,12 +930,12 @@ } }, "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==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -934,12 +945,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -949,13 +960,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -965,13 +976,13 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -981,17 +992,17 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "license": "MIT", "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.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1000,14 +1011,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1017,13 +1037,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1033,13 +1052,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1049,12 +1068,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1064,13 +1083,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1080,28 +1099,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "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.25.9" }, "engines": { "node": ">=6.9.0" @@ -1111,12 +1114,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==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1126,12 +1129,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1141,13 +1144,13 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1157,14 +1160,14 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1174,12 +1177,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1189,12 +1192,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1204,12 +1207,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1219,12 +1222,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1234,13 +1237,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1250,13 +1253,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==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1266,15 +1269,15 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "license": "MIT", "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-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1284,13 +1287,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1300,13 +1303,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1316,12 +1319,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1331,12 +1334,12 @@ } }, "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==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1346,12 +1349,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1361,16 +1364,14 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "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-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1380,13 +1381,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1396,12 +1397,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1411,13 +1412,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1427,12 +1428,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1442,13 +1443,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1458,14 +1459,14 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "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-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1475,12 +1476,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1505,12 +1506,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1520,16 +1521,16 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "license": "MIT", "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.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1539,12 +1540,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1555,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1570,12 +1571,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1585,13 +1587,13 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1601,12 +1603,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1616,16 +1618,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==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", + "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", "license": "MIT", "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", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1645,12 +1647,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1660,13 +1662,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1676,12 +1678,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1691,12 +1693,12 @@ } }, "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==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1706,12 +1708,12 @@ } }, "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==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1721,16 +1723,16 @@ } }, "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==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", "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-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1740,12 +1742,12 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1755,13 +1757,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1771,13 +1773,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1787,13 +1789,13 @@ } }, "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1803,80 +1805,79 @@ } }, "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==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "license": "MIT", "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/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@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-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@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/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@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", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -1886,19 +1887,6 @@ "@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", @@ -1923,17 +1911,17 @@ } }, "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==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", "license": "MIT", "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.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1943,16 +1931,16 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", "license": "MIT", "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.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1962,100 +1950,126 @@ } }, "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==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.4.tgz", + "integrity": "sha512-H7QhL0ucCGOObsUETNbB2PuzF4gAvN8p32P6r91bX7M/hk4bx+3yz2hTwHL9d/Efzwu1upeb4/cd7oSxCzup3w==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2" + }, "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==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "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==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "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.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", + "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-validator-identifier": "^7.27.1" }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", "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==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", "license": "Apache-2.0", "dependencies": { - "@chevrotain/gast": "12.0.0", - "@chevrotain/types": "12.0.0" + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" } }, "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==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", "license": "Apache-2.0", "dependencies": { - "@chevrotain/types": "12.0.0" + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" } }, "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==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", "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==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", "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==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", "license": "Apache-2.0" }, "node_modules/@colors/colors": { @@ -2092,9 +2106,9 @@ } }, "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==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "funding": [ { "type": "github", @@ -2134,9 +2148,9 @@ } }, "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==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", "funding": [ { "type": "github", @@ -2149,7 +2163,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.1.0", + "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.4" }, "engines": { @@ -2224,39 +2238,10 @@ "@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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", "funding": [ { "type": "github", @@ -2302,9 +2287,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2315,9 +2300,9 @@ } }, "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==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz", + "integrity": "sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==", "funding": [ { "type": "github", @@ -2330,39 +2315,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@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/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2373,9 +2329,9 @@ } }, "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==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz", + "integrity": "sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==", "funding": [ { "type": "github", @@ -2388,10 +2344,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2402,9 +2358,9 @@ } }, "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz", + "integrity": "sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==", "funding": [ { "type": "github", @@ -2417,10 +2373,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2431,9 +2387,9 @@ } }, "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==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz", + "integrity": "sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==", "funding": [ { "type": "github", @@ -2448,36 +2404,7 @@ "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/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2541,9 +2468,9 @@ } }, "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==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz", + "integrity": "sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==", "funding": [ { "type": "github", @@ -2556,7 +2483,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, @@ -2568,9 +2495,9 @@ } }, "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==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz", + "integrity": "sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==", "funding": [ { "type": "github", @@ -2583,10 +2510,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2597,9 +2524,9 @@ } }, "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==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz", + "integrity": "sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==", "funding": [ { "type": "github", @@ -2612,10 +2539,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2626,9 +2553,9 @@ } }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz", + "integrity": "sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==", "funding": [ { "type": "github", @@ -2641,7 +2568,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2675,9 +2602,9 @@ } }, "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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", "funding": [ { "type": "github", @@ -2723,9 +2650,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -2736,9 +2663,9 @@ } }, "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==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz", + "integrity": "sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==", "funding": [ { "type": "github", @@ -2753,7 +2680,7 @@ "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2962,9 +2889,9 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", "funding": [ { "type": "github", @@ -2987,9 +2914,9 @@ } }, "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==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", + "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", "funding": [ { "type": "github", @@ -3002,10 +2929,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3015,32 +2942,10 @@ "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", + "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", "funding": [ { "type": "github", @@ -3062,32 +2967,6 @@ "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", @@ -3116,9 +2995,9 @@ } }, "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==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz", + "integrity": "sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==", "funding": [ { "type": "github", @@ -3131,10 +3010,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3170,9 +3049,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -3236,61 +3115,10 @@ "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", "funding": [ { "type": "github", @@ -3303,7 +3131,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/color-helpers": "^5.1.0", + "@csstools/color-helpers": "^5.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -3393,43 +3221,22 @@ "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==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", "license": "MIT" }, "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==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.6.3", - "@docsearch/css": "4.6.3" + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3452,42 +3259,10 @@ } } }, - "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.0.tgz", + "integrity": "sha512-9EJwSgS6TgB8IzGk1L8XddJLhZod8fXT4ULYMx6SKqyCBqCFpVCEjR/hNXXhnmtVM2irDuzYoVLGWv7srG/VOA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3498,50 +3273,51 @@ "@babel/preset-react": "^7.25.9", "@babel/preset-typescript": "^7.25.9", "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", + "@docusaurus/logger": "3.8.0", + "@docusaurus/utils": "3.8.0", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.0.tgz", + "integrity": "sha512-Rq4Z/MSeAHjVzBLirLeMcjLIAQy92pF1OI+2rmt18fSlMARfTGLWRE8Vb+ljQPTOSfJxwDYSzsK6i7XloD2rNA==", "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", + "@docusaurus/babel": "3.8.0", + "@docusaurus/cssnano-preset": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", + "clean-css": "^5.3.2", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", + "css-loader": "^6.8.1", "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", + "mini-css-extract-plugin": "^2.9.1", "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "postcss-preset-env": "^10.1.0", "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "url-loader": "^4.1.1", "webpack": "^5.95.0", - "webpackbar": "^7.0.0" + "webpackbar": "^6.0.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "@docusaurus/faster": "*" @@ -3553,18 +3329,18 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.0.tgz", + "integrity": "sha512-c7u6zFELmSGPEP9WSubhVDjgnpiHgDqMh1qVdCB7rTflh4Jx0msTYmMiO91Ez0KtHj4sIsDsASnjwfJ2IZp3Vw==", "license": "MIT", "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", + "@docusaurus/babel": "3.8.0", + "@docusaurus/bundler": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/mdx-loader": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3576,7 +3352,7 @@ "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", - "execa": "^5.1.1", + "execa": "5.1.1", "fs-extra": "^11.1.1", "html-tags": "^3.3.1", "html-webpack-plugin": "^5.6.0", @@ -3587,75 +3363,69 @@ "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-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.4", "semver": "^7.5.4", - "serve-handler": "^6.1.7", + "serve-handler": "^6.1.6", "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-dev-server": "^4.15.2", "webpack-merge": "^6.0.1" }, "bin": { "docusaurus": "bin/docusaurus.mjs" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "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 - } } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.0.tgz", + "integrity": "sha512-UJ4hAS2T0R4WNy+phwVff2Q0L5+RXW9cwlH6AEphHR5qw3m/yacfWcSK7ort2pMMbDn8uGrD38BTm4oLkuuNoQ==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", + "postcss": "^8.4.38", "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" } }, "node_modules/@docusaurus/logger": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", - "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.0.tgz", + "integrity": "sha512-7eEMaFIam5Q+v8XwGqF/n0ZoCld4hV4eCCgQkfcN9Mq5inoZa6PHHW9Wu6lmgzoK5Kx3keEeABcO2SxwraoPDQ==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.0.tgz", + "integrity": "sha512-mDPSzssRnpjSdCGuv7z2EIAnPS1MHuZGTaRLwPn4oQwszu4afjWZ/60sfKjTnjBjI8Vl4OgJl2vMmfmiNDX4Ng==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/logger": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3679,7 +3449,7 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3687,12 +3457,12 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.0.tgz", + "integrity": "sha512-/uMb4Ipt5J/QnD13MpnoC/A4EYAe6DKNWqTWLlGrqsPJwJv73vSwkA25xnYunwfqWk0FlUQfGv/Swdh5eCCg7g==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.1", + "@docusaurus/types": "3.8.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3706,21 +3476,20 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.0.tgz", + "integrity": "sha512-0SlOTd9R55WEr1GgIXu+hhTT0hzARYx3zIScA5IzpdekZQesI/hKEa5LPHBd415fLkWMjdD59TaW/3qQKpJ0Lg==", "license": "MIT", "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", + "@docusaurus/core": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/mdx-loader": "3.8.0", + "@docusaurus/theme-common": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "cheerio": "1.0.0-rc.12", - "combine-promises": "^1.1.0", "feed": "^4.2.2", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -3732,7 +3501,7 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", @@ -3741,20 +3510,20 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.0.tgz", + "integrity": "sha512-fRDMFLbUN6eVRXcjP8s3Y7HpAt9pzPYh1F/7KKXOCxvJhjjCtbon4VJW0WndEPInVz4t8QUXn5QZkU2tGVCE2g==", "license": "MIT", "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", + "@docusaurus/core": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/mdx-loader": "3.8.0", + "@docusaurus/module-type-aliases": "3.8.0", + "@docusaurus/theme-common": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3766,7 +3535,7 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3774,22 +3543,22 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.0.tgz", + "integrity": "sha512-39EDx2y1GA0Pxfion5tQZLNJxL4gq6susd1xzetVBjVIQtwpCdyloOfQBAgX0FylqQxfJrYqL0DIUuq7rd7uBw==", "license": "MIT", "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", + "@docusaurus/core": "3.8.0", + "@docusaurus/mdx-loader": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3797,36 +3566,35 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.0.tgz", + "integrity": "sha512-/VBTNymPIxQB8oA3ZQ4GFFRYdH4ZxDRRBECxyjRyv486mfUPXfcdk+im4S5mKWa6EK2JzBz95IH/Wu0qQgJ5yQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.0.tgz", + "integrity": "sha512-teonJvJsDB9o2OnG6ifbhblg/PXzZvpUKHFgD8dOL1UJ58u0lk8o0ZOkvaYEBa9nDgqzoWrRk9w+e3qaG2mOhQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", + "@docusaurus/core": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3834,18 +3602,18 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.0.tgz", + "integrity": "sha512-aKKa7Q8+3xRSRESipNvlFgNp3FNPELKhuo48Cg/svQbGNwidSHbZT03JqbW4cBaQnyyVchO1ttk+kJ5VC9Gx0w==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3853,19 +3621,19 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.0.tgz", + "integrity": "sha512-ugQYMGF4BjbAW/JIBtVcp+9eZEgT9HRdvdcDudl5rywNPBA0lct+lXMG3r17s02rrhInMpjMahN3Yc9Cb3H5/g==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", - "@types/gtag.js": "^0.0.20", + "@docusaurus/core": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", + "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3873,18 +3641,18 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.0.tgz", + "integrity": "sha512-9juRWxbwZD3SV02Jd9QB6yeN7eu+7T4zB0bvJLcVQwi+am51wAxn2CwbdL0YCCX+9OfiXbADE8D8Q65Hbopu/w==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3892,23 +3660,23 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.0.tgz", + "integrity": "sha512-fGpOIyJvNiuAb90nSJ2Gfy/hUOaDu6826e5w5UxPmbpCIc7KlBHNAZ5g4L4ZuHhc4hdfq4mzVBsQSnne+8Ze1g==", "license": "MIT", "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", + "@docusaurus/core": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3916,22 +3684,22 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.0.tgz", + "integrity": "sha512-kEDyry+4OMz6BWLG/lEqrNsL/w818bywK70N1gytViw4m9iAmoxCUT7Ri9Dgs7xUdzCHJ3OujolEmD88Wy44OA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-validation": "3.10.1", + "@docusaurus/core": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3939,29 +3707,29 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.0.tgz", + "integrity": "sha512-qOu6tQDOWv+rpTlKu+eJATCJVGnABpRCPuqf7LbEaQ1mNY//N/P8cHQwkpAU+aweQfarcZ0XfwCqRHJfjeSV/g==", "license": "MIT", "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": "3.8.0", + "@docusaurus/plugin-content-blog": "3.8.0", + "@docusaurus/plugin-content-docs": "3.8.0", + "@docusaurus/plugin-content-pages": "3.8.0", + "@docusaurus/plugin-css-cascade-layers": "3.8.0", + "@docusaurus/plugin-debug": "3.8.0", + "@docusaurus/plugin-google-analytics": "3.8.0", + "@docusaurus/plugin-google-gtag": "3.8.0", + "@docusaurus/plugin-google-tag-manager": "3.8.0", + "@docusaurus/plugin-sitemap": "3.8.0", + "@docusaurus/plugin-svgr": "3.8.0", + "@docusaurus/theme-classic": "3.8.0", + "@docusaurus/theme-common": "3.8.0", + "@docusaurus/theme-search-algolia": "3.8.0", + "@docusaurus/types": "3.8.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3969,31 +3737,31 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.0.tgz", + "integrity": "sha512-nQWFiD5ZjoT76OaELt2n33P3WVuuCz8Dt5KFRP2fCBo2r9JCLsp2GJjZpnaG24LZ5/arRjv4VqWKgpK0/YLt7g==", "license": "MIT", "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", + "@docusaurus/core": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/mdx-loader": "3.8.0", + "@docusaurus/module-type-aliases": "3.8.0", + "@docusaurus/plugin-content-blog": "3.8.0", + "@docusaurus/plugin-content-docs": "3.8.0", + "@docusaurus/plugin-content-pages": "3.8.0", + "@docusaurus/theme-common": "3.8.0", + "@docusaurus/theme-translations": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", "infima": "0.2.0-alpha.45", "lodash": "^4.17.21", "nprogress": "^0.2.0", - "postcss": "^8.5.4", + "postcss": "^8.4.26", "prism-react-renderer": "^2.3.0", "prismjs": "^1.29.0", "react-router-dom": "^5.3.4", @@ -4002,7 +3770,7 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -4010,15 +3778,15 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.0.tgz", + "integrity": "sha512-YqV2vAWpXGLA+A3PMLrOMtqgTHJLDcT+1Caa6RF7N4/IWgrevy5diY8oIHFkXR/eybjcrFFjUPrHif8gSGs3Tw==", "license": "MIT", "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": "3.8.0", + "@docusaurus/module-type-aliases": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -4029,7 +3797,7 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", @@ -4038,50 +3806,43 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.0.tgz", + "integrity": "sha512-ou0NJM37p4xrVuFaZp8qFe5Z/qBq9LuyRTP4KKRa0u2J3zC4f3saBJDgc56FyvvN1OsmU0189KGEPUjTr6hFxg==", "license": "MIT", "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", + "@docusaurus/core": "3.8.0", + "@docusaurus/module-type-aliases": "3.8.0", + "@docusaurus/theme-common": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { - "@mermaid-js/layout-elk": "^0.1.9", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@mermaid-js/layout-elk": { - "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.0.tgz", + "integrity": "sha512-GBZ5UOcPgiu6nUw153+0+PNWvFKweSnvKIL6Rp04H9olKb475jfKjAwCCtju5D2xs5qXHvCMvzWOg5o9f6DtuQ==", "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", + "@docsearch/react": "^3.9.0", + "@docusaurus/core": "3.8.0", + "@docusaurus/logger": "3.8.0", + "@docusaurus/plugin-content-docs": "3.8.0", + "@docusaurus/theme-common": "3.8.0", + "@docusaurus/theme-translations": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-validation": "3.8.0", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", @@ -4090,7 +3851,7 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -4098,34 +3859,33 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.0.tgz", + "integrity": "sha512-1DTy/snHicgkCkryWq54fZvsAglTdjTx4qjOXgqnXJ+DIty1B+aPQrAVUu8LiM+6BiILfmNxYsxhKTj+BS3PZg==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.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==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.7.0.tgz", + "integrity": "sha512-vRsyj3yUZCjscgfgcFYjIsTcAru/4h4YH2/XAE8Rs7wWdnng98PgWKvP5ovVc4rmRpRg2WChVW0uOy2xHDvDBQ==", "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.0.tgz", + "integrity": "sha512-RDEClpwNxZq02c+JlaKLWoS13qwWhjcNsi2wG1UpzmEnuti/z1Wx4SGpqbUqRPNSd8QWWePR8Cb7DvG0VN/TtA==", "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", @@ -4154,16 +3914,16 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.0.tgz", + "integrity": "sha512-2wvtG28ALCN/A1WCSLxPASFBFzXCnP0YKCAFIPcvEb6imNu1wg7ni/Svcp71b3Z2FaOFFIv4Hq+j4gD7gA0yfQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/types": "3.10.1", - "@docusaurus/utils-common": "3.10.1", + "@docusaurus/logger": "3.8.0", + "@docusaurus/types": "3.8.0", + "@docusaurus/utils-common": "3.8.0", "escape-string-regexp": "^4.0.0", - "execa": "^5.1.1", + "execa": "5.1.1", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", "github-slugger": "^1.5.0", @@ -4182,31 +3942,31 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.0.tgz", + "integrity": "sha512-3TGF+wVTGgQ3pAc9+5jVchES4uXUAhAt9pwv7uws4mVOxL4alvU3ue/EZ+R4XuGk94pDy7CNXjRXpPjlfZXQfw==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.10.1", + "@docusaurus/types": "3.8.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.0.tgz", + "integrity": "sha512-MrnEbkigr54HkdFeg8e4FKc4EF+E9dlVwsY3XQZsNkbv3MKZnbHQ5LsNJDIKDROFe8PBf5C4qCAg5TPBpsjrjg==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.10.1", - "@docusaurus/utils": "3.10.1", - "@docusaurus/utils-common": "3.10.1", + "@docusaurus/logger": "3.8.0", + "@docusaurus/utils": "3.8.0", + "@docusaurus/utils-common": "3.8.0", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4214,13 +3974,13 @@ "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" } }, "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==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, "license": "MIT", "dependencies": { @@ -4236,23 +3996,10 @@ "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==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -4260,37 +4007,34 @@ } }, "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==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", - "minimatch": "^3.1.5" + "minimatch": "^3.1.2" }, "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==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "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==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4301,20 +4045,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.14.0", + "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.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": { @@ -4338,22 +4082,19 @@ } }, "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==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", "dev": true, "license": "MIT", "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==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4361,19 +4102,32 @@ } }, "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==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "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/@fortawesome/fontawesome-common-types": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", @@ -4408,17 +4162,16 @@ } }, "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.", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", "license": "MIT", "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": { @@ -4447,19 +4200,33 @@ } }, "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==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" + "@humanwhocodes/retry": "^0.3.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -4475,9 +4242,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4495,14 +4262,31 @@ "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^1.1.0", + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@isaacs/cliui": { @@ -4524,9 +4308,9 @@ } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -4537,13 +4321,13 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -4582,23 +4366,17 @@ } }, "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==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "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/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4610,10 +4388,19 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "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==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4621,15 +4408,15 @@ } }, "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==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "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==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4643,415 +4430,6 @@ "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" - } - }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -5059,16 +4437,15 @@ "license": "MIT" }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "license": "MIT", "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", @@ -5096,9 +4473,9 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" @@ -5113,24 +4490,12 @@ } }, "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==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.4.0.tgz", + "integrity": "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==", "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" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "langium": "3.3.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -5189,9 +4554,9 @@ } }, "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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", "dev": true, "funding": [ { @@ -5204,6 +4569,16 @@ "node": ">=8" } }, + "node_modules/@npmcli/config/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" + } + }, "node_modules/@npmcli/git": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", @@ -5225,14 +4600,24 @@ "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==", + "node_modules/@npmcli/git/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": "BlueOak-1.0.0", + "license": "ISC", "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { @@ -5275,9 +4660,9 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -5285,10 +4670,9 @@ } }, "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", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -5307,13 +4691,13 @@ } }, "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==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5352,9 +4736,9 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -5362,10 +4746,9 @@ } }, "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", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -5394,13 +4777,13 @@ } }, "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==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5423,13 +4806,13 @@ } }, "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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=16" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { @@ -5448,154 +4831,6 @@ "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", @@ -5608,16 +4843,16 @@ } }, "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==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.0.tgz", + "integrity": "sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/pkgr" + "url": "https://opencollective.com/unts" } }, "node_modules/@pnpm/config.env-replace": { @@ -5648,9 +4883,9 @@ "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==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", @@ -5662,9 +4897,9 @@ } }, "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==", + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", "license": "MIT" }, "node_modules/@sideway/address": { @@ -5689,9 +4924,9 @@ "license": "BSD-3-Clause" }, "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==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "license": "MIT" }, "node_modules/@sindresorhus/is": { @@ -5986,10 +5221,28 @@ "node": ">=14.16" } }, + "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==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "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==", + "license": "MIT", + "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==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -6073,9 +5326,9 @@ } }, "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==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "license": "MIT" }, "node_modules/@types/d3-axis": { @@ -6125,9 +5378,9 @@ "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==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", "license": "MIT" }, "node_modules/@types/d3-drag": { @@ -6242,9 +5495,9 @@ "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==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -6288,9 +5541,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -6317,9 +5570,9 @@ } }, "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -6332,21 +5585,33 @@ } }, "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==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@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==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -6373,9 +5638,9 @@ } }, "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==", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", "license": "MIT" }, "node_modules/@types/hast": { @@ -6400,21 +5665,21 @@ "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==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", "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==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, "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==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -6465,9 +5730,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", "dev": true, "license": "MIT" }, @@ -6506,30 +5771,39 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, "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==", + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", "license": "MIT" }, "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==", + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -6539,13 +5813,13 @@ "license": "MIT" }, "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==", + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.2.2" + "csstype": "^3.0.2" } }, "node_modules/@types/react-helmet": { @@ -6591,9 +5865,9 @@ } }, "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==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "license": "MIT" }, "node_modules/@types/sax": { @@ -6606,11 +5880,12 @@ } }, "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, @@ -6624,24 +5899,14 @@ } }, "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==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "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/node": "*" + "@types/send": "*" } }, "node_modules/@types/sockjs": { @@ -6674,18 +5939,18 @@ "license": "MIT" }, "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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", "license": "MIT", "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==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -6698,20 +5963,21 @@ "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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", "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", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6721,33 +5987,23 @@ "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" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", "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" + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6757,41 +6013,19 @@ "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" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2" + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6801,35 +6035,17 @@ "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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", "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" + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6839,14 +6055,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, "license": "MIT", "engines": { @@ -6858,21 +6074,20 @@ } }, "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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", "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" + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6882,59 +6097,46 @@ "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" + "typescript": ">=4.8.4 <5.9.0" } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "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==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=16 || 14 >=14.17" }, "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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", "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" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6944,19 +6146,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.2", - "eslint-visitor-keys": "^5.0.0" + "@typescript-eslint/types": "8.30.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6967,13 +6169,13 @@ } }, "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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6985,16 +6187,6 @@ "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" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -7207,9 +6399,9 @@ } }, "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==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7218,18 +6410,6 @@ "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" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -7240,9 +6420,9 @@ } }, "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==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -7274,9 +6454,9 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -7307,9 +6487,9 @@ } }, "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==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -7338,34 +6518,33 @@ } }, "node_modules/algoliasearch": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.1.tgz", - "integrity": "sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.25.0.tgz", + "integrity": "sha512-n73BVorL4HIwKlfJKb4SEzAYkR3Buwfwbh+MYxg2mloFph2fFGV58E90QTzdbfzWrLn4HE5Czx/WTjI8fcHaMg==", "license": "MIT", "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" + "@algolia/client-abtesting": "5.25.0", + "@algolia/client-analytics": "5.25.0", + "@algolia/client-common": "5.25.0", + "@algolia/client-insights": "5.25.0", + "@algolia/client-personalization": "5.25.0", + "@algolia/client-query-suggestions": "5.25.0", + "@algolia/client-search": "5.25.0", + "@algolia/ingestion": "1.25.0", + "@algolia/monitoring": "1.25.0", + "@algolia/recommend": "5.25.0", + "@algolia/requester-browser-xhr": "5.25.0", + "@algolia/requester-fetch": "5.25.0", + "@algolia/requester-node-http": "5.25.0" }, "engines": { "node": ">= 14.0.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==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.25.0.tgz", + "integrity": "sha512-vQoK43U6HXA9/euCqLjvyNdM4G2Fiu/VFp4ae0Gau9sZeIKBPvUPnXfLYAe65Bg7PFuw03coeu5K6lTPSXRObw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -7403,6 +6582,33 @@ "node": ">=8" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -7439,15 +6645,6 @@ "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/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -7497,20 +6694,18 @@ "license": "MIT" }, "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.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", + "call-bind": "^1.0.7", "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" + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -7626,20 +6821,6 @@ "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/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", @@ -7660,9 +6841,9 @@ } }, "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.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "funding": [ { "type": "opencollective", @@ -7679,9 +6860,10 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", - "fraction.js": "^5.3.4", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -7738,13 +6920,13 @@ } }, "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==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -7761,25 +6943,25 @@ } }, "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==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7801,18 +6983,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "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/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -7841,23 +7011,23 @@ } }, "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==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", + "bytes": "3.1.2", "content-type": "~1.0.5", "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.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8", @@ -7939,9 +7109,9 @@ } }, "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==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -7961,9 +7131,9 @@ } }, "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.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "funding": [ { "type": "opencollective", @@ -7980,11 +7150,10 @@ ], "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.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -7999,21 +7168,6 @@ "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" - } - }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -8023,15 +7177,6 @@ "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", @@ -8150,9 +7295,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.30001720", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz", + "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==", "funding": [ { "type": "opencollective", @@ -8283,31 +7428,29 @@ } }, "node_modules/chevrotain": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-12.0.0.tgz", - "integrity": "sha512-csJvb+6kEiQaqo1woTdSAuOWdN0WTLIydkKrBnS+V5gZz0oqBrp4kQ35519QgK6TpBThiG3V1vNSHlIkv4AglQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "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" + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" } }, "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==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", "license": "MIT", "dependencies": { - "lodash-es": "^4.18.1" + "lodash-es": "^4.17.21" }, "peerDependencies": { - "chevrotain": "^12.0.0" + "chevrotain": "^11.0.0" } }, "node_modules/chokidar": { @@ -8551,25 +7694,25 @@ } }, "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==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", "license": "MIT", "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==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.1.0", + "on-headers": "~1.0.2", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -8624,9 +7767,9 @@ } }, "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==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", "license": "MIT" }, "node_modules/config-chain": { @@ -8639,12 +7782,6 @@ "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" - }, "node_modules/configstore": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", @@ -8707,24 +7844,24 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, "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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", "license": "MIT", "engines": { "node": ">=12" @@ -8810,9 +7947,9 @@ } }, "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.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8821,18 +7958,29 @@ } }, "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==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "license": "MIT", "dependencies": { - "browserslist": "^4.28.1" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-pure": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", + "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", + "hasInstallScript": true, + "license": "MIT", + "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", @@ -8941,9 +8089,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -8954,9 +8102,9 @@ } }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -8966,9 +8114,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==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", "funding": [ { "type": "github", @@ -9015,9 +8163,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -9129,9 +8277,9 @@ } }, "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==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -9158,9 +8306,9 @@ } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -9170,9 +8318,9 @@ } }, "node_modules/cssdb": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.9.0.tgz", - "integrity": "sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz", + "integrity": "sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==", "funding": [ { "type": "opencollective", @@ -9328,15 +8476,15 @@ "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==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "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==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz", + "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==", "license": "MIT", "engines": { "node": ">=0.10" @@ -9596,9 +8744,9 @@ } }, "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "license": "ISC", "engines": { "node": ">=12" @@ -9832,9 +8980,9 @@ } }, "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==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", "license": "MIT", "dependencies": { "d3": "^7.9.0", @@ -9896,9 +9044,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, "node_modules/debounce": { @@ -9908,9 +9056,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9925,9 +9073,9 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -9989,32 +9137,16 @@ "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==", + "license": "BSD-2-Clause", "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": { @@ -10070,9 +9202,9 @@ } }, "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" @@ -10142,6 +9274,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "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", @@ -10230,9 +9372,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", - "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -10319,9 +9461,9 @@ "license": "MIT" }, "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==", + "version": "1.5.161", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", + "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -10365,13 +9507,13 @@ } }, "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==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" @@ -10397,18 +9539,18 @@ "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==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "license": "MIT", "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.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "license": "MIT", "dependencies": { @@ -10416,18 +9558,18 @@ "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.4", + "call-bound": "^1.0.3", "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-object-atoms": "^1.0.0", "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-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -10439,24 +9581,21 @@ "is-array-buffer": "^3.0.5", "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", + "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", + "regexp.prototype.flags": "^1.5.3", "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", @@ -10465,7 +9604,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -10493,28 +9632,27 @@ } }, "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.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.4", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", + "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", + "get-intrinsic": "^1.2.6", "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", + "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" }, "engines": { @@ -10522,9 +9660,9 @@ } }, "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==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -10658,32 +9796,33 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/eslint-utils": "^4.2.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", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.14.0", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -10695,7 +9834,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -10718,23 +9857,25 @@ } }, "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": "3.3.2", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-3.3.2.tgz", + "integrity": "sha512-GFeLoM2S5Jx0iTXYvsp/do/UNTzV+vRNfNxRglelXb9ZNSfUFGHsq60ZcHyUvpxy2crPebCX4gzT/FRu/LJRbA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.14.1", "acorn-jsx": "^5.3.2", - "espree": "^9.6.1 || ^10.4.0", + "espree": "^9.6.1 || ^10.3.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", + "synckit": "^0.11.2", + "tslib": "^2.8.1", "unified": "^11.0.5", "unified-engine": "^11.2.2", "unist-util-visit": "^5.0.0", + "uvu": "^0.5.6", "vfile": "^6.0.3" }, "engines": { @@ -10755,20 +9896,19 @@ } }, "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==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-3.3.2.tgz", + "integrity": "sha512-zBvxCiKzahbTRvWPONDZups1As5clGjv1OLOLnX/p+OwdrZdcwJ3tiBihu6xeZuem9u6iwMkr9kHVurcuzbTCg==", "dev": true, "license": "MIT", "dependencies": { - "eslint-mdx": "^3.7.0", + "eslint-mdx": "^3.3.2", "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", + "synckit": "^0.11.2", + "tslib": "^2.8.1", "unified": "^11.0.5", "vfile": "^6.0.3" }, @@ -10817,25 +9957,19 @@ } }, "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.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "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.13.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" } @@ -10851,9 +9985,9 @@ } }, "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==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10868,9 +10002,22 @@ } }, "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==", + "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/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10894,15 +10041,15 @@ } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10911,6 +10058,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -10925,9 +10085,9 @@ } }, "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==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11027,9 +10187,9 @@ } }, "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==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.3.tgz", + "integrity": "sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -11142,39 +10302,39 @@ } }, "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==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "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.12", "proxy-addr": "~2.0.7", - "qs": "~6.15.1", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", + "send": "0.19.0", + "serve-static": "1.16.2", "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" @@ -11215,9 +10375,9 @@ "license": "MIT" }, "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==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/express/node_modules/range-parser": { @@ -11229,6 +10389,12 @@ "node": ">= 0.6" } }, + "node_modules/exsolve": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -11283,9 +10449,9 @@ "license": "MIT" }, "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==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "funding": [ { "type": "github", @@ -11299,9 +10465,9 @@ "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==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -11344,6 +10510,30 @@ "node": ">=0.4.0" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -11408,17 +10598,17 @@ } }, "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "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": { @@ -11497,16 +10687,16 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "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.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -11596,15 +10786,15 @@ } }, "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==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "github", + "type": "patreon", "url": "https://github.com/sponsors/rawify" } }, @@ -11618,9 +10808,9 @@ } }, "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==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -11631,11 +10821,16 @@ "node": ">=14.14" } }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, "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" }, "node_modules/fsevents": { @@ -11692,16 +10887,6 @@ "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", @@ -11794,8 +10979,7 @@ "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, + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -11824,22 +11008,6 @@ "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", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -11871,9 +11039,9 @@ } }, "node_modules/globals": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", - "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", "dev": true, "license": "MIT", "engines": { @@ -11975,6 +11143,13 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -12000,9 +11175,9 @@ } }, "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==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -12255,15 +11430,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==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", - "property-information": "^7.0.0", + "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" @@ -12273,6 +11448,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", @@ -12403,6 +11588,22 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -12462,9 +11663,9 @@ } }, "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==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -12543,9 +11744,9 @@ } }, "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==", + "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==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -12555,29 +11756,25 @@ "license": "MIT" }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "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==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "license": "MIT" }, "node_modules/http-proxy": { @@ -12595,9 +11792,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==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -12652,15 +11849,6 @@ "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", @@ -12732,9 +11920,9 @@ } }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, "license": "MIT", "funding": { @@ -12774,7 +11962,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", @@ -12788,19 +11975,15 @@ "license": "ISC" }, "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==", + "license": "ISC" }, "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==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "license": "MIT" }, "node_modules/internal-slot": { @@ -12837,9 +12020,9 @@ } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "license": "MIT", "engines": { "node": ">= 10" @@ -13109,15 +12292,14 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -13150,39 +12332,6 @@ "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", @@ -13212,35 +12361,10 @@ "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -13641,9 +12765,9 @@ "license": "MIT" }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -13726,9 +12850,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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -13754,9 +12878,9 @@ } }, "node_modules/katex": { - "version": "0.16.44", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.44.tgz", - "integrity": "sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ==", + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -13810,25 +12934,26 @@ "node": ">=6" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, "node_modules/langium": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.4.tgz", - "integrity": "sha512-J0M9BkTOZ9Izee2YL0eXkUKFdWhrmTYYVLgiZTz6Z3KvK03ooM+vjVrfphKcdGVPWmM2cFYtDnNyIsIIZPrHNA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", "license": "MIT", "dependencies": { - "@chevrotain/regexp-to-ast": "~12.0.0", - "chevrotain": "~12.0.0", - "chevrotain-allstar": "~0.4.3", - "vscode-jsonrpc": "~8.2.0", + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.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" + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" }, "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.3" + "node": ">=16.0.0" } }, "node_modules/latest-version": { @@ -13847,13 +12972,13 @@ } }, "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==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "license": "MIT", "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.4" + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" } }, "node_modules/layout-base": { @@ -13919,16 +13044,12 @@ } }, "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "license": "MIT", "engines": { "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -13945,6 +13066,23 @@ "node": ">=8.9.0" } }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -13962,15 +13100,15 @@ } }, "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==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "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==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -14073,15 +13211,15 @@ } }, "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 20" + "node": ">= 18" } }, "node_modules/math-intrinsics": { @@ -14143,9 +13281,9 @@ } }, "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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -14441,9 +13579,9 @@ } }, "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==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -14511,32 +13649,15 @@ } }, "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.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", "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.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "engines": { + "node": ">= 4.0.0" } }, "node_modules/merge-descriptors": { @@ -14564,28 +13685,27 @@ } }, "node_modules/mermaid": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", - "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.6.0.tgz", + "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==", "license": "MIT", "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.0.1", + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.4.0", "@types/d3": "^7.4.3", - "@upsetjs/venn.js": "^2.0.0", - "cytoscape": "^3.33.1", + "cytoscape": "^3.29.3", "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", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.4", + "katex": "^0.16.9", "khroma": "^2.1.0", - "lodash-es": "^4.17.23", - "marked": "^16.3.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.7", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", @@ -15195,9 +14315,9 @@ "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": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", "funding": [ { "type": "GitHub Sponsors", @@ -15277,11 +14397,12 @@ "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", "license": "MIT", "dependencies": { + "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", @@ -15560,9 +14681,9 @@ "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": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", "funding": [ { "type": "GitHub Sponsors", @@ -16092,9 +15213,9 @@ "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": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", "funding": [ { "type": "GitHub Sponsors", @@ -16107,6 +15228,7 @@ ], "license": "MIT", "dependencies": { + "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", @@ -16453,9 +15575,9 @@ } }, "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==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -16479,9 +15601,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -16500,25 +15622,52 @@ } }, "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", "license": "MIT", "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/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/mlly/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", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/mrmime": { @@ -16560,9 +15709,9 @@ } }, "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.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", "funding": [ { "type": "github", @@ -16610,9 +15759,9 @@ } }, "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==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", "license": "MIT", "engines": { "node": "^18 || ^20 || >= 21" @@ -16633,33 +15782,13 @@ "node": ">=18" } }, - "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==", + "license": "(BSD-3-Clause OR GPL-2.0)", "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": ">= 6.13.0" } }, "node_modules/node-gyp-build": { @@ -16674,9 +15803,9 @@ } }, "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==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT" }, "node_modules/nopt": { @@ -16719,10 +15848,19 @@ "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==", + "license": "MIT", + "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "license": "MIT", "engines": { "node": ">=14.16" @@ -16977,9 +16115,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==", + "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==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -16989,7 +16127,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" @@ -17154,20 +16291,16 @@ } }, "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==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "license": "MIT", "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": { @@ -17217,9 +16350,9 @@ "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", "license": "MIT" }, "node_modules/param-case": { @@ -17294,12 +16427,12 @@ "license": "ISC" }, "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -17318,18 +16451,6 @@ "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", @@ -17369,7 +16490,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" @@ -17451,9 +16571,9 @@ "license": "ISC" }, "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==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -17548,9 +16668,9 @@ } }, "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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -17560,31 +16680,14 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", "license": "MIT", "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" - }, - "engines": { - "node": ">=16.0.0" + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" } }, "node_modules/points-on-curve": { @@ -17614,9 +16717,9 @@ } }, "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.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -17633,7 +16736,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -17667,9 +16770,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -17711,9 +16814,9 @@ } }, "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==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz", + "integrity": "sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==", "funding": [ { "type": "github", @@ -17726,10 +16829,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -17854,9 +16957,9 @@ } }, "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==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.5.tgz", + "integrity": "sha512-UWf/vhMapZatv+zOuqlfLmYXeOhhHLh8U8HAKGI2VJ00xLRYoAJh4xv8iX6FB6+TLXeDnm0DBLMi00E0hodbQw==", "funding": [ { "type": "github", @@ -17911,9 +17014,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -17949,9 +17052,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18025,9 +17128,9 @@ } }, "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==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz", + "integrity": "sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==", "funding": [ { "type": "github", @@ -18040,7 +17143,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -18077,9 +17180,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18115,9 +17218,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18185,9 +17288,9 @@ } }, "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==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz", + "integrity": "sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==", "funding": [ { "type": "github", @@ -18200,10 +17303,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-color-parser": "^3.0.10", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -18404,9 +17507,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18432,9 +17535,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18460,9 +17563,9 @@ } }, "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==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", "funding": [ { "type": "github", @@ -18475,7 +17578,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-resolve-nested": "^3.0.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, @@ -18487,9 +17590,9 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", "funding": [ { "type": "github", @@ -18531,9 +17634,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18774,9 +17877,9 @@ } }, "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==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.0.tgz", + "integrity": "sha512-cl13sPBbSqo1Q7Ryb19oT5NZO5IHFolRbIMdgDq4f9w1MHYiL6uZS7uSsjXJ1KzRIcX5BMjEeyxmAevVXENa3Q==", "funding": [ { "type": "github", @@ -18789,23 +17892,20 @@ ], "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-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.10", + "@csstools/postcss-color-mix-function": "^3.0.10", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", + "@csstools/postcss-content-alt-text": "^2.0.6", "@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-gamut-mapping": "^2.0.10", + "@csstools/postcss-gradients-interpolation-method": "^5.0.10", + "@csstools/postcss-hwb-function": "^4.0.10", + "@csstools/postcss-ic-unit": "^4.0.2", "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.9", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", @@ -18814,45 +17914,41 @@ "@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-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.10", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-relative-color-syntax": "^3.0.10", "@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-text-decoration-shorthand": "^4.0.2", "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.23", - "browserslist": "^4.28.1", + "autoprefixer": "^10.4.21", + "browserslist": "^4.24.5", "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", + "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.6.0", + "cssdb": "^8.3.0", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", + "postcss-color-functional-notation": "^7.0.10", "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-properties": "^14.0.5", "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", + "postcss-double-position-gradients": "^6.0.2", "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-lab-function": "^7.0.10", "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", + "postcss-nesting": "^13.0.1", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", @@ -18894,9 +17990,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18987,9 +18083,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -19102,9 +18198,9 @@ } }, "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": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -19220,9 +18316,9 @@ } }, "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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", "license": "MIT", "funding": { "type": "github", @@ -19267,9 +18363,9 @@ } }, "node_modules/pupa": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" @@ -19281,31 +18377,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -19314,6 +18392,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -19365,15 +18459,15 @@ } }, "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==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "license": "MIT", "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" @@ -19415,12 +18509,6 @@ "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", @@ -19452,16 +18540,16 @@ } }, "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==", + "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==", "license": "MIT", "dependencies": { - "copy-to-clipboard": "^3.3.3", + "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-dom": { @@ -19508,9 +18596,9 @@ "license": "MIT" }, "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==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz", + "integrity": "sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==", "license": "MIT", "engines": { "node": ">=18" @@ -19533,9 +18621,9 @@ } }, "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==", + "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==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.3" @@ -19678,9 +18766,9 @@ } }, "node_modules/recma-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", "license": "MIT", "dependencies": { "acorn-jsx": "^5.0.0", @@ -19692,9 +18780,6 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/recma-parse": { @@ -19729,12 +18814,6 @@ "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", @@ -19765,9 +18844,9 @@ "license": "MIT" }, "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==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -19776,6 +18855,21 @@ "node": ">=4" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.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", @@ -19798,29 +18892,29 @@ } }, "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==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", + "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" + "unicode-match-property-value-ecmascript": "^2.1.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==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^3.0.2" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { "node": ">=14" @@ -19848,17 +18942,29 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.1.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -19965,9 +19071,9 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", @@ -19995,9 +19101,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -20126,6 +19232,15 @@ "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==", + "license": "MIT", + "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", @@ -20150,12 +19265,12 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -20225,10 +19340,26 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", "license": "Unlicense" }, "node_modules/roughjs": { @@ -20261,18 +19392,6 @@ "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": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -20302,6 +19421,19 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, + "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, + "license": "MIT", + "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", @@ -20398,13 +19530,10 @@ "license": "MIT" }, "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.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, "node_modules/scheduler": { "version": "0.23.2", @@ -20422,9 +19551,9 @@ "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -20441,9 +19570,9 @@ } }, "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==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -20501,22 +19630,22 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "license": "MIT", "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" + "@types/node-forge": "^1.3.0", + "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==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -20541,24 +19670,24 @@ } }, "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", "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" @@ -20579,6 +19708,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -20598,15 +19736,15 @@ } }, "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==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "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", "range-parser": "1.2.0" @@ -20619,25 +19757,21 @@ "license": "MIT" }, "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==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "license": "MIT", "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": { @@ -20659,41 +19793,25 @@ } }, "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==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "license": "MIT", "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==", + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", @@ -20701,6 +19819,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "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==", + "license": "ISC" + }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -20711,15 +19835,15 @@ } }, "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "~0.19.1" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -20819,9 +19943,9 @@ } }, "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==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -20929,9 +20053,9 @@ "license": "MIT" }, "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==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", "license": "MIT", "dependencies": { "@types/node": "^17.0.5", @@ -21014,12 +20138,12 @@ } }, "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==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "license": "BSD-3-Clause", "engines": { - "node": ">= 12" + "node": ">= 8" } }, "node_modules/source-map-js": { @@ -21090,9 +20214,9 @@ } }, "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==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -21145,34 +20269,20 @@ } }, "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "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==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "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" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -21183,21 +20293,38 @@ } }, "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.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "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", @@ -21239,9 +20366,9 @@ "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", "engines": { "node": ">=12" @@ -21251,12 +20378,12 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -21448,21 +20575,21 @@ } }, "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==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", "license": "MIT", "dependencies": { - "style-to-object": "1.0.14" + "style-to-object": "1.0.8" } }, "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==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.7" + "inline-style-parser": "0.2.4" } }, "node_modules/stylehacks": { @@ -21518,18 +20645,18 @@ "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", - "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "license": "MIT", "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", - "picocolors": "^1.0.0", - "sax": "^1.5.0" + "picocolors": "^1.0.0" }, "bin": { "svgo": "bin/svgo" @@ -21552,13 +20679,14 @@ } }, "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz", + "integrity": "sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.9" + "@pkgr/core": "^0.2.0", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -21568,26 +20696,22 @@ } }, "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "license": "MIT", "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==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -21599,14 +20723,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==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -21666,22 +20791,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "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", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -21701,23 +20810,20 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", - "license": "MIT", - "engines": { - "node": ">=18" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "fdir": "^6.4.3", + "picomatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" @@ -21727,14 +20833,11 @@ } }, "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==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -21745,9 +20848,9 @@ } }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { @@ -21758,9 +20861,9 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", + "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -21802,22 +20905,6 @@ "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/tree-sitter": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", @@ -21870,9 +20957,9 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { @@ -21897,24 +20984,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "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-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -22069,9 +21138,9 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -22083,16 +21152,15 @@ } }, "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==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.30.1.tgz", + "integrity": "sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==", "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" + "@typescript-eslint/eslint-plugin": "8.30.1", + "@typescript-eslint/parser": "8.30.1", + "@typescript-eslint/utils": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22102,14 +21170,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "license": "MIT" }, "node_modules/unbox-primitive": { @@ -22132,9 +21200,9 @@ } }, "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==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -22169,18 +21237,18 @@ } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "license": "MIT", "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==", + "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==", "license": "MIT", "engines": { "node": ">=4" @@ -22239,20 +21307,10 @@ "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -22260,10 +21318,9 @@ } }, "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", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -22312,13 +21369,13 @@ } }, "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==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -22360,13 +21417,6 @@ "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", @@ -22397,9 +21447,9 @@ } }, "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -22449,9 +21499,9 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -22464,9 +21514,9 @@ } }, "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==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -22496,9 +21546,9 @@ } }, "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.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -22588,9 +21638,9 @@ } }, "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==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -22717,6 +21767,35 @@ "uuid": "dist/esm/bin/uuid" } }, + "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": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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": "MIT", + "engines": { + "node": ">=6" + } + }, "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", @@ -22782,9 +21861,9 @@ } }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -22817,9 +21896,9 @@ } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -22830,9 +21909,9 @@ } }, "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==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, @@ -22855,13 +21934,13 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -22957,9 +22036,9 @@ "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==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "license": "MIT" }, "node_modules/walk-up-path": { @@ -22970,9 +22049,9 @@ "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==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -23008,36 +22087,34 @@ "license": "MIT" }, "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==", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", + "@types/estree": "^1.0.6", "@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", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.20.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.17.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", "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": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -23091,57 +22168,47 @@ } }, "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==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "license": "MIT", "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/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==", + "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/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==", + "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.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": { @@ -23154,52 +22221,54 @@ } }, "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==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", "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/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.5", "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", + "launch-editor": "^2.6.0", + "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.4", + "ws": "^8.13.0" }, "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": { @@ -23210,40 +22279,10 @@ } } }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -23276,9 +22315,9 @@ } }, "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==", + "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==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -23328,30 +22367,75 @@ } }, "node_modules/webpackbar": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", - "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "license": "MIT", "dependencies": { - "ansis": "^3.2.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", "pretty-time": "^1.1.0", - "std-env": "^3.7.0" + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=14.21.3" }, "peerDependencies": { - "@rspack/core": "*", "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/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" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/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", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/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==", + "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/websocket-driver": { @@ -23467,9 +22551,9 @@ } }, "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.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { @@ -23578,9 +22662,9 @@ } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", "engines": { "node": ">=12" @@ -23590,9 +22674,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==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "license": "MIT", "engines": { "node": ">=12" @@ -23602,12 +22686,12 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" @@ -23620,7 +22704,6 @@ "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" }, "node_modules/write-file-atomic": { @@ -23636,9 +22719,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==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -23656,36 +22739,6 @@ } } }, - "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", @@ -23717,19 +22770,16 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">= 14" } }, "node_modules/yocto-queue": { diff --git a/docs/package.json b/docs/package.json index da9745fe..a48fe5ef 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,15 +15,15 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^3.10.1", - "@docusaurus/preset-classic": "^3.10.1", - "@docusaurus/theme-mermaid": "^3.10.1", + "@docusaurus/core": "^3.8.0", + "@docusaurus/preset-classic": "^3.8.0", + "@docusaurus/theme-mermaid": "^3.8.0", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^3.1.0", "classnames": "^2.2.6", - "js-yaml": "^4.1.1", + "js-yaml": "^4.1.0", "react": "^18.0.0", "react-async": "^10.0.1", "react-copy-to-clipboard": "^5.0.3", @@ -45,27 +45,27 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", - "@eslint/js": "^9.39.2", + "@docusaurus/module-type-aliases": "^3.6.3", + "@docusaurus/tsconfig": "^3.6.3", + "@docusaurus/types": "^3.6.3", + "@eslint/js": "^9.23.0", "@types/glob": "^8.1.0", "@types/js-yaml": "^4.0.5", "@types/react": "^18.3.12", "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", - "eslint": "^9.39.2", - "eslint-plugin-mdx": "^3.6.2", + "eslint": "^9.23.0", + "eslint-plugin-mdx": "^3.3.2", "eslint-plugin-react": "^7.37.5", - "globals": "^17.6.0", + "globals": "^16.0.0", "json-schema-to-typescript": "^15.0.3", "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": "^3.4.2", + "string-replace-loader": "^3.1.0", + "typescript": "^5.7.2", + "typescript-eslint": "^8.30.1", + "webpack": "^5.97.1" } } diff --git a/docs/sidebars.js b/docs/sidebars.js index 167527f5..3d55192b 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -13,7 +13,6 @@ module.exports = { "faq", "user-setup", "customization", - "zmk-cli", { type: "category", label: "Troubleshooting", @@ -38,7 +37,6 @@ module.exports = { "features/split-keyboards", "features/debouncing", "features/battery", - "features/led-indicators", "features/low-power-states", "features/encoders", "features/pointing", @@ -107,7 +105,6 @@ module.exports = { "keymaps/input-processors/transformer", "keymaps/input-processors/code-mapper", "keymaps/input-processors/temp-layer", - "keymaps/input-processors/behaviors", ], }, ], @@ -124,77 +121,56 @@ module.exports = { "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: "Hardware Integration", + link: { + type: "doc", + id: "development/hardware-integration/index", + }, + collapsed: true, + items: [ + "development/hardware-integration/new-shield", + "development/hardware-integration/physical-layouts", + "development/hardware-integration/hardware-metadata-files", + "development/hardware-integration/pinctrl", + "development/hardware-integration/dongle", + "development/hardware-integration/shift-registers", + "development/hardware-integration/encoders", + "development/hardware-integration/soft-off-setup", + "development/hardware-integration/pointing", + "development/hardware-integration/battery", + { + type: "category", + label: "Lighting", + link: { + type: "doc", + id: "development/hardware-integration/lighting/index", + }, + collapsed: true, + items: [ + "development/hardware-integration/lighting/underglow", + "development/hardware-integration/lighting/backlight", + ], + }, + ], + }, { type: "category", label: "Contributing", @@ -232,10 +208,8 @@ module.exports = { }, "development/module-creation", "development/usb-logging", - "development/devicetree", "development/studio-rpc-protocol", "development/new-behavior", - "development/events", ], }, ], diff --git a/docs/src/components/hardware-list.tsx b/docs/src/components/hardware-list.tsx index e027df3b..92cca32b 100644 --- a/docs/src/components/hardware-list.tsx +++ b/docs/src/components/hardware-list.tsx @@ -84,34 +84,6 @@ function HardwareList({ items }: HardwareListProps) { 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 +93,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 +101,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/css/custom.css b/docs/src/css/custom.css index a0150549..e41a8bce 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -7,44 +7,26 @@ /* 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 { + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); } .video-container { diff --git a/docs/src/data/footnotes.js b/docs/src/data/footnotes.js index 5b7ccab2..af041390 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"; 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..1bca99bf 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: [ @@ -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: {}, @@ -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/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..33a4be38 --- /dev/null +++ b/docs/src/templates/setup.ps1.mustache @@ -0,0 +1,313 @@ +# 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}} + } + + $boards_revisions = [ordered]@{ + {{#boards}} + {{id}} = @({{#revisions}} + "{{.}}"{{/revisions}}); + {{/boards}} + } + + $boards_default_revision=[ordered]@{ + {{#boards}} + {{id}} = "{{{default_revision}}}"; + {{/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 ) + + if ($($($boards_revisions.values)[$choice]).count -gt 0) { + $valid_revisions = $($($boards_revisions.values)[$choice]) + $revision_choices = @() + $valid_revisions + + for ($i = 0; $i -lt $valid_revisions.count; $i += 1) { + if ($valid_revisions[$i] -eq $($($boards_default_revision.values)[$choice])) { + $revision_choices[$i] += " (default)" + } + } + + $revision_choice = Get-Choice-From-Options -Options $revision_choices -Prompt $prompt + $board = $board + "@" + $valid_revisions[$revision_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 available 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..49b2ee22 --- /dev/null +++ b/docs/src/templates/setup.sh.mustache @@ -0,0 +1,304 @@ +#!/usr/bin/env 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}}) + + boards_revisions=({{#boards}}"{{#revisions}}{{.}} {{/revisions}}" {{/boards}}) + boards_default_revision=({{#boards}}"{{{default_revision}}}" {{/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 + + if [ -n "${boards_revisions[$board_index]}" ]; then + read -a _valid_revisions <<< "${boards_revisions[$board_index]}" + + _rev_choices=("${_valid_revisions[@]}") + for (( _i=0; _i<${#_valid_revisions}; _i++ )); do + if [ "${boards_default_revision[board_index]}" = "${_valid_revisions[_i]}" ]; then + _rev_choices[_i]+=" (default)" + fi + done + + echo "" + echo "MCU Board Revision:" + select opt in "${_rev_choices[@]}" "Quit"; do + case "$REPLY" in + ''|*[!0-9]*) echo "Invalid option. Try another one."; continue;; + + $(( ${#_valid_revisions[@]}+1 )) ) echo "Goodbye!"; exit 1;; + *) + if [ $REPLY -gt $(( ${#_valid_revisions[@]}+1 )) ] || [ $REPLY -lt 0 ]; then + echo "Invalid option. Try another one." + continue + fi + + _rev_index=$(( $REPLY-1 )) + board="${board_ids[$board_index]}@${_valid_revisions[_rev_index]}" + boards=( "${board}" ) + break + ;; + esac + done + fi +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 determining 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/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 index 1de2aba9..b73cf170 100644 --- a/docs/static/_redirects +++ b/docs/static/_redirects @@ -10,18 +10,16 @@ /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/boards-shields-keymaps /docs/development/hardware-integration/boards-shields-keymaps 301 +/docs/development/hardware-metadata-files /docs/development/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/new-shield /docs/development/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 +/docs/development/hardware-integration/studio-setup /docs/development/hardware-integration/physical-layouts 301 +/docs/keymaps/behaviors/mod-tap /docs/keymaps/behaviors/hold-tap#mod-tap \ No newline at end of file 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/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/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 85ba0c93..e574ca8c 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -16,7 +16,7 @@ "$defs": { "id": { "type": "string", - "pattern": "^[a-z0-9_/]+(@([A-Z]|[0-9]+|([0-9]+(\\.[0-9]+){1,2})))?$" + "pattern": "^[a-z0-9_]+(@([A-Z]|[0-9]+|([0-9]+(\\.[0-9]+){1,2})))?$" }, "revision": { "type": "string",